[Java] abstract class vs interface
abstract class에 대해 공부하다가 interface와의 차이점이 궁금하여 작성하였다.
추상 클래스(Abstract class) vs 인터페이스(Interface)
추상 클래스(Abstract class)
먼저 추상 클래스(abstract class)는 클래스 내에 추상 메서드가 하나 이상 포함된 클래스를 말한다.
클래스 안에 메서드가 하나 이상 있다면 그 클래스 앞에는 반드시 abstract 클래스명으로 표기되어야 하며 abstract와 final 키워드를 동시에 표기할 수 없다.
일반 클래스에서 추상 클래스를 상속을 받는다면 추상메서드가 있을 경우 모두 구현해주어야 한다.
인터페이스(Interface)
반면 인터페이스(interface)는 모든 메서드가 추상 메서드인 경우이다.
간단히 생각하면 가이드만 주어진 기본 설계도라 생각하면 이해하기 쉬울 것 같다.
이렇게 보면 인터페이스의 존재 이유가 궁금해진다.
모든걸 추상 클래스로 만들면 인터페이스를 대체할 수 있는 것이 아닌가?
하지만 목적을 알고나면 각각의 필요성을 알 수 있다.
목적
- 추상 클래스: 상속받아서 기능을 이용하고 확장시키는데 목적이 있다. -> is a "~이다"
- 인터페이스: 함수의 구현을 강제하여 구현 객체의 동작을 보장시킨다. -> has a "~을 할 수 있는"
위 목적은 자바의 다중상속이 불가하다는 특징을 확인하면 더 명확히 파악할 수 있다.
먼저 자바는 다중상속을 하지 못하도록 되어있다.
class MyCar extends Diesel, Electric {
@Override
public void addFuel() {
super.addFuel();
}
}
Diesel과 Electric를 모두 상속한 상태를 가정하였다. 이 상황에서 addFuel 메서드를 호출한다면 어느 메서드가 호출되어야 하는가?
자바는 이렇게 다중상속으로 인해 발생하는 모호성 때문에 다중상속을 하지 못하도록 하였다.
이와 달리 인터페이스는 여러 개를 구현할 수 있다.
class Vehicle implements Engine, Wheel {
@Override
public void operate() {
// operate
}
@Override
public void go() {
// go
}
}
다중 상속을 한 것처럼 보일 수 있지만 추상클래스와 인터페이스의 목적을 다시 살펴보며 개념을 잘 정리해보자.
또한 인터페이스는 보통 다음과 같은 형태로 많이 구현된다. (출처: inflearn 스프링 핵심원리 - 김영한 중)
이와 같이 구현하면 변경에는 닫혀있고 확장에 열려있는 형태를 가져갈 수 있다.
요약
- 추상 클래스(abstract class): 기능을 이용하거나 확장하기 위해 사용 -> is a
- 인터페이스(interface): 구현한 객체들에 대한 동작들을 보장하기 위해 사용 -> has a
'Language > Java' 카테고리의 다른 글
[Java] "" vs new String("") (2) | 2023.03.19 |
---|---|
[Java] 아무 생각 없이 생성했는데 동일한 객체? (0) | 2023.03.09 |
[Java] stream vs for (1) | 2023.01.17 |
[Java] 3. Iterator (0) | 2022.08.17 |
[Java] 2. List (0) | 2022.08.12 |
댓글
이 글 공유하기
다른 글
-
[Java] "" vs new String("")
[Java] "" vs new String("")
2023.03.19 -
[Java] 아무 생각 없이 생성했는데 동일한 객체?
[Java] 아무 생각 없이 생성했는데 동일한 객체?
2023.03.09 -
[Java] stream vs for
[Java] stream vs for
2023.01.17 -
[Java] 3. Iterator
[Java] 3. Iterator
2022.08.17