상속을 위한 설꼐와 문서를 갖추거나, 그럴 수 없다면 상속을 금지한다.
이는 하위 클래스에서 오버라이드하게 의도된 클래스와 메서드가 아니라면 모두 final로 만들라는 뜻이다.
*final : 클래스, 메서드 또는 프로퍼티에 사용되어 재정의를 금지하는 역할
open
어떤 클래스의 상속을 허용하려면 클래스 앞에 open 변경자를 붙여야 한다.
메서드,프로퍼티도 오버라디으를 허용하고 싶다면 마찬가지고 open 변경자를 붙여야 한다.
interface Clickable{
fun click()
fun showOff() = println("clickable Test")
}
open class RichButton : Clickable {
fun disable() {}
open fun animate() {}
override fun click() {}
}
open class RichButton : open 변경자를 사용하여 다른 클래스가 이 클래스를 상속할 수 있게 열려있다.
fun disable() : 이 함수는 파이널로 하위 클래스가 이 메서드를 오버라이드 할 수 없다.
open fun animate() : 이 함수는 열려있고 하위 클래스에서 오버라이드 해도된다.
override fun click() : 상위 클래스에서 선언된 열려있는 메서드를 오버라이드 하고 기본적으로 열려있다.
아래의 예시처럼 오버라이드 하지 못하게 금지하려면 오버라이드 하는 메서드 앞에 final을 명시해야한다.
open class RichButton : Clickable {
final override fun click() {}
}
abstract
abstract도 자바처럼 클래스 선언을 할 수 있다.
추상 클래스는 인스턴스화 할 수 X
구현이 없는 추상 멤버가 있기 때문에 하위 클래스에서 오버라이드 해야 함
abstract class Animated {
abstract fun animate()
open fun stopAnimating() {}
fun animateTwice() {}
}
Animated는 추상클래스로 인스턴스를 만들수가 없다.
abstract fun animate() : 추상함수로 구현이 없으며 하위 클래스에서 오버라이드 필수
open fun stopAnimating() / fun animateTwice()
: 추상 클래스에 속했더라도 비추상 함수는 기본적으로 final이지만 open으로 오버라이드를 허ㅛㅇ할 수 있다. → open 변경자를 명시할 필요는 없음.
클래스 내 상속 제어 변경자
변경자 | 변경자가 붙은 맴버 | 설명 |
final | override 할 수 x | 클래스 맴버의 기본 변경자 |
open | override 할 수 o | 반드시 open을 명시해야 오버라이드 할 수 o |
abstract | override 필수 | 추상 클래스의 멤버에만 이 변경자를 붙일 수 o, 추상 멤버에는 구현 x |
override | 상위 클래스나 상위 인스턴스의 멤버를 오버라이드하는 중 | override하는 멤버는 기본적으로 열려 있으며, 하위 오버라이드 x → final 명시 |
'Android & Kotlin > Kotlin' 카테고리의 다른 글
[Kotlin] 코틀린 Sealed class ,Interface (0) | 2024.05.03 |
---|---|
[Kotlin] Inner, nested class 내부 중첩 클래스(+ Recyclerview 리사이블러뷰) (0) | 2024.05.03 |
[Kotlin local function] 코틀린 로컬함수와 확장 (0) | 2024.05.02 |
[Kotlin Dispatch] 동적, 정적 디스패치 (Dynamic, Static Dispatch) (1) | 2024.05.02 |
[Kotlin 코틀린 문법] 반복문 (for, while문) (0) | 2022.11.11 |
댓글