추상 클래스 vs 인터페이스

oh_eol·2024년 1월 22일
0

Java Study

목록 보기
3/3
post-thumbnail

"추상 클래스와 인터페이스의 차이 및 존재 이유는 무엇일까?"

클래스는 크게 일반 클래스와 추상 클래스로 나뉘는데, 추상 클래스는 클래스 내 '추상 메소드'가 하나 이상 포함되거나 abstract로 정의된 경우를 말한다.
반면 인터페이스는 모든 메소드가 추상 메소드인 경우이다.
두 개념의 차이는 명확하지만, 하는 일은 비슷하다.

하는 일

추상 클래스와 인터페이스는 상속받는 클래스 혹은 구현하는 인터페이스 안에 있는 추상 메소드를 구현하도록 강제한다.

이 '하는 일'은 결국, 둘 다 추상 메소드를 구현하는 것이라는 결론에 이를 수 있다. 그렇다면 추상 클래스 하나만 존재하되, 추상 메소드를 여러 개 혹은 전부 두면 될 텐데, Interface는 왜 존재하는 것일까?

존재 목적

Abstract Class

extends(확장하다)라는 키워드에서 알 수 있다. 상속받은 클래스가 기능을 이용하고 확장하는 데 존재 목적이 있다.

Interface

implements(구현하다)라는 키워드에서 알 수 있다. Interface에 선언된 모든 추상 메소드의 구현을 강제하여, 구현 객체의 같은 동작을 보장한다.

차이

외형적 차이

추상 클래스 : 부모에서 선언과 정의를 모두 하며 자식은 메소드와 변수를 그대로 사용할 수 있다. (재정의 할 필요가 없다.)
인터페이스 : 부모 객체는 선언만 하며 정의(내용)은 자식에서 오버라이딩(재정의)해서 사용해야 한다.

존재 목적의 차이

이렇게 명확히 다른 존재 목적에도 불구하고 Interface가 마치 추상 클래스를 보완하기 위한 것 처럼 보이는 이유는 뭘까? 바로 자바가 다중 상속을 지원하지 않기 때문이다.
만약 한 클래스가 두 개 이상의 슈퍼클래스를 상속받는데, 그 둘 모두에 같은 추상 메소드가 있다면 이 클래스에서는 어떤 메소드가 실행될지에 대한 불확실성이 존재한다. 때문에 자바에서는 다중 상속을 막고 있다.

이와 달리 Interface는 여러 개의 Interface를 구현할 수 있다.

Interface가 추상 클래스의 다중 상속에 대한 문제점을 보완하는 것이 아니라는 지점은, 다시 한 번 그 존재 목적을 살펴봄으로써 알 수 있다.

상속은 슈퍼클래스의 기능을 이용하거나 확장하기 위해서 사용되고, 다중 상속의 모호성 때문에 하나만 상속받을 수 있다.
반면 인터페이스의 경우 해당 인터페이스를 구현한 객체들에 대해서 동일한 동작을 약속하기 위해 존재한다.

profile
공부 중입니다.

0개의 댓글