상속을 다루는 방법

parkrootseok·2025년 8월 1일
0

코틀린

목록 보기
8/15
post-thumbnail

Abstract Class

Java로 작성한 Abstract Class(Animal)와 이를 상속하는 하위 Class(Cat, Penguin)를 Kotlin으로 변환하는 과정을 통해, Java와 다른점은 무엇이 있을지 살펴보겠습니다.

사용할 Java 코드는 다음과 같습니다.

extends가 아닌 : 사용하라

Java에서는 상속을 위해 extends 키워드를 사용합니다. 하지만, Kotlin은 아래와 같이 :을 사용하며, 반드시 상위 Class에 대한 생성자를 호출해야 합니다.

override 지시어를 반드시 사용하자

Java에서는 부모 Class가 가진 Abstract 함수를 재정의할 때, @Override 어노테이션을 사용하며 반드시 명시할 필요가 없습니다. 하지만, Kotlin에서는 override라는 키워드가 별도로 존재하며 반드시 명시해야합니다.

Property를 override 하기 위해선 open을 명시하자

Kotlin에서는 상위 Class에 자동으로 생성된 Getter를 Override하여 Custom Getter를 정의하기 위해선 부모 Class의 Property에 open 키워드를 반드시 명시해야 합니다.

Interface

Java로 작성한 Interface(Swimable, Flyable)을 Kotlin으로 변환하는 과정을 통해, Java와 다른점은 무엇이 있을지 살펴보겠습니다.

Default 키워드 생략 가능

Java에서는 Interface에서 함수를 정의할 경우 default 키워드를 명시하지만, Kotlin에서는 명시하지 않고도 default 함수를 정의할 수 있습니다.

implements 키워드가 아닌 :를 사용하자

Java에서는 Interface를 사용할 때 Implements를 사용하지만, Kotlin에서는 :를 사용합니다.

상위 Inteface의 함수를 호출할 때 <>를 사용하자

Java에서는 상위 Interface의 함수를 호출할 때 Interface.super.method()를 사용지만, Kotlin에서는 super<Interface>.method()를 사용합니다.

Property 정의가 가능

Kotlin에서는 Interface에 Property 또한 미리 정의할 수 있습니다.

상속할 때 주의할 점

일반적인 Class를 상속해야 할 경우 open 키워드를 명시하자

Kotlin은 Abstract, Interface가 아닌 Class를 상속해야 할 경우, 반드시 해당 Class에 open 키워드를 명시해야 가능합니다.

상위 Class의 Constructor 또는 Init에서 사용하는 Property에 open 사용 금지

Kotlin에서 상위 Class를 설계할 때 생성자 또는 초기화 블록에 사용하는 Property에는 open을 사용하는 것을 조심해야 합니다. 그 이유는 아래 예시를 통해 살펴보겠습니다.

아래와 같이 2개의 Class(Base, Derived)가 있습니다.

Derived Class를 생성할 경우 다음과 같은 결과를 볼 수 있습니다.

왜, 100이나 300이 아닌 0이 출력되었을까요? 그 이유는 상위 Class인 Base의 init 블록에서 접근하는 number는 하위 Class의 number이기 때문입니다. 아래와 같이 상위 Class의 생성자가 먼저 호출이 되고, 그 시점엔 아직 하위 Class인 Derived의 생성자가 호출되지 않아 number가 초기값을 가지고 있는 상태입니다. 즉, 인자로 전달받은 300을 아직 하위 Class가 가지고 있는 number에 주입하기 전이기 때문에 초기값인 0을 출력하게 됩니다.

업로드중..

이러한 상황이 발생할 수 있기 때문에, 상위 Class에서 Constructor 또는 Init 블록에서 Property를 사용할 경우 open 키워드를 명시하면 안됩니다.

profile
동료들의 시간과 노력을 더욱 빛내줄 수 있는 개발자가 되고자 노력합니다.

0개의 댓글