본 글은 https://kotlinlang.org/docs/home.html 를 기반으로 작성자 마음대로 번역한 글입니다.
오역 & 의역이 빈번하며 모든 질문 및 태클 환영합니다!
2022-01-24 기준으로 작성되었습니다.
코틀린의 모든 클래스는 공통적인 슈퍼클래스인 Any를 가집니다. 이것은 슈퍼타입이 선언되지 않은 클래스의 기본 슈퍼클래스입니다.
Any는 3개의 메소드를 가집니다: equals(), hashCode(), toString(). 그러므로 이 메소드들은 모든 코틀린 클래스에 정의되어 있습니다.
기본적으로 코틀린의 클래스는 상속될 수 없는 final입니다. 클래스를 상속 가능하게 만드려면 open 키워드로 표시하세요:
명시적으로 슈퍼타입을 선언하기 위해서 클래스 헤더의 콜론 뒤에 타입을 표시하세요:
파생된 클래스가 기본 생성자를 갖는다면, 기본 클래스는 파라미터와 함께 기본 생성자로 초기화되어야합니다.
파생된 클래스가 기본 생성자를 갖지 않는다면, 각 보조 생성자는 super 키워드를 사용하여 기본 타입을 초기화하거나 다른 생성자에 위임해야합니다. 다른 보조생성자들은 기본 타입의 다른 생성자를 호출할 수 있다는 것을 기억하세요.
Overriding methods
코틀린은 오버라이드할 수 있는 멤버와 오버라이드에 명시적인 지시자를 요구합니다:
override 지시자는 Circle.draw()에 요구됩니다. 만약 누락된다면, 컴파일러가 요구할 것입니다. 함수에 Shape.fill()과 같이 open 지시자가 없는 경우, override의 존재에 관계 없이 서브클래스에 같은 시그니쳐를 가진 함수를 선언할 수 없습니다. final 클래스(open 지시자가 없는 클래스)의 멤버에 추가된 open 지시자는 아무런 기능을 하지 않습니다.
override로 표시된 멤버는 open이 되고, 서브클래스에 의해 재정의될 수 있습니다. 재정의를 금지하기 위해서는 final을 사용하세요:
Overriding properties
프로퍼티에서 동작하는 오버라이딩 메커니즘은 함수의 방식과 동일합니다.
슈퍼클래스에서 선언되고 파생된 클래스에서 재선언된 프로퍼티는 앞에 override가 있어야 하며, 호환되는 타입이여야 합니다. 각각의 선언된 프로퍼티는 초기화를 사용한 속성 또는 get 메소드를 사용한 속성으로 재정의할 수 있습니다.
val 프로퍼티를 var 프로퍼티로 재정의 할 수 있으나 반대는 불가능합니다. 파생된 클래스에서 val 프로퍼티는 필수적으로 get 메소드를 선언하며, var 로 재정의된 것은 set 메소드를 추가적으로 선언하기에 가능합니다.
기본 생성자에서 프로퍼티 선언의 일부로 override 키워드를 사용할 수 있다는 것을 기억하세요.
Derived class initialization order
파생된 클래스의 새로운 인스턴스를 생성하는 동안, 기본 클래스 초기화는 첫번째로 완료됩니다(기본 클래스 생성자의 인수 평가만 수행). 즉, 파생 클래스의 초기화 로직 전에 실행됩니다.
이것은 기본 클래스 생성자가 실행될 때, 파생클래스에서 선언되거나 재정의된 프로퍼티는 아직 초기화 되지 않았다는 것을 의미합니다. 기본 클래스의 초기화 로직(직접 또는 재정의된 open 멤버 구현을 통해 간접적으로)에서 이러한 프로퍼티를 사용하면, 잘못된 동작이나 런타임 오류로 이어질 수 있습니다. 따라서 기본 클래스를 디자인할 때, 생성자, 프로퍼티 이니셜라이져나 init 블록에서 open 멤버를 사용하지 않아야 합니다.
Calling the superclass implementation
파생 클래스의 코드는 super 키워드를 사용하여 슈퍼클래스 함수와 프로퍼티 접근자 구현을 호출할 수 있습니다.
inner 클래스 내부에서, 외부 클래스의 슈퍼클래스를 접근하기 위해서는 외부 클래스의 이름으로 지정된 super 키워드를 사용해야합니다: super@Outer :
Overriding rules
코틀린에서, 상속의 구현은 다음 규칙을 따릅니다 : 클래스가 직접적인 슈퍼 클래스로부터 같은 멤버의 여러 구현을 상속하는 경우, 이 멤버를 재정의 하여 독자적인 구현을 제공해야 합니다. (아마, 상속된 것 중 하나를 사용합니다)
상속된 구현을 가져오는 슈퍼타입을 나타내려면 super<Base>와 같이 꺽쇠 괄호 안의 슈퍼타입 이름으로 한정된 super를 사용합니다.
Rectangle과 Polygon을 모두 상속받아도 괜찮지만, 각자 draw()의 구현을 가지고 있으므로, Square에서 draw()를 재정의하고 모호성을 제거하기 위해 다른 구현을 제공해야합니다.
https://kotlinlang.org/docs/inheritance.html
Inheritance | Kotlin
kotlinlang.org
'Kotlin > Docs' 카테고리의 다른 글
[Kotlin Docs] Interfaces (0) | 2022.02.04 |
---|---|
[Kotlin Docs] Properties (0) | 2022.02.03 |
[Kotlin Docs] Classes (0) | 2022.01.24 |
[Kotlin Docs] Packages and imports (0) | 2022.01.20 |
[Kotlin Docs] Exceptions (0) | 2022.01.20 |