클래스 상속 기본 규칙
슈퍼 클래스(부모, Base 클래스) 상속 시
- 슈퍼 클래스는 반드시 open class로 만들어야 한다.
- 단일 상속만 할 수 있다.
- Kotlin Class에 상속이 선언되어 있지 않다면 Any 클래스를 자동으로 상속받는다.
- private이 아닌 모든 속성과 함수를 상속받는다.
- 자식 클래스(sub, 하위 클래스)에서 함수나 속성을 재정의 시 override 키워드를 정의해야 하며 부모의 속성도 open 키워드를 사용해야한다.
final 키워드
Kotlin은 기본적으로 final 이다.
- final class: 상속 불가
- final 함수, 속성: override 불가
- 하위 클래스에서 override를 하면 자동으로 open 이 내장된다.
- final override는 하위 클래스들에 명시적으로 재정의를 막을 때 사용한다.
- 하위 클래스에서 상위 클래스의 속성, 함수를 명시적으로 호출하려면 super 키워드를 사용한다.
- Property Override 규칙
- 상위 클래스와 Property 이름과 Type이 같아야 한다.
- 상위 클래스에서 val 로 선언된 Property는 val와 var로 재정의 가능하다
- 상위 클래스에서 var 로 선언된 Property는 var 로만 재정의 가능하다 (No Val)
- 상위에서 null 허용은 하위에서 null 불허로 선언 가능하다.
- 상위에서 null 불허는 하위에서 null 허용이 불가능하다.
EX)
open class Parent : Any() { // -> 생략 시 자동으로 Any 클래스를 상속받는다
open var userName = "Hong GilDong" // -> 하위 클래스에서 재정의가 필요하다면 open을 선언한다
open var age = 34
open fun toParentInfo() = "이름은 $userName, 나이는 $age"
}
class Child : Parent() {
override var userName: String = "Hong ParkSa"
override var age: Int = 53
override fun toParentInfo(): String = "직위는 선생님이고 이름은 $userName, 나이는 $age"
}
Any Class
Any Class는 Kotlin에서의 최상위 클래스이며 모든 Kotlin 클래스는 Any 클래스를 자동으로 상속받는다.
Any Method(Function)
equals(other: Any) | - 재정의 하지 않으면 해당 객체의 단순 비교(얉은 비교) - 기본적으로 '===' 가 내장되어 있어 .16진수 값을 비교한다. |
hashCode() | - 생성된 객체의 유일성을 나타낸다. - set 계열이다. |
toString() | - 해당 객체를 문자열로 표현한다. - 재정의 하지 않으면 Class Type과 hashCode()값을 출력한다. |
cf) equals와 hashCode가 모두 같아야 같은 객체이다.
Kotlin 상속과 생성자
- 상/하위 관계에서는 하위 클래스의 객체를 생성할 때 반드시 상위클래스의 생성자를 호출해야 한다.
- Kotlin 클래스를 선언할 때 명시적으로 생성자를 만들지 않으면 인자없는 생성자(Primary Constructor)를 컴파일러가 자동으로 추가한다.
- 상/하위 생성자가 호출된 후 속성 초기화가 먼저 실행된다.
open class Parent { ,,,,, } class Child : Parent() { ,,,,, } fun main() { val child = Child() } |
open class Parent constructor() { ,,,,, } class Child constructor() : Parent() { ,,,,, } fun main() { val child = Child() } |
왼쪽 코드는 결국 오른쪽과 같이 컴파일 된다 |