빠에야는 개발중

abstract class와 interface 본문

공부/JAVA

abstract class와 interface

빠에야좋아 2018. 3. 17. 12:11

abstract class(이하 추상 클래스)와 interface(이하 인터페이스)는 하위 클래스(정확히는 다르다.)가 미리 선언된 메소드를 오버라이딩 해서 사용할 수 있도록 하는 도구라는 공통점이 있다. 하지만 이 둘은 차이점이 존재한다. 오히려 차이점이 없으면 두 가지가 존재할 이유가 없다. 그 이유를 외적인 차이와 내적인 차이로 알아보자.

외적인 차이

추상 클래스는 추상 메소드 이외에도 일반 메소드를 선언하고 정의할 수 있다. 그리고 하위 클래스에서 이 클래스를 상속(extends)하여 추상 메소드를 오버라이딩 하여 사용할 수 있다. 반면 인터페이스는 일반 메소드를 정의할 수 없고, 하위 클래스가 인터페이스를 구현(implements)해서 오버라이딩을 통한 메소드 정의를 한다. 인터페이스에서는 메소드 앞에 abstract를 생략해도 된다. 모든 메소드가 추상 메소드이기 때문일 것이다.


이렇게 생긴 차이는 “추상화”라는 목적에서 조금 차이를 보인다. 추상 클래스는 일반 메소드를 사용하도록 함과 동시에 하위 클래스로 “확장”하는 목적을 주로 가진다면, 인터페이스는 모든 메소드를 추상화함으로써 하위 클래스의 “틀”을 만들어주는 목적을 가진다고 할 수 있다.


최근에는 자바8에서 인터페이스 내의 default method를 제공하게 되면서 이 경계가 다소 모호해진 경향이 있다.

내적인 차이

자바는 기본적으로 다중 상속을 할 수 없도록 하고 있다. 추상 클래스와 인터페이스가 각각 상속과 구현으로 나누어진 이유는 거기에 있다고 생각한다. 여러 인터페이스의 구현은 가능하기 때문이다. 하지만 다중 상속은 그 모호함에 때문에 회피 해야하는 대상으로 알고 있고, 따라서 다중 상속과 비슷한 형태로 추상 클래스와 인터페이스를 혼용하는 것은 바람직하지 못하다고 생각한다.

'공부 > JAVA' 카테고리의 다른 글

OSIV  (401) 2020.10.28
N+1 문제  (0) 2020.10.28
CAS(Compare And Swap) 알고리즘  (0) 2020.08.06
String, StringBuffer, StringBuilder  (0) 2018.03.17
스트림 api  (0) 2018.03.01
Comments