<aside>
<img src="https://prod-files-secure.s3.us-west-2.amazonaws.com/904e5e50-75a6-4c6d-807c-5c432db9bb0f/cef475de-5915-48e1-a61f-7b0d6cf11e5a/Kotlin_Icon_2021.svg.png" alt="https://prod-files-secure.s3.us-west-2.amazonaws.com/904e5e50-75a6-4c6d-807c-5c432db9bb0f/cef475de-5915-48e1-a61f-7b0d6cf11e5a/Kotlin_Icon_2021.svg.png" width="40px" /> 4장 목차
</aside>
1. 클래스 계층 정의
(1) 코틀린 인터페이스
- 코틀린 인터페이스는 자바 8 인터페이스와 비슷하다.
- 코틀린 인터페이스 안에는 추상 메소드뿐만 아니라 구현이 있는 메소드도 정의 할 수 있다. ( 자바 8의 디폴트 메소드와 비슷하다.)
- 다만 인터페이스에는 아무런 상태(필드)도 들어갈 수 없다.
a. 간단한 인터페이스 선언
//간단한 인터페이스 선언
interface Clickable {
fun click()
}
- click이라는 추상 메소드가 있는 인터페이스를 정의한다.
- 이 인터페이스를 구현하는 모든 비추상 클래스는 click에 대한 구현을 제공해야 한다.
b. 단순한 인터페이스 구현하기
fun main(args: Array<String>) {
Button().click() //출력 I was Clicked!
}
class RedButton : Clickable {
override fun click() = println("I was Clicked!")
}
- 자바에서는 class 확장은 extends로, interface 구현은 implement 키워드를 사용한다.
- 코틀린에서는 둘 다 콜론 (:) 을 붙이고 클래스 확장과 인터페이스 구현을 한다.
- 자바와 마찬가지로 class는 interface를 원하는 만큼 개수 제한 없이 마음대로 구현할 수 있다.
- 클래스는 오직 하나만 확장할 수 있다.
- 자바는 @Override 어노테이션과 비슷한 override 변경자는 상위 클래스나 상위 인터페이스에 있는 프로퍼티나 메소드를 오버라이드한다는 표시이다.
- 자바와 달리 코틀린에서는 override 변경자를 꼭 사용해야한다. override 변경자는 실수로 상위 클래스의 메소드를 오버라이드 하는 경우를 방지해준다.
- 상위 클래스에 있는 메소드와 시그니처가 같은 메소드를 우연히 하위 클래스에서 선언하는 경우 컴파일이 안되기 때문에 override를 붙이거나 메소드 이름을 바꿔야한다.
- 인터페이스 메소드도 디폴트 구현을 제공할 수 있다. 그런 경우 메소드 앞에
default
를 붙여야 하는 자바 8과 달리 코틀린에서는 그냥 메소드 본문에 메소드 시그니처 뒤에 추가하면 된다.
c. 인터페이스 안에 본문이 있는 메소드 정의하기
interface Clickable {
fun click()
fun showOff() = println("I'm clickable!")
}