인터페이스 vs 추상클래스1️⃣ 추상클래스추상메서드추상클래스 규칙2️⃣ 인터페이스인터페이스의 규칙인터페이스의 다중상속3️⃣ 추상 클래스 / 인터페이스 공통점왜 두가지로 나눠서 사용하는 것일까?4️⃣ 추상 클래스 / 인터페이스 차이점사용용도의 차이점접근자다중 상속 여부사용 의도5️⃣ 결론추상클래스인터페이스6️⃣ REF
인터페이스 vs 추상클래스
1️⃣ 추상클래스
- 일반 클래스와 크게 다를 것은 없지만 단지, 추상 메서드를 선언하여 상속을 통해 자손 클래스에서 완성하도록 유도하는 클래스이다.
- 클래스를 설계도라고 표현한다면 추상 클래스는 미완성 설계도로 표현할 수 있다.
- 같은 크기의 TV라도 기능의 차이에 따라 여러 종류의 모델이 있지만 설계도 90은 동일할테니 어느정도 틀을 갖춘 상태에서 진행하는 것이 좋으며 이때 추상 클래스를 사용할 수 있다.
- 추상클래스 자체는 미완성 설계도이기 때문에 그 자체만으로는 객체를 생성할 수 없다.
// abstract 키워드를 붙여주어야 합니다. abstract class 클래스이름 { }
추상메서드
- 메서드의 선언부만 작성하고 구현부는 작성하지 않은 채로 남겨둔 메서드를 말한다.
- 추상 메서드는 상속받는 클래스에 따라 달라질 수 있다.
abstract class AbstractA { abstract void method(); }
추상클래스 규칙
- 추상 클래스 키워드는
abstract
를 붙여서 표현한다. - 추상 메서드를 포함하지 않은 클래스 에서도
abstract
키워드를 붙여서 추상클래스로 지정할 수 있다.
- 클래스를 abstract로 지정하면 new를 통해 객체를 직접 생성할 수 없다.
- 메서드에 abstract를 사용할 경우 interface의 메서드와 같이 구현 부분이 없다.
- abstract로 선언한 메서드를 자식 클래스에서 필수적으로 구현해야 한다.(오버라이딩)
- 이는 자식 클래스에서 추상 메서드를 반드시 구현하도록 강제하는 것이다.
public abstract class Player { boolean pause; int currentPos; public Player() { this.pause = false; this.currentPost = 0; } abstract void play(int pos); abstract void stop(); void pause() { if(pause) { pause = false; play(currentPos); } else { pause = true; stop() } } } // 구현체 // 상속받은 메서드 외에 필드나 메서드 추가로 작성이 가능하다. public class Melon extends Player { @Override void play(int pos) { // 구현 } @Override void stop() { // 구현 } }
2️⃣ 인터페이스
- 인터페이스는 일종의 추상 클래스로 추상 메서드를 갖지만 추상 클래스보다 추상화 정도가 높다.
- 추상 클래스와 달리 몸통을 갖춘 일반 메서드, 멤버 변수를 구성원으로 가질 수 없다.
- 추상 클래스를 미완성 설계도라 한다면 인터페이스는 구현된 것은 아무것도 없는 밑그림만 그려진 기본 설계도라고 할 수 있다.
- 인터페이스도 추상 클래스처럼 다른 클래스를 작성하는데 도움을 주는 목적으로 작성하고 클래스와 다르게 다중상속이 가능하다.
// 인터페이스는 추상메서드만 허용하기 때문에 abstract 키워드는 생략이 가능하다. // 정적 메서드는 static를 붙이거나 default 키워드를 붙여서 메서드 작성은 가능하다. interface 인터페이스이름 { void method(); }
인터페이스의 규칙
- 추상 클래스처럼 불완전한 것이기 때문에 그 자체만으로 사용 되기 보다, 다른 클래스를 작성하는데 도움을 줄 목적으로 작성된다.
- 일반 메서드 또는 멤버 변수를 구성원으로 가질 수 없다.

- 모든 멤버 변수는 public static final 이어야 하며, 이를 생략할 수 있다.
- 인터페이스 변수는 아무 인스턴스도 존재하지 않는 시점이기 때문에 스스로 초기화 될 권한이 없다. 그렇기 때문에 public static final를 사용해 구현 객체의 같은 상태를 보장한다.

- 모든 메서드는 public abstract 이어야 하며, 이를 생략할 수 있다.
- 단 JDK1.8부터 static 메서드와 default 메서드를 사용할 수 있다.

인터페이스의 다중상속

