본문 바로가기
Kotlin

[Kotlin] 상속

by 신입같은 3년차 2019. 6. 19.
728x90

 

코틀린에서의 최상의 클래스는 Any이다 .

class의 상속타입을 선언하지 않으면 암시적으로 Java의 Object처럼 Any가 상속된다 . ( 그렇다고 Java의 Object와 Kotlin의 Any가 같지는 않음.  Any는 equals() , toString() , hashCode()만 가지고 있음 )

 

명시적으로 상속관계를 표현하기 위해서는 class 의 헤더부분에 콜론(:) 과 상속받고자 하는 클래스를 적어주면 된다 . 

 

상속관계에서는 open 키워드를 사용해야한다 .

이유는 Kotlin에서 class는 기본적으로 final로 되어있기때문에 open을 사용해주어서 열어줘야 한다 .

만약 사용하지 않는다면 This type is final , so it cannot be inherited from Error가 발생한다 . 

 

open class A
class B : A() {}

open class C(name : String)
class D(name : String) : C(name)

 

메소드 오버라이딩


-오버라이딩 될 메서드에는 open 어노테이션을

-오버라이딩 된 메서드에서는 override 어노테이션을 사용하여야 한다 .

open class A {
    open fun add(){
        println("A.add")
    }
}
class B : A() {
    override fun add(){
        println("A.add")
    }
}

 

프로퍼티 오버라이딩 


메서드 오버라이딩과 같은 방식으로 오버라이딩이 가능하다 . 

open class A {
    open val name :String = "Choi Yun Jin"
}
class B : A() {
    override var name : String = "Hello Kotlin"
}

 

오버라이딩 규칙 


같은 멤버에 대한 중복된 구현을 상속받은 경우 , 상속받은 메서드들을 override해야하며 자체 구현을 제공해야 한다 .

 

class A와 interface B에 custom()이라는 메서드가 동시에 존재하다보니 class C에서는 custom을 호출해도 어느 클래스 or 인터페이스의 메서드인지 알수가없다 따라서 중복된 이름의 메서드를 호출할때는 super<callType>.메서드()를 사용하면 된다 . 

fun main(args: Array<String>) {
    var a : C = C()
    a.custom()
}

open class A {
    open fun custom(){
        println("HELLO A.custom")
    }
}

interface  B {
    open fun custom(){
        println("HELLO B.custom")
    }
}
class C : A() , B{
    override fun custom() {
        super<A>.custom()
        super<B>.custom()
    }
}

 

 

추상 클래스 (abstract)


추상클래스에서 멤버는 구현체가 없다 . abstract클래스나 멤버들은 open 키워드가 필요가 없음 . 하지만 구현하는쪽에서는

override 키워드를 사용해야 한다 . 

 

fun main(args: Array<String>) {
    var a : C = C()
    a.custom()
}

abstract class A {
    abstract fun custom()
}

class C : A() {
    override fun custom() {
        print("CCCCCCCCC")
    }
}
728x90
반응형

'Kotlin' 카테고리의 다른 글

[Kotlin] Kotlin + Retrofit 통신  (0) 2019.06.26
[Kotlin] Data Classes  (0) 2019.06.19
[Kotlin] class 의 활용 및 개념  (0) 2019.06.19
[Kotlin] Package , Return and Jumps  (0) 2019.06.19
[Kotlin] 코틀린 Control Flow  (0) 2019.06.19

댓글