추상 클래스와 인터페이스는 모두 인스턴스화 (new)를 할 수 없다는 공통점이 있다.
추상 클래스와 인터페이스의 차이점은 ?
|
추상 클래스 |
인터페이스 |
추상이 아닌 메소드 |
가질 수 있음 |
모든 메서드가 추상 메서드 |
인스턴스 변수 선언 |
가능 |
불가능, static final 은 가능 |
생성자 |
정의 가능 |
정의 불가 |
가시성 차이점
구분 |
인터페이스 멤버 (메서드) |
추상 클래스 멤버 (메서드, 변수) |
인터페이스 자체 |
추상클래스 자체 |
Public |
기본적으로 적용 |
명시적으로 지정 가능 |
명시적으로 지정 가능 |
명시적으로 지정 가능 |
Protected |
불가능 |
지정 가능 |
불가능 |
지정 가능 |
Private |
자바 9+에서 내부 구현을 위해 지정 가능 |
지정 가능 |
불가능 |
지정 가능 |
Package-private |
패키지 내에 선언 시 자동 적용 (명시적으로 public이 아닐 경우) |
패키지 내에 선언 시 자동 적용(명시적으로 public, protected, private이 아닐 경우) |
패키지 내에 선언 시 자동 적용 (명시적으로 public이 아닐 경우) |
패키지 내에 선언 시 자동 적용 (명시적으로 public, protected, private이 아닐 경우) |
추상 클래스와 인터페이스는 언제 사용할까?
추상 클래스를 사용하는 경우
추상 클래스는 일부 메서드를 구현할 수 있으므로 여러 클래스에 걸쳐 공통으로 사용될 수 있는 기본 동작이 있을 때, 하위 클래스에 특정 메서드나 필드가 반드시 있어야 할 때 사용된다.
인터페이스를 사용하는 경우
서로 다른 클래스들이 같은 동작을 하길 원하지만, 그 동작이 각 클래스마다 완전히 다르게 구현되어야 할 때.
다중 상속 효과를 내고 싶을 때 (자바와 같은 언어에서는 다중 상속을 지원하지 않으므로).
구현 로직에 상관없이, 단순히 메서드의 시그니처만 공개하고 싶을 때 사용된다.