brunch

You can make anything
by writing

C.S.Lewis

by 서준수 Dec 09. 2017

코틀린(Kotlin) 클래스 상속

빠르게 살펴보기

상속 (Inheritance)


 코틀린에서는 super class(이하 부모클래스)를 선언하지 않은 클래스는 default super로 Any라는 부모클래스를 가집니다.


 class Computer // 암시적으로 Any를 상속 받음



표준 라이브러리에도 잘 설명되어 있습니다.


 Any (출처)

open class Any

The root of the Kotlin class hierarchy. Every Kotlin class has Any as a superclass.


 이 설명만 보면 마치 Java의 java.lang.Object와 같아 보입니다. 하지만 Any는 Object와는 다르게 equals(), hashCode(), toString() 외 다른 멤버는 가지지 않습니다. Object는 clone(), notify() 등 다른 멤버가 더 있습니다. (Object 참고)


상속받는 방법 (부모클래스를 명시적으로 선언하기)

                                     

 상속을 받기 위해서는 아래와 같이 부모클래스를 명시적으로 선언해주면 됩니다.


 open class Person(var name: String)

 class Student(name: String) : Person(name)


멤버를 재정의 하기 위해서도 멤버 앞에 open을 명시해야 합니다.


open class Person {
    open fun eat() {}
    open fun sleep(){}
}

class Student : Person() {
    override fun eat() {}
    override fun sleep() {}
}



 그렇다면 다음과 같이 student 객체를 만들어서 name을 출력하면 어떤 식으로 동작을 할까요?


 val student = Student("Kim")

 println("student name = ${student.name}")


 앞서 공부한 내용을 떠올려보면 Student의 주생성자를 호출할 것입니다. 그 후 부모클래스에 있는 property인 name을 초기화하기 위해서 Person의 주생성자 호출될 것입니다. 마치 부생성자가 this로 주생성자를 호출하여 property를 초기화하듯이 동작합니다.


 그런데 한 가지 신경 쓰이는 open이라는 키워드가 있습니다. Java 클래스는 final을 명시했을 때 상속이 불가능하며 특별히 명시하지 않을 때는 final 클래스가 아닙니다. 코틀린 클래스는 open을 명시해야 상속이 가능하며 명시하지 않을 경우 Java의 final 클래스와 같습니다.


 즉, 다음과 같이 사용합니다.

Java에서는 상속 불가능 -> final 키워드

코틀린에서는 상속 가능 -> open 키워드


 Java 코드로 생각해보면 다음과 같습니다. 이렇게 보니 좀 더 이해하기 쉽습니다.


 public class Person { // final 클래스가 아님

 String name;

  public Person(String name) {

   this.name = name;

  }

 }


 public class Student extends Person {

  public Student(String name) {

   super(name);

  }

 }



 다음의 코틀린 코드들을 Java 코드로 변환해보면 코틀린 클래스에 대해서 좀 더 익숙해지는데 도움이 될 것 같습니다.


class ExampleUnitTest {

    @Test

    fun kotlin() {

        val student = Student()

        println("student name = ${student.name} student age = ${student.age}")

    }


    open class Person(var name: String = "Jane")

    class Student(name: String = "kim", var age: Int = 26) : Person(name)

}


 student name = kim student age = 26




 class ExampleUnitTest {

    @Test

    fun kotlin() {

        val student = Student()

        println("student name = ${student.name} / student last_name = ${student.last_name} / student age = ${student.age}")

    }


    open class Person(var name: String = "Jane")

    class Student(var last_name: String = "Smith", var age: Int = 26) : Person(last_name)

}


 student name = Smith / student last_name = Smith / student age = 26


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari