본문 바로가기
kotlin

[kotlin] 인터페이스와 추상클래스

by 코드 이야기 2023. 4. 29.
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 사용 가능 여부, 프로퍼티의 상태값 가능 여부)
  • 개념적으로 차이가 있다.
  • 인터페이스: 외부와의 소통을 위한 기능 선언. 외부에서 해당 기능을 사용하기 위해 알아야 할 것들만 선언한다.
  • 추상클래스: 공통 기능을 묶는다.

 

 


참고

Kotlin version 1.8을 기준으로 작성하였습니다.

 

 

728x90

댓글