abstract class와 interface에 대한 짧은 정리
객체지향 프로그래밍에서 상속은 extends, implements 두 가지 방법으로 이루어진다.
일반적인 클래스 상속은 논외로 하고
abstract class와 interface에 대해 짧게 정리를 하고자 한다.
1. abstract class (추상 클래스)
abstract 키워드를 사용해서 정의할 수 있으며
직접 객체를 만들 수 없고(인스턴스화 불가)
abstract method를 통해 자식 클래스에서 꼭 구현해야할 기능들을 정의할 수 있다.
2. interface
interface 키워드를 사용해서 정의할 수 있으며
마찬가지로 특정 함수(기능)을 강제하기 위해 사용된다.
얼핏 보면 abstract class의 abstract method를 쓰면 interface를 쓰지 않아도 된다고 생각할 수 있다.
사실 필자가 그랬다.
하지만 실제로는 interface를 더 많이 쓴다. (물론 사바사이긴 하지만... interface를 이용한 상속을 권장하는 사람이 많았다)
왜 그럴까?
필자의 짧은 견해로는
① 다중 상속이 가능하다.
② 필요한 기능만 구현 가능하다.
이런 이유에서가 아닐까 싶다.
예를 들어 abstract class로 '휴대폰' 클래스를 만든다고 하겠다.
abstract method로 call() 이라는, 전화를 걸 수 있는 기능을 정의하였다.
그런데 새로운 모델들에서는 인터넷 접속이 가능하다고 한다. 구형 모델 클래스에서는 불가능하고!
abstract method로 connectInternet() 메소드를 추가하였다.
구형 모델 클래스에는 사용하지않지만 구현을 시켜주었다.
이렇듯 abstract class로 구현 시
새로운 기능이 추가될 때 마다 새로운 abstract method를 추가하고
또 자식 클래스에서 사용하지도 않을 method 들을 구현해줘야하는 번거로움이 있다.
하지만 interface를 사용한다면
새로운 기능이 추가될 때 그에 맞는 interface를 만들고
실제로 그 기능을 쓰는 자식 클래스에서만 구현하면 된다.
abstract class와 interface는 서로를 대체하는 존재가 아니라
아예 쓰는 목적이 다르다고 생각이 된다.
abstract => 큰 틀을 잡을 때, 청사진을 그리듯이..
interface => 다중 상속이 필요할 때, 유연한 기능 추가/삭제를 원할 때
틀린 점이 있다면 댓글로 알려주시길 :)