추상 클래스와 인터페이스의 차이
추상 클래스(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
}
}
마치 여러 개를 상속받는 것처럼 보입니다. 그래서 추상 클래스의 상속과 헷갈리죠. 이렇게 외관상 헷갈리게 생긴 것 말고도, 둘 다 추상 메소드를 가지고 있다는 점 때문에 인터페이스가 다중 상속의 문제점을 해결하기 위해 존재한다는 오해를 사기도 합니다.
이 오해를 풀기 위해서는 다시 한번 두 개념의 존재 이유를 되새겨 볼 필요가 있습니다.
상속은 슈퍼클래스의 기능을 이용하거나 확장하기 위해서 사용되고, 다중 상속의 모호성 때문에 하나만 상속받을 수 있습니다.
반면 인터페이스는 해당 인터페이스를 구현한 객체들에 대해서 동일한 동작을 약속하기 위해 존재합니다.
그래서 '추상 클래스(Abstract class)와 인터페이스(Interface)의 차이 및 존재 이유를 설명해주세요.'라는 질문은 비단 외형적인 차이뿐만 아니라 상속이라는 개념과 다형성이라는 개념을 알고 있는지에 대한 질문이 되기도 합니다.
하지만 저는 일전에 있던 면접에서, 외형적인 차이만 설명하였습니다... ㅠ_ㅠ
이 글을 보는 분들은 이 개념을 반드시 알고 가셨으면 좋겠습니다 ^^
http://alecture.blogspot.kr/2011/05/abstract-class-interface.html
아래 URL은 광고입니다. 도움이 되셨다면 클릭 부탁드려요 :D
파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있습니다.