0.5 인터페이스란
인터페이스는 데이터 구조의 구현을 지정하지 않고 작업을 지정한다. 추상 메서드나 추상 속성(즉, Backing filed가 없음) 등이 인터페이스에 정의된다. 어떠한 특정 작업 세트를 제공하는 데이터 유형을 정의한다고 생각하면 된다. [기능이 구현되는 방식을 결정할 필요가 없는 기능 집합]
1. 인터페이스의 필요성
( https://bruders.tistory.com/44 ) 에서 사용했던 클래스 계층 구조이다. 이 때 만들어진 영화는 비평가로부터 평가되어야 한다고 가정해보자. 이를 위해 비평 (Rating) 과 비평가 (Reviewer)에 대한 클래스를 추가로 만든다면 클래스 계층 구조는 어떻게 생겨야 할까?
왼쪽과 같은 구조를 생각했다고 가정해보자. 그러면 Reviewer 클래스는 두개의 클래스를 상속해야 한다. 그렇다면 여기서 두개의 상속을 받은 하위클래스에선 무슨일이 일어나게 될까? 오른쪽과 같은 클래스 구조가 갖춰져있다고 생각해보자. variable1 : A = D() , variable1.f1() 을 써 메서드 f1()을 호출한다면 D는 클래스 B의 f1()을 가져오게 될까, 아니면 클래스 C의 f1()을 가져오게 되는 걸까? 문제가 생겨버린다. 변수도 마찬가지다. 클래스 B와 C에 같은 이름을 가진 변수가 있다고 쳐보자. variable2 : D = D(), 여기서 d.z = 45 라 가정했을시 이 z는 어느 클래스에서 온 건지 알수가 없다. 이런 등등 여러 문제가 발생해서 그럴까? 코틀린에선 클래스가 단 하나의 상위 클래스로부터만 상속받을 수가 있다.( 자바도 그랬던걸로 기억하는게 기억이..)
그럼 위 문제를 해결하려면 어떻게 해야 할까? 간단하다. Rating 클래스를 클래스가 아닌 인터페이스로 두면 된다. 인터페이스는 추상 클래스보다 더 추상적으로 생각하면 된다. 데이터 저장을 위한 구조를 지정하지 않고 기능만 지정해주면 된다.
interface Rating{
fun getScore(movie : Movie) : Int
fun getInfo(movie : Movie) : String
}
자바와 마찬가지로 코틀린도 inferface 키워드로 인터페이스를 생성해 주면 된다. 메서드 내 구현은 다른 클래스에서 이루어져야 한다.
++)
코틀린에서 위와같이 인퍼테이스에 프로퍼티를 선언하는 건 가능하나 초기화는 불가능하다.
2. 인터페이스의 구현
상위클래스를 상속받을 때 처럼 클래스 이름 오른편에 : 인터페이스이름 을 통해 구현이 가능해진다.
출처:
내용 / 도움준 곳: 학교 교수님 (Christian Kohls) 강의
'언어 > Kotlin' 카테고리의 다른 글
Kotlin : nullable 타입 안전하게 참조하기 (ft.Safe Call) (0) | 2022.11.09 |
---|---|
Kotlin : null 이란? (0) | 2022.11.09 |
Kotlin : 추상클래스 (Abstract class) (0) | 2022.11.05 |
Kotlin : Object Composition & Aggregation 이란 (0) | 2022.11.03 |
Kotlin : Movie Maker 에서 Object 키워드 사용해보기 (1) | 2022.11.03 |