상속 - open
Kotlin에 equals(), hashCode(), toString() 메서드를 가지는 Any라는 클래스가 있는데,
Kotlin의 모든 클래스는 이 Any를 상속받는 자식 클래스이다.
Any를 상속받는건 간단하지만 내가 만든 클래스를 다시 내가 만들 클래스에 물려주는 것은 그냥은 안된다.
open 키워드를 사용해서 정확이 이 클래스가 상속될 것임을 알려줘야한다.
open class Base(p: Int){
open fun able(){...} // override 가능
fun forbidden(){...} // 불가능
open val over = 0
}
// 부모 클래스는 반드시 primary constructor를 사용해서 초기화되어야한다.
class Derived(p: Int) : Base(p){
// 자식 클래스에 primary constructor가 없다면 decondary constructor에 super 키워드로
// base type을 초기화해야한다.
constructor (p:Int):super(p) // 이런 식으로..
override fun able() {...}
override fun able() {...} // final이 붙어서 자식클래스는 able을 상속할 수 없다.
override var over = 1 // val -> var은 가능. 반대는 안됨
}
더 자세한 내용은 여기로
https://kotlinlang.org/docs/inheritance.html#derived-class-initialization-order
상속할 함수의 틀만 제공하는 클래스 - abstract class
구현이 하나도 안되어있는 메서드의 경우 open 대신 abstract를 적어준다.
abstract method를 하나라도 포함하고 있으면 그 클래스는 abstract class가 된다.
아무 속성도 초기화하지 않을 때 - Interface
Interface는 아무런 상태값도 저장하지 않는 형태의 클래스를 만들고싶을 때 사용할 수 있는 키워드이다.
Interface를 상속받아 abstract class를 만들거나, Interface 안에 Interface를 inner class로 가지거나, Interface를 상속받아 일반 클래스를 만드는 것 모두 가능하다.
딱 하나 지켜야하는 것은 속성값을 초기화하지 않는 것이다.
interface MyInterface {
val prop: Int // abstract
val propertyWithImplementation: String
get() = "foo"
fun foo() {
print(prop)
}
}
class Child : MyInterface {
override val prop: Int = 29
}
Interface와 abstract class의 차이?
둘다 상속이 가능하다는 공통점이 있지만, 금지되는 사항이 다르다.
abstract class는 메서드가 미리 구현되어있는 것이 금지된다.
interface는 속성값 등으로 state를 저장하는 것이 금지된다.
참고한 자료
Kotlin 공식문서 - Inheritance : https://kotlinlang.org/docs/inheritance.html#overriding-rules
'프로그래밍 언어 > Kotlin' 카테고리의 다른 글
[JUnit] assert 함수 종류 (0) | 2022.10.05 |
---|---|
[IntelliJ] JUnit5 라이브러리 maven으로 적용하기 (0) | 2022.10.05 |
Kotlin의 class(4) - Enum class (1) | 2022.10.03 |
Kotlin의 class(3) - Nested and inner classes (0) | 2022.10.03 |
Kotlin의 class(1) - 생성 및 상속 (1) | 2022.10.03 |