부모의 자원을 자식이 상속 받아 사용하는 것을 말한다.
상속 방법 class ChildClass extends + '부모 클래스'
class ParentClass {}
class ChildClass extends ParentClass {}
상속 방법 class ChildClass : '부모 클래스()`
코틀린은 부모 클래스 앞에 open 키워드를 사용한다.
open class ParentClass {}
class ChildClass : ParentClass() {}
만약 open 키워드를 사용하지 않을 경우
This ype is final, so it cannot be inherited from 이라는 문구가 나온다.
코틀린은 open 키워드가 없을 경우 다른 곳에서 상속 받지 못하는 final class로 정의된다.
자바 | 코틀린 |
---|---|
final class ParentClass { } | class ParentClass { } |
class ParentClass { } | open class ParentClass { } |
자바에서는 클래스에 final
이 붙지 않으면 모두 다른 클래스에서 상속이 가능하다.
하지만 코틀린에서의 클래스와 메서드는 기본적으로 final
이다.
따라서 어떤 클래스의 상속을 허용하려면 해당 클래스 앞에 open 변경자를 붙여야 하며 오버라이드를 허용하고 싶은 메서드나 프로퍼티의 앞에도 open
변경자를 붙여야 한다.
코틀린은 상속을 명시 하지 않을 경우 클래스 계층 구조 ROOT에 위치한 Any 클래스가 상속된다.
아래 두 개는 동일하다.
class ClassName
class ClassName : Any()
open class Car {
// 이 메서드는 하위 클래스에서 override 불가능
fun getNumberOfTires(): Int {
return 4
}
// 하위 클래스에서 override 가능
open fun hasSunRoof() :Boolean {
return false
}
}
// open 클래스는 상속이 가능하다!
class Benz() : Car() {
// getNumberOfTires 메서드는 override 불가능
// hasSunRoof 메서드는 open변경자가 붙어서 override 가능
override fun hasSunRoof(): Boolean {
return true
}
}
abstract class Animal {
// 추상 메서드는 반드시 override 해야 함
abstract fun bark()
// 이 메서드는 하위 클래스에서 선택적으로 override 할 수 있다. (하거나 안하거나 자유)
open fun running() {
println("animal running!")
}
}
class Dog() : Animal() {
override fun bark() {
println("멍멍")
}
// 이 메서드는 override 하거나 하지 않거나 자유.
override fun running() {
println("dog's running!")
}
}
정리하자면,
open class
: 다른 클래스에서 상속 할 수 있다.
open method
: 해당 메서드를 하위 클래스에서 override 할 수 있다.
super 키워드를 활용해 부모 클래스의 함수 기능을 사용한 후, 자식 클래스만의 추가 기능을 구현해주면 된다.
open class Fruit{
open fun introduce(){
println("나는 과일이야!")
}
}
class Apple : Fruit(){
override fun introduce() {
super.introduce()
println("그 중에서 나는 사과야")
}
}
fun main() {
Apple().introduce()
}
참고
https://androidtest.tistory.com/102
https://velog.io/@conatuseus/Kotlin-%ED%82%A4%EC%9B%8C%EB%93%9C-%EC%A0%95%EB%A6%AC-open-internal-companion-data-class-%EC%9E%91%EC%84%B1%EC%A4%91