반응형
코틀린 인터페이스
코틀린 인터페이스 안에는 추상 메소드뿐 아니라 구현이 있는 메소드도 정의할 수 있다. (자바8 디폴트 메소드처럼)
interface Clickable{
fun click()
}
class Button: Clickable{
override fun click() = println("I was clicked")
}
>> Button().click()
I was clicked
자바에서는 extends와 implements 키워드를 사용하지만, 코틀린에서는 클래스 이름 뒤에 콜론(:)를 붙이고 인터페이스와 클래스 이름을 적는 것으로 클래스 확장과 인터페이스 구현을 모두 처리한다.
코틀린에서는 override 변경자를 꼭 사용해야 한다.
interface Clickable{
fun click()
fun showOff() = println("I'm clickable!") // 디폴트 구현이 있는 메소드
}
interface Focusable{
fun setFocus(b: Boolean) = println("I ${if (b) "got" else "lost"} focus.")
fun showOff() = println("I'm focusable!")
}
두 상위 인터페이스에 정의된 showOff 구현을 대체할 오버라이딩 메소드를 직접 제공하지 않으면 컴파일 오류가 발생한다. 코틀린 컴파일러는 두 메소드를 아우르는 구현을 하위 클래스에 직접 구현하게 강제하기 때문이다.
class Button: Clickable, Focusable{
override fun click() = println("I was clicked")
override fun showOff(){
super<Clickable>.showOff() // 상위 타입의 이름을 꺽쇠 괄호(<>)사이에 넣어서 "super"로 지정하면 어떤 상위 타입의 멤버 메소드를 호출할지 지정할 수 있다.
super<Focusable>.showOff()
}
}
fun main() {
val button = Button()
button.showOff()
button.setFocus(true)
button.click()
}
open, final, abstract 변경자: 기본적으로 final
자바의 클래스와 메소드는 기본적으로 상속에 대해 열려있지만 코틀린의 클래스와 메소드는 기본적으로 final이다.
어떤 클래스의 상속을 허용하려면 클래스 앞에 open 변경자를 붙여야 한다. 그와 더불어 오버라이드를 허용하고 싶은 메소드나 프로퍼티 앞에도 open 변경자를 붙여야 한다.
open class RichButton: Clickable{ // 이 클래스는 열려있다. 상속이 가능하다.
fun disable(){ } // 이 함수는 파이널이다. 하위 클래스에서 오버라이드할 수 없다.
open fun animate() // 이 함수는 열려있다. 하위 클래스에서 이 메소드를 오버라이드해도 된다.
override fun click() { } // 이 함수는 (상위 클래스에서 선언된) 열려있는 메소드를 오버라이드 한다. 오버라이드한 메소드는 기본적으로 열려있다.
final override fun click() { } // 오버라이드 할 수 없다.
}
자바처럼 코틀린에서도 클래스를 abstract로 선언할 수 있다. abstract로 선언한 추상 클래스는 인스턴스화할 수 없다. 추상 멤버 앞에 open 변경자를 명시할 필요가 없다.
abstract class Animated{
abstract fun animate() // 하위 클래스에서는 이 함수를 반드시 오버라이드해야 한다.
// 추상 클래스에 속했더라도 비추상 함수는 기본적으로 파이널이지만 원한다면 open으로 오버라이드를 허용할 수 있다.
open fun stopAnimating(){
}
fun animateTwice(){
}
}
변경자 | 이 변경자가 붙은 멤버는... |
---|---|
final | 오버라이드 할 수 없음(기본) |
open | 오버라이드 할 수 있음 |
abstract | 반드시 오버라이드해야 함 |
override | 상위 클래스나 상위 인스턴스의 멤버를 오버라이드 하는 중 |
반응형
'프로그래밍 노트 > Kotlin' 카테고리의 다른 글
[Kotlin] 코틀린 생성자(주/부생성자) (0) | 2020.11.30 |
---|---|
[Kotlin] 코틀린 가시성 변경자와 내부 클래스/중첩 클래스/봉인된 클래스 (0) | 2020.11.29 |
[Kotlin] 코틀린 로컬함수와 확장 (0) | 2020.11.24 |
[Kotlin] 코틀린 문자열과 정규식 다루기 (0) | 2020.11.24 |
[Kotlin] 코틀린 컬렉션 처리: 가변 길이 인자, 중위 함수 호출, 라이브러리 지원 (0) | 2020.11.19 |