손영배 블로그 누구나 쉽게 이해하고 습득하기
그래서 추상클래스(abstract)와 인터페이스(interface)의 차이가 뭔데요? 본문
추상클래스와 인터페이스는 존재 목적이 다릅니다.
- 추상 클래스의 존재 목적은 추상 클래스를 상속받아서(extends) 기능을 이용하고, 확장시키는데 있습니다. (개발 소스를 동일하게 하고 시간절약이 목적)
- 인터페이스는 껍데기, 선언만 있고 내용은 없는 함수의 구현(implements)이 목적입니다. 인터페이스는 개발 코드와 객체가 서로 통신하는 접점 역할을 한다. 개발 코드가 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출시킨다. ----> 그렇기 때문에 개발코드 내부구조를 알 필요가 없고 인터페이스의 메소드만 알고 있으면 된다.
개발 코드가 직접 객체의 메소드를 호출하면 간단한데 왜 중간에 인터페이스를 두는지 의문점이 생긴다.? 그 이유는 개발 코드를 수정하지 않고, 사용하는 객체를 변경할 수 있도록 하기 위해서이다. 인터페이스는 하나의 객체가 아니라 여러 객체들과 사용이 가능하므로 어떤 객체를 사용하느냐에 따라서 실행 내용과 리턴값이 다를 수 있다. 따라서 개발 코드 측면에서는 코드 변경 없이 실행 내용과 리턴값을 다양화할 수 있다는 장점을 가지게 된다.
-여기서 위 두 가지 기능 모두 다 추상메소드 기능도 있고, default 메소드 기능도 쓸 수 있기 때문에 혼란이 올 수 있다. 이런 기능들 다 쓸 수 있으니까 두 가지다 차이가 없는거 아니야? 라고 생각이 든다
중요한 핵심은 자바는 다중 상속(extends)을 지원하지 않는다라는 걸 명심하자. 아래와 같이 여러 개의 슈퍼클래스를 두는 것이 안된다.
class MyVehicle extends Car, Plane {
@Override
public void goTo(){
...
}
}
Car, Plane 클래스 모두 driver() 라는 메소드를 가지고 있다면, 애매합니다. 이것이 바로 다중 상속의 모호성입니다. 이 다중 상속의 모호성때문에 자바는 과감하게 다중 상속을 못하도록 해버렸습니다.
이와는 다르게 인터페이스는 아래와 같이 여러 개의 인터페이스를 구현할 수 있습니다.
다시 한번 존재 목적 정리
- 추상클래스의 상속은 슈퍼클래스 부모클래스의 기능을 이용하거나 확장하기 위해서 사용되고, 다중 상속의 모호성 때문에 하나만 상속을 받을 수 있다.
- 인터페이스는 해당 인터페이스를 구현한 객체들에 대해서 동일한 동작을 약속하기 위해 존재합니다.
- 추상클래스와 인터페이스의 차이를 설명해달라는 질문은 외형적 차이(extends, implements) 와 상속이라는 개념과 다형성이라는 개념을 알고 있는지에 대한 질문이 되기도 한단다.
'Interview' 카테고리의 다른 글
try catch finally 실행순서 (0) | 2019.09.02 |
---|---|
JVM이 뭐에요? (0) | 2019.08.31 |
추상클래스(abstract) (0) | 2019.08.31 |
인터페이스(interface)란? (0) | 2019.08.31 |
제네릭이 무엇인가? (0) | 2019.08.30 |