상속(Inheritance)

Kotlin은 전통적인 객체 지향 상속 매커니즘을 완벽하게 지원한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
open class Dog {                              //1
    open fun sayHello(){                      //2
        println("wow wow!")
    }
}

class Yorkshire: Dog() {                      //3
    override fun sayHello() {                 //4
        println("wif wif!")
    }
}

fun main() {
    val dog: Dog = Yorkshire()
    dog.sayHello()
}
1
2
🖥️ 출력
wif wif!
  1. Kotlin 클래스는 기본적으로 final 클래스이다. 클래스 상속을 허용하려면 open키워드를 사용하면 된다.
  2. Kotlin 메서드도 기본적으로 final 메서드이다. 클래스와 마찬가지로 open 키워드는 메서드를 재정의할 수 있다.
  3. 이름 뒤에 {: 부모클래스이름()} 을 지정하면 클래스가 부모 클래스를 상속 받는다. 빈 괄호는 부모 클래스의 기본 생성자 호출을 의미한다.
  4. 메서드 또는 특성을 재정의하려면 override 키워드가 필요하다.

매개변수가 존재하는 생성자 상속(Inheritance with Parameterized Constructor)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
open class Tiger(val origin: String){
    fun sayHello(){
        println("A tiger from $origin says: grrhhh!")
    }
}

class KoreaTiger: Tiger("Korea")               //1

fun main() {
    val dog: Dog = Yorkshire()
    dog.sayHello()

    val tiger: Tiger = KoreaTiger()
    tiger.sayHello()
}
1
2
🖥️ 출력
A tiger from Korea says: grrhhh!
  1. 자식 클래스를 생성할 때 부모 클래스의 매개변수가 존재하는 생성자를 사용하려면 자식 클래스 선언에 생성자 인수를 제공해야한다.

부모 클래스에 생성자 인수전달(Passing Constructor Arguments to Superclass)

1
2
3
4
5
6
7
8
9
10
11
12
open class Lion(val name: String, val origin: String) {
    fun sayHello(){
        println("$name, the lion from $origin says: graoh!")
    }
}

class Asiatic(name: String): Lion(name = name, origin = "India")   //1

fun main() {
    val lion: Lion = Asiatic("Rufo")                               //2
    lion.sayHello()
}
1
2
🖥️ 출력
Rufo, the lion from India says: graoh!
  1. Asiatic 선언의 namevarval도 아니다. 생성자 인수이며 값은 부모 클래스인 Lionname 속성에 전달된다.
  2. 이름이 RufoAsiatic 인스턴스를 생성한다. 호출은 RufoIndia인수를 사용하여 Lion 생성자를 호출한다.

Kotlin 카테고리 내 다른 글 보러가기

댓글남기기