- 인터페이스는 abstract 메서드만을 가지고 있으며 이를 상속할 경우 상속하는 클래스에서 무조건 그 메서드를 구현해주어야 한다.
- 이 경우 다중 상속하고 있는 인터페이스들에 동일한 메서드가 존재 한다면 구현하는 클래스에서는 하나만 오버라이드 해주면 된다.
- 하지만 메서드 파라미터 정보가 다르면 오버로딩처럼 여러개 구현을 해야한다.


- 그런데 이제 인터페이스에서 default 메서드를 구현할 수 있는데 두개의 인터페이스를 다중 상속하는 경우, 이 default 메서드가 중복이 되면 어떻게 될까?
- 상속받은 인터페이스들 중에서 중복으로된 메서드가 존재한다면 강제로 구현하도록 한다.

3️⃣ 추상 클래스 / 인터페이스 공통점
- 추상 클래스, 인터페이스 모두 가지고 있는 추상 메서드를 구현하도록 강제하며 인스턴스화가 불가능하다.
왜 두가지로 나눠서 사용하는 것일까?
- 이론적인 차이점을 다 제외한다면 두개로 나눠서 사용하는 가장 큰 차이점은 사용용도로 볼 수 있다 !
4️⃣ 추상 클래스 / 인터페이스 차이점
사용용도의 차이점
- 추상클래스는 IS -A “~ 이다.”
- 인터페이스는 HAS -A “~을 할 수 있는”
- 이렇게 구분되는 이유는 다중상속의 여부에 따라 용도를 정한 것 같다.
- 자바의 특성으로 한개의 클래스만 상속이 가능하여 해당 클래스의 구분은 추상클래스를 통해 해결하고, 할 수 있는 기능들은 인터페이스로 구현한다.
접근자
- 인터페이스에서 모든 변수는
public static final
만 가능하고 메서드는public abstract
만 가능하다.
- 추상 클래스는
static
이나final
이 아닌 필드를 가질 수 있고,public, protected, private
모두 가질 수 있다.
다중 상속 여부
- 인터페이스를 구현하는 클래스는 다른 여러개의 인터페이스를 함게 구현이 가능하다.
- 자바에서는 다중상속을 지원하지 않기 때문에 여러 추상클래스를 상속할 수 없다.
사용 의도
- 추상클래스는 이를 상속할 각 객체들의 공통점을 찾아 추상화 시켜 놓은 것이다.
- 상속 관계를 타고 올라갔을 때 같은 부모 클래스를 상속하며 부모가 클래스가 가진 기능들을 구현해야 할 경우 사용한다.
- 인터페이스는 상속관계를 타고 올라갔을 때 다른 조상 클래스를 상속하더라도, 같은 기능이 필요한 경우 사용한다.
- 클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용한다.

- Creture - 가장 상위 부모클래스로 추상클래스이다.
- Animal - Creture를 상속받으며 먹을 수 있기 때문에 먹는다 라는 인터페이스를 구현한다.
- 강지 - Animal을 상속받은 클래스로 먹는다를 구현한다.
- Human - Animal을 상속 받은 추상 클래스로 인간은 또 말을 할 수 있기 대문에 말하다 라는 인터페이스를 구현한다.
- 형욱 - 개발자라는 타입을 가질 수 있기 때문에 개발자라는 인터페이스를 구현하고 그 안에 메서드들도 구현이 가능하다.
- Plant - Creture를 상속받으며 별다른 스스로 먹이를 찾아서 먹을 수 없기 때문에 먹는다 라는 인터페이스를 구현하지 않았다.
- 장미 - 장미는 먹는다 라는 행위를 할 수 없다.
- 파리지옥 - 파리지옥은 파리를 먹을 수 있기 때문에 먹는다라는 행위를 구현할 수 있다.
Creture에 먹는다를 만들면 간단해 보이지만 Plant는 여기서 먹는다 라는 행위를 할 수 없기 때문에 이런 경우 인터페이스를 통해서 각각 먹는 행위를 할 수 있는 클래스에 implements를 해주면 가독성이 올라가며 유지보수 또한 쉬워진다.
5️⃣ 결론
추상클래스
- 관련성이 높은 클래스 간에 코드를 공유하고 싶은 경우
- 추상 클래스를 상속 받을 클래스들이 공통으로 가지는 메서드와 필드가 많거나, public이외에 접근자 선언이 필요한 경우
- non-static, non-final 필드 선언이 필요한 경우 (각 인스턴스에서 상태 변경을 위한 메서드가 필요한 경우)
인터페이스
- 서로 관련성이 없는 클래스들이 인터페이스를 구현하게 되는 경우
- Comparable, Clonable 인터페이스는 여러 클래스들에서 구현되지만 구현클래스들 간에 관련성은 없다.
- 특정 데이터 타입의 행동을 명시하고 싶은데, 어디서 그 행동이 구현되는지 신경쓰지 않는 경우
- 다중상속을 허용하고 싶은 경우