추상클래스 && 인터페이스
추상클래스는 abstract 라는 키워드와 함께 선언된 클래스예요. (추상 메소드를 포함할 수도 있고 하지 않을 수도 있고). 추상클래스는 인스턴스화 될 수 없지만 상속될 수 있어요.
추상클래스를 상속받는 클래스에서는 일반적으로 부모클래스에 있는 모든 추상메소드들을 구현해야 해요. 그렇지 않은 경우엔 해당 서브클래스 또한 abstract 로 선언되어야 합니다.
추상클래스와 인터페이스 차이
추상클래스와 인터페이는 인스턴스로 만들지 못해요. 메소드 구현부가 있는 메소드와 없는 메소드 모두 가질 수 있어요.
인터페이스의 모든 변수엔 public static final , 메소드에는 public abstract가 붙어있어요.(생략가능)
추상클래스엔 static, final 이 아닌 변수를 가질 수 있고 public 외에 protected, private 접근지정자를 가질 수 있어요.
인터페이스를 구현하는 클래스는 여러개의 인터페이스를 구현할 수 있어요. 추상클래스는 상속을 통해 구현을 하는데 자바에서는 다중상속이 불가능해요. 따라서 추상클래스를 상속받은 클래스는 다른 클래스를 상속받을 수 없어요.
자바 8 부터의 인터페이스에선 디폴트 메서드를 가질 수 있어요. 이 디폴트 메서드는 같은 패키지 내에서만 접근이 가능해요.
추상클래스에서는 다양한 접근 제어자를 사용할 수 있어요. 만약 추상클래스를 인터페이스로 바꿔버리면 이 추상클래스가 서드파티 라이브러리로 제공 되는 경우 디폴트로 정의된 메소드의 구현부에 있는 내용을 사용할 방법이 없어요!
인터페이스가 디폴트 메서드를 (메서드 구현부)를 가질 수 있다고 해서 인터페이스가 추상클래스를 대체할 수 있는건 아니니 명심!
추상클래스와 인터페이스 사용 예
추상클래스
- 관련성이 높은 클래스 간에 코드를 공유하고 싶은 경우
- 상속받은 클래스들이 공통으로 가지는 메소드와 필드가 많거나 public 외의 접근지정자를 사용하고 싶을 때
- static,final 이 아닌 변수들을 선언이 필요한 경우! 즉 각 인스턴스에서 state 변경을 위한 메소드를 선언할 수 있어요
인터페이스
- 서로 관련성이 없는 클래스들이 인터페이스를 구현하게 되는 경우에 사용. 예를 들어 Comparable 인터페이스는 여러 클래스들에서 구현되는데 구현클래스들 간에 관련성이 없는 경우가 많다
- 다중상속을 허용하고 싶은 경우
- 특정 데이터 타입의 행동을 명시하고 싶은데, 그 행동이 어디서 구현되는지 알 필요 없는 경우