본문 바로가기

CS/JAVA

Abstract Class와 Interface

Abstract Class와 Interface를 상속 또는 구현하려는 클래스는 이들이 명시한 추상 메서드들을 모두 구현해야 사용할 수 있다.  추상 메서드를 가진 추상 클래스와 인터페이스. 이들이 가지고 있는 공통점이지만 과연 차이점은 무엇일까? 무엇 때문에 이 둘을 나눠 놓았을까? Abstract Class와 Interface의 특성과 차이점 그리고 언제 사용해야 하는지에 대해 알아보도록 하자.

※추상화 : 기능의 내부 구현을 숨기고 사용자에게 기능만을 명시하는 것을 의미함


Abstract Class

public abstract class Animal {
    
    //field
    public String name;
    public String kind;
    
    //method
    public abstract sound();
}

 

실체화 가능한 클래스들의 공통적인 특성을 가져와서 명시만 한 클래스로 추상 클래스와 실체 클래스는 상속의 관계를 가지고 있다. 

  • Abstract Class  자체적으로는 인스턴스를 생성할 수 없고 상속을 통해서만 구체화할 수 있다.
  • Abstract Class를 상속받은 클래스는 Abstract 메서드를 반드시 Override 해서 구현해야 한다.
  • Abstract Class는 상속, 확장의 개념이 크다.
  • Abstract Class는 Interface를 구현할 수 있다.

Interface

public interface Car {

    final int MAX_BATTERY = 100;
    
    void start();
    void stop();
    void charge();
    void turnOn();
    void turnOff();
    void chargeFuel();
}

Interface는 객체의 사용 방법을 정의한 타입이다. 해당 인터페이스를 구현한 객체들에 대한 동일한 사용방법과 동작을 보장하기 위해 사용하며 설계도라고 보면 될 것 같다.  위의 예처럼 Car에 필요한 기능들을 명시해놓고 해당 Interface를 구현하는 클래스들은 Interface의 메서드들을 모두 구현하면 된다. 즉, 특정 객체가 Interface를 구현한다면 해당 객체는 Interface의 모든 기능을 갖추고 있고, 인터페이스를 통해 해당 객체를 제어할 수 있다.

  • 다중 상속이 가능하다.
  • 추상 메서드들을 모두 Override 하지 않으면 사용할 수 없다.
  • Abstract Class를 구현할 수 없다.
  • Interface에 선언된 변수는 기본적으로 final이다.
  • Interface는 Abstract Class를 상속받을 수 없다.

※Java8부터 Interface에 static 메서드와 default 메서드가 사용 가능해짐으로써 공통되는 기능의 구현을 통해 코드를 간결하게 했다.

Abstract Class VS Interface

앞서 Abstract Class와 Interface의 특성에 대해 알아보았다. 둘의 공통적인 특징은 Abstract Method를 가지고 있고 이들을 상속하는 클래스는 모든 Abstract Class를 구체화해야 한다. 똑같이 추상화 메서드를 구체화하기만 한다면 Interface를 Abstract Class로 만들어도 되지 않을까? Abstract Class와 Interface를 나눈 것은 특징적인 차이가 아니라 사용법에 차이가 있다. 가장 큰 차이는 다중 상속 지원 여부이다.(Interface는 구현이지만 상속이라고 표현하겠다.)

 

상속이라는 개념에서 먼저 접근해보자. 상속은 코드의 재사용성을 높이기 위해서 사용한다.

상속에서 클래스 간의 관계는 IS-A 관계를 따른다.

IS-A HAS-A
A는 B이다. A는 B에 속한다(가지고 있다). is able to
상속의 개념 구성의 개념
둘 이상의 클래스를 상속할 수 없음 다중 구현 가능
클래스 간 강한 결합도 클래스 간 약한 결합도

상속의 개념이 강한 Abstract Class는 IS-A관계가 적합하지만 Interface의 경우 Has-A관계가 적합하다. 

즉, 상속 개념은 상위 클래스로 갈수록 추상화되어있고, 하위 클래스로 갈수록 구체화된다. 반면, 구현 개념의 인터페이스는 able의 개념이 들어있어 '기능을 가지고 있다.' 정도의 의미를 가지고 있어 클래스 간에 약한 결합도를 보이고 다중 구현이 가능하다.

 

Abstract Class와 Interface를 이해하기 쉽게 그려 보았다. Bicycle과 MotorCycle, Car라는 추상 클래스 모두 이동수단이라는 추상 클래스를 상속한다. 각각의 추상 클래스들은 필요에 따라 자신에게 맞는 인터페이스를 구현하였고 구체화된 클래스에서는 엔진 Interface를 구현하여 각각의 특성을 가진 클래스를 구성하였다. Interface 조차 Abstract Class로 구현하였다면 MotorCycle과 Car 클래스 간에 불필요한 코드의 중복이 발생할 것이다. 하지만 서로의 사용 의도를 분리함으로써 코드의 재사용성을 높였다.

 


참고하면 좋은 사이트

 

[JAVA] 추상클래스 VS 인터페이스 왜 사용할까? 차이점, 예제로 확인 :: 마이자몽

추상클래스 인터페이스 왜... 사용할까? 우리는 추상클래스와 인터페이스에 대해서 알고 있냐고 누가 물어본다면 알고 있다고 대답을 하고있습니다. 그런데 이론적인 내용 말고 정작 "왜 사용하

myjamong.tistory.com

 

'CS > JAVA' 카테고리의 다른 글

JAVA의 리플렉션 API  (0) 2023.01.08
[JAVA] String 그리고 StringBuffer와 StringBuilder  (0) 2022.08.30
Java에서의 Hash  (0) 2022.08.16
정적 팩토리 메서드(Static Factory Method)  (0) 2022.07.31
JVM 구조  (0) 2022.07.25