상속 (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) |
그렇다면 다음과 같이 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 |
'프로그래밍 > Kotlin' 카테고리의 다른 글
코틀린(Kotlin) 추상클래스 & 인터페이스 (0) | 2017.12.11 |
---|---|
코틀린 Getters and Setters #2 (0) | 2017.12.10 |
코틀린(Kotlin) Getters and Setters #1 (0) | 2017.12.10 |
코틀린(Kotlin) 클래스 선언 방법 #3 (0) | 2017.12.08 |
코틀린(Kotlin) 클래스 선언 방법 #2 (0) | 2017.12.07 |
코틀린(Kotlin) 클래스 선언 방법 #1 (0) | 2017.12.05 |
코틀린(Kotlin) 변수 선언 방법 빠르게 살펴보기 (0) | 2017.12.04 |