728x90
인터페이스
- interface: 경계면, 대화라는 뜻을 가진 단어.
- 일상생활 속에서 사람과 사람의 대화라는 인터페이스
→ 역할과 역할의 메시지라는 인터페이스 - 역할에서 인터페이스를 통해 다른 역할에게 메시지를 보내어 다른 역할을 사용한다.
- 즉, 외부와의 상호작용을 정의한 것
- 요구사항 및 구현 변경시 기능을 외부의 변화를 최소화하기 위해 사용
- 예시. 변경이 잦을 것 같은 객체의 위에 인터페이스를 두어 인터페이스를 통해 소통하도록 한다.
특징
- 변수: 상태 불가능, 속성 가능
(⇒ 변수를 선언할 수는 있지만, 값을 할당할 수는 없음)
(같은 이유로 생성자는 값을 가지는 상태이기 때문에 생성자를 가질 수 없음) - 사용 가능 접근제어자:
private
,public
- 다중 상속 가능
- 인스턴스화 불가능
- 아래와 같이 Java8 이상부터는 interface에서도 default 구현 가능
interface A {
fun a() { b() }
private fun b() { println("레벨인터뷰 무서워 ~") }
}
- 인터페이스를 구현하는 메서드들에서 같은 코드를 사용하는 오버라이드 메서드들이 있습니다.
이러한 메서드들의 기능에 변동이 생길 경우 일일이 이 메서드들을 구현하는 곳을 수정해야합니다.
이러한 불편함을 줄이고자 default 메서드 기능이 추가되었습니다. - 또한, private 접근제어자를 사용할 수 있도록 한 이유에 대해서도 고민해 보았습니다.
default 메서드를 구현할 때만 이용할 수 있으므로 default 메서드를 지원하기 위해 생긴 것이라 생각합니다.
(실제로 Java9부터 지원하기도 함.)
추상클래스
- 기능 및 구현 등의 공통 부분을 묶기 위해 사용
특징
- 변수: 상태 가능, 속성 가능
- 사용 가능 접근제어자:
private
,public
,protected
- 다중 상속 불가능
- 인스턴스화 불가능
추가 설명
저는 인터페이스에 대해 이해할 때 이 예시를 통해 이해하게 되어서
저 또한 이 예시로 설명하는 것을 참 좋아합니다.
이번에는 이 예시에 추상 클래스도 끼워 설명해봐야겠군요!
TV와 리모컨예시입니다!
우리가 TV를 사용할 때 리모컨을 통해 TV를 사용하게 됩니다.
- 리모컨(인터페이스)
- TV의 전원을 킨다.
- TV의 전원을 끈다.
- TV의 채널을 바꾼다.
- TV(추상 클래스) : 리모컨(인터페이스) 구현
- TV의 전원을 키능 기능 구현
- TV의 전원을 끄는 기능 구현
- TV의 채널을 바꾸는 기능 구현
- 바꿀 채널이 존재하는 채널인지 확인하는 기능 (private / protected)
- LG QNED mini LED TV(클래스) / LG OLED 8K TV(클래스) / ... : TV(추상 클래스) 상속
- 외부의 사용과 관련이 없는 추가되거나 변경되는 기능의 구현
TV를 사용할 때 어떤 방식으로 작동하는지, 어떤 기능들이 있는지 전부 알 필요 없습니다.(채널 유효성 검사, 구현 방법 등) 때문에 리모컨이라는 인터페이스를 두고 사용자가 알아야하는 것들만 명시합니다. (⇒ 인터페이스)
TV별로 비슷하거나 같은 기능들이 있습니다. 해당 기능들을 모든 TV마다 일일이 구현할 필요가 없습니다. 따라서 공통 부분을 미리 만들어둡니다. (⇒ 추상클래스)
결론 (네 줄 요약)
- 구현적으로는 크게 차이가 없다. (다중상속 여부, 접근제어자 protected 사용 가능 여부, 프로퍼티의 상태값 가능 여부)
- 개념적으로 차이가 있다.
- 인터페이스: 외부와의 소통을 위한 기능 선언. 외부에서 해당 기능을 사용하기 위해 알아야 할 것들만 선언한다.
- 추상클래스: 공통 기능을 묶는다.
참고
- 『객체지향의 사실과 오해』
- https://kotlinlang.org/docs/interfaces.html#resolving-overriding-conflicts
- https://kotlinlang.org/docs/classes.html#companion-objects
- 수달의 학습로그!
Kotlin version 1.8을 기준으로 작성하였습니다.
728x90
댓글