추상 클래스(Abstract class)와 인터페이스(Interface)의 차이 및 존재 이유를 설명해주세요.
클래스는 크게 일반 클래스와 추상 클래스로 나뉘는데 추상 클래스는 클래스 내 '추상 메소드'가 하나 이상 포함되거나 abstract로 정의된 경우를 말합니다. 반면 인터페이스는 모든 메소드가 추상 메소드인 경우입니다. (자바 8에서는 default키워드를 이용해서 일반 메소드의 구현도 가능합니다.)
두 개념의 차이는 너무 명확하지만, 하는 일은 비슷합니다
추상 클래스와 인터페이스는 상속받는 클래스 혹은 구현하는 인터페이스 안에 있는 추상 메소드를 구현하도록 강제한다.
이 '하는 일'을 한번 생각해보면 결국 추상 메소드를 구현하는 건데, 그렇다면 추상 클래스 하나만 존재하되, 추상 클래스 안에 추상 메소드를 여러 개 두거나 혹은 전부 추상 메소드만 두면 될 텐데 왜 인터페이스가 존재하는 것일까?
결론부터 말하자면 인터페이스와 추상 클래스는 존재 목적이 다릅니다. 추상 클래스는 그 추상 클래스를 상속받아서 기능을 이용하고, 확장시키는 데 있습니다. 반면에 인터페이스는 함수의 껍데기만 있는데, 그 이유는 그 함수의 구현을 강제하기 위해서 입니다. 구현을 강제함으로써 구현 객체의 같은 동작을 보장할 수 있습니다.
이렇게 애매하지만 명확하게 다른 존재 이유가 있는데, 서로 상호 보완적인 면이 있는건 무엇일까요?
이는 자바가 다중 상속을 지원하지 않기 때문입니다. 다중 상속은 아래와 같이 여러 개의 슈퍼클래스를 두는 것을 말합니다.
class MyVehicle extends car, plane {
@Override
public void goTo() {
super.drive();
}
}
위와 같은 코드에서 car, plane 클래스 모두 drive() 라는 메소드를 가지고 있다면, 어떤 메소드가 실행될까요? 애매합니다..
이것이 바로 다중 상속의 모호성입니다. 이 다중 상속의 모호성 때문에 자바는 과감하게 다중 상속을 못하도록 해버렸습니다.
이와는 다르게 인터페이스는 아래와 같이 여러 개의 인터페이스를 구현할 수 있습니다.
class car implements vehicle, engine
@Override
public void drive() {
@doSomething
}
}
마치 여러 개를 상속받는 것처럼 보입니다. 그래서 추상 클래스의 상속과 헷갈리죠. 이렇게 외관상 헷갈리게 생긴 것 말고도, 둘 다 추상 메소드를 가지고 있다는 점 때문에 인터페이스가 다중 상속의 문제점을 해결하기 위해 존재한다는 오해를 사기도 합니다.
이 오해를 풀기 위해서는 다시 한번 두 개념의 존재 이유를 되새겨 볼 필요가 있습니다.
상속은 슈퍼클래스의 기능을 이용하거나 확장하기 위해서 사용되고, 다중 상속의 모호성 때문에 하나만 상속받을 수 있습니다.
반면 인터페이스는 해당 인터페이스를 구현한 객체들에 대해서 동일한 동작을 약속하기 위해 존재합니다.
개념참고
http://alecture.blogspot.kr/2011/05/abstract-class-interface.html
출처
'Languages | Frameworks > Java' 카테고리의 다른 글
암호화 알고리즘 종류와 추천(SHA, PBKDF2, Bcrypt) + Java 적용 샘플 (0) | 2022.07.18 |
---|---|
게시판 글이 중간에 삭제시 > 번호 초기화후 인덱싱 하는 방법 (0) | 2022.07.13 |
Optional이란? (0) | 2021.09.17 |
Static 응용 - 싱글톤 패턴(singleton pattern) (0) | 2021.06.03 |
static 변수 (0) | 2021.06.03 |