Backend/Java

추상클래스와 인터페이스

간지나제 2021. 6. 11. 14:05

인터페이스는 클래스를 구현하기 전에 설계하거나 다형성을 고려할 때 쓰곤 했는데 추상클래스는 구현된 것을 보기만 했을 뿐 잘 써본 적이 없다.
인터페이스와 추상클래스는 비슷하다는 느낌을 가지고 있었기에 더욱 쓰지 않았던 것 같다.
이참에 한 번 정리해보자.

Interface란?

인터페이스는 한 마디로 설계도라고 생각하면 될 것 같다.
모든 메서드가 추상메서드이고, 일반 변수를 가질 수 없다.(선언하면 public static final 변수, 생략가능)
인터페이스를 구현하는 클래스는 모든 메서드를 강제로 구현해야한다.
다른 인터페이스로부터 상속 받을 수 있고, 다중 상속이 가능하다.

interface Vehicle {
    void run(); // interface 예약어를 쓰면 abstract는 생략 가능하다.
    void move();
}

추상 클래스란?

추상 클래스는 0개 이상의 추상 메서드를 가지는 클래스이다.(추상 메서드가 없어도 된다. 하지만 추상 메서드가 있으면 추상 클래스여야 한다.)
추상메서드를 하나라도 가지면 상속받는 자식 입장에서 추상 메서드를 모두 구현해야한다.

abstract class Animal {
    abstract boid bark();
    void feed() {
        // do Somtehing
    }    
}

Interface와 추상클래스의 공통점

  1. 인스턴스화할 수 없다.
  2. 둘 다 상속을 위해 존재한다.

Interface와 추상클래스의 차이점

  1. 인터페이스는 implemnts 키워드를, 추상클래스는 extends키워드로 상속한다.
  2. 추상 클래스는 확장, 상속의 개념이 강하다. 부모-자식 관계로 물려주는 개념이 된다.(feed메서드는 부모가 가지고 있는 속성이기에 구현하지 않아도 된다.)
    반면, 인터페이스는 동일한 행위(메서드)에 대해 구현을 강제한다.
  3. 추상 클래스는 클래스이다 보니 extends로 단일 상속만 되고 implements는 다중 상속(구현)이 가능하다.
  4. 추상 클래스는 상속의 개념이, 인터페이스는 구현의 느낌을 생각을 가지면 될 것 같다.
    예를 들어, 추상 클래스는 상속 받는 클래스들의 공통 속성 및 메서드를 지정할 수 있고 자식이 각자 구현할 것들만 추상메서드를 만들면 된다.
    반면, 인터페이스는 서로 관련 없는 클래스들이 인터페이스에 있는 메서드를 구현하는 느낌이다.(Comparable, Clonable 등)
  5. 추상 클래스는 팩토리 메서드 패턴(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