인터페이스는 클래스를 구현하기 전에 설계하거나 다형성을 고려할 때 쓰곤 했는데 추상클래스는 구현된 것을 보기만 했을 뿐 잘 써본 적이 없다.
인터페이스와 추상클래스는 비슷하다는 느낌을 가지고 있었기에 더욱 쓰지 않았던 것 같다.
이참에 한 번 정리해보자.
Interface란?
인터페이스는 한 마디로 설계도라고 생각하면 될 것 같다.
모든 메서드가 추상메서드이고, 일반 변수를 가질 수 없다.(선언하면 public static final 변수, 생략가능)
인터페이스를 구현하는 클래스는 모든 메서드를 강제로 구현해야한다.
다른 인터페이스로부터 상속 받을 수 있고, 다중 상속이 가능하다.
interface Vehicle {
void run(); // interface 예약어를 쓰면 abstract는 생략 가능하다.
void move();
}
추상 클래스란?
추상 클래스는 0개 이상의 추상 메서드를 가지는 클래스이다.(추상 메서드가 없어도 된다. 하지만 추상 메서드가 있으면 추상 클래스여야 한다.)
추상메서드를 하나라도 가지면 상속받는 자식 입장에서 추상 메서드를 모두 구현해야한다.
abstract class Animal {
abstract boid bark();
void feed() {
// do Somtehing
}
}
Interface와 추상클래스의 공통점
- 인스턴스화할 수 없다.
- 둘 다 상속을 위해 존재한다.
Interface와 추상클래스의 차이점
- 인터페이스는 implemnts 키워드를, 추상클래스는 extends키워드로 상속한다.
- 추상 클래스는 확장, 상속의 개념이 강하다. 부모-자식 관계로 물려주는 개념이 된다.(feed메서드는 부모가 가지고 있는 속성이기에 구현하지 않아도 된다.)
반면, 인터페이스는 동일한 행위(메서드)에 대해 구현을 강제한다. - 추상 클래스는 클래스이다 보니 extends로 단일 상속만 되고 implements는 다중 상속(구현)이 가능하다.
- 추상 클래스는 상속의 개념이, 인터페이스는 구현의 느낌을 생각을 가지면 될 것 같다.
예를 들어, 추상 클래스는 상속 받는 클래스들의 공통 속성 및 메서드를 지정할 수 있고 자식이 각자 구현할 것들만 추상메서드를 만들면 된다.
반면, 인터페이스는 서로 관련 없는 클래스들이 인터페이스에 있는 메서드를 구현하는 느낌이다.(Comparable, Clonable 등) - 추상 클래스는 팩토리 메서드 패턴(Factory Method Pattern)을 보면 이해에 도움이 된다.
https://mygumi.tistory.com/257
https://johngrib.github.io/wiki/factory-method-pattern/
https://yaboong.github.io/java/2018/09/25/interface-vs-abstract-in-java8/
https://cbw1030.tistory.com/47
'Backend > Java' 카테고리의 다른 글
Reflection(리플렉션) (0) | 2022.08.08 |
---|---|
직렬화 (0) | 2021.06.12 |
try-with-resources (1) | 2021.06.08 |
Generics (0) | 2021.04.27 |
Java 버전별 특징 (0) | 2021.04.27 |