코틀린에서의 최상의 클래스는 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") } }
'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 |
댓글