Kotlin/Kotlin | Spring 학습기록

[Kotlin] 코틀린에서의 상속을 위한 키워드 open, override, super

kth990303 2022. 5. 19. 12:51
반응형

Java에서는 extends로 상속 기능을 지원했었다. 하지만 kotlin에는 extends 키워드가 존재하지 않는다.

그렇다면 kotlin에서는 상속을 어떻게 사용할까?


코틀린에서의 상속을 구현하자!

코틀린에서는 부모 클래스 앞에 open 키워드를 붙여줌으로써 상속 기능을 사용할 수 있다. 

 

Fruit 부모 클래스와 이를 상속받는 Apple 자식 클래스 예제를 보자.

Fruit 부모 클래스

class 앞에 open 키워드를 붙여줌으로써 다른 클래스에서 상속받을 수 있도록 열어주었다. 이렇게 해야 Apple 자식 클래스에서 Fruit 부모 클래스를 상속받을 수 있다. 

 

또한, 부모 클래스의 함수를 자식 클래스에서 사용하기 위해서는 함수 앞에 open 키워드를 붙여주어야 한다.

Fruit 부모 클래스를 상속받는 Apple 자식 클래스

kotlin에는 extends 키워드로 상속하지 않고 ':'를 이용하여 상속해준다. 평소처럼 클래스명에 파라미터를 넣어주고, 부모 클래스를 : 옆에 지정해주어 인자를 넘겨주는 방식으로 상속 기능을 구현한다.

 

부모 클래스의 함수를 사용하기 위해서는 함수 앞에 override 키워드를 붙여주면 된다. 자바에서는 @Override 어노테이션을 붙였으며, 이 또한 필수적이지 않다. 하지만 코틀린에서는 override 키워드를 붙여주지 않으면 컴파일 에러가 발생한다.

내용에는 super 키워드를 활용해 부모 클래스의 함수 기능을 사용한 후, 자식 클래스만의 추가기능을 구현해주면 된다.

 

 

추가로, 만약 부모 클래스가 open이 아닐 경우 아래 그림처럼 에러가 발생한다.

 

Kotlin: This type is final, so it cannot be inherited from

 

즉, final type이므로 상속받을 수 없다는 것이기 때문에 open 키워드를 이용하여 열어주어야 한다.


Fruit, Apple 상속 클래스 실행결과

위 코드를 기반으로 아래 main 함수를 실행해보자.

fun main() {
    val appleNotName = Apple("")	// 1. IllegalArgumentException: 나에게 이름을 줘!
    
    val fruit = Fruit("fruit")
    fruit.introduce()
    // 2. 나는 과일이야!
    
    val apple = Apple("apple")
    apple.introduce()
    // 3. 나는 과일이야!
    // 그 중에서 나는 사과야
}

1번 결과는 Apple 인스턴스를 생성할 때 IllegalArgumentException이 발생한 코드이다. 상속 관계이기 때문에 부모 클래스의 init validate에서 검증된 것을 확인할 수 있다.

 

2번 결과는 Fruit 인스턴스를 생성하여 introduce 함수를 실행한 결과이다.

 

3번 결과는 Fruit를 상속받는 Apple 인스턴스를 생성해주어 introduce 함수를 실행한 결과이다. Apple의 introduce 함수에는 super.introduce()가 존재하기 때문에 Fruit의 introduce 소개도 하고, 자기 자신 소개도 하는 모습을 확인할 수 있다.

 

override 함수에서 super.introduce()를 쓰지 않으면 부모 클래스의 introduce() 기능을 사용하지 않는다. 이는 어떻게 보면 오버라이드의 당연한 특징이다.

fun main() {
    val fruit = Fruit("fruit")
    fruit.introduce()
    // 1. 나는 과일이야!
    
    val apple = Apple("apple")
    apple.introduce()
    // 2. 그 중에서 나는 사과야
    // override에서 super 기능을 사용하지 않아 부모 클래스의 introduce 기능을 사용하지 않는다.
}

추상 클래스는 JAVA와 마찬가지로 abstract 키워드

참고로 추상 클래스로 사용하고 싶다면 open이 아닌 abstract 키워드를 사용하면 된다.

abstract class Skill(open val name: String)

data class Soft(override val name: String) : Skill(name)

data class Hard(override val name: String) : Skill(name)

여기서는 파라미터 인자를 override하기 때문에 파라미터 타입 앞에 override를 붙여주었다.


자바와 어떻게 보면 달라서 어렵긴 하지만, 그래서 더더욱 재밌는 듯하다.

abstract, open, override, super 키워드 사용법을 익혀 추상클래스, 상속 관계를 적절하게 사용하여 더 똑똑하게 코틀린을 사용해보도록 하자.

반응형