Uing? Uing!!

[내 맘대로 정리한 Kotlin] @CallSuper 어노테이션: 상속은 허용하되, 덧붙이는 것만 허용하고 싶다면? 본문

Kotlin

[내 맘대로 정리한 Kotlin] @CallSuper 어노테이션: 상속은 허용하되, 덧붙이는 것만 허용하고 싶다면?

Uing!! 2021. 3. 31. 03:43
반응형

아래 코드는 Animal이라는 클래스와 이를 상속받은 Dog와 Cat이라는 클래스이다.

open class Animal {
    open fun makeSound() {
        println("making sound...")
    }
}

class Dog : Animal() {
    override fun makeSound() {
        println("bark!")
    }
}

class Cat : Animal() {
    override fun makeSound() {
        println("meow~")
    }
}

Animal 클래스의 인스턴스에 대해 makeSound() 메소드를 호출하면 "making sound..."라는 결과값이 출력된다.

반면 Dog, Cat 클래스의 인스턴스에 대해서는 이 문자열이 아닌 "bark!" 또는 "meow~"만이 출력된다.

 

그런데 Animal 클래스의 작성자가 이런 의도를 가지고 있었다면?

'Animal 클래스를 상속받는 모든 클래스들은 makeSound()를 호출했을 때 "making sound..."를 함께 출력해야 한다'

 

위 Dog와 Cat 클래스는 이 조건을 만족하지 않는다.

 

@CallSuper 어노테이션

@CallSuper 어노테이션을 활용하면 상위 클래스에 이러한 제약조건을 걸어줄 수 있다.

예를 들어 이렇게 코드를 작성한다면,

open class Animal {
    @CallSuper // @CallSuper annotation
    open fun makeSound() {
        println("making sound...")
    }
}

class Dog : Animal() {
    override fun makeSound() { // compilation error
        println("bark!")
    }
}

class Cat : Animal() {
    override fun makeSound() { // compilation error
        println("meow~")
    }
}

Dog와 Cat 클래스의 makeSound()에는 빨간줄이 그어지며 문제가 있음을 알린다.

마우스를 가져다 대면 이런 메시지를 확인할 수 있다.

Overriding method should call super.makeSound 

Animal 클래스의 makeSound()에 @CallSuper를 설정해 주었기 때문에,

이 클래스를 상속받은 Dog와 Cat의 makeSound에서 super.makeSound()를 호출해 주어야 한다는 의미다.

 

에러를 발생시키지 않으려면 아래와 같이 작성해야 한다.

open class Animal {
    @CallSuper // @CallSuper annotation
    open fun makeSound() {
        println("making sound...")
    }
}

class Dog : Animal() {
    override fun makeSound() { 
    	super.makeSound() // super를 호출하여 @CallSuper에 맞춤
        println("bark!")
    }
}

class Cat : Animal() {
    override fun makeSound() {
    	super.makeSound() // super를 호출하여 @CallSuper에 맞춤
        println("meow~")
    }
}

 

결과적으로 Dog의 makeSound()를 호출하면

"making sound..."

"bark!"

가 출력되고,

 

Cat의 makeSonud()를 호출하면

"making sound..."

"meow~"

가 출력되어 

 

Animal 클래스의 기존 목적을 달성할 수 있게 된다.

반응형
Comments