개발

abstract class와 interface에 대한 짧은 정리

레란희 2022. 12. 19. 16:27

객체지향 프로그래밍에서 상속은 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 => 다중 상속이 필요할 때, 유연한 기능 추가/삭제를 원할 때

 

틀린 점이 있다면 댓글로 알려주시길 :)