일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 개발
- Android Studio
- github
- 유니티
- 안드로이드개발
- 내 맘대로 정리한 안드로이드
- 티스토리
- GIT
- 목서버
- java
- 앱
- 타이쿤
- 서브모듈 sourcetree
- 서브모듈 pull
- 쿼터뷰
- firebase
- Kotlin
- 카페오냥
- github submodule
- 코틀린
- 게임개발
- DataBinding
- 안드로이이드 submodule
- Unity
- 2d게임
- 안드로이드
- Android
- gitlab submodule
- submodule sourcetree
- 앱개발
- Today
- Total
Uing? Uing!!
[내 맘대로 정리한 Kotlin] @CallSuper 어노테이션: 상속은 허용하되, 덧붙이는 것만 허용하고 싶다면? 본문
아래 코드는 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 클래스의 기존 목적을 달성할 수 있게 된다.
'Kotlin' 카테고리의 다른 글
[Kotlin] ushr(>>>)와 shr(>>) 의 차이 (0) | 2022.05.02 |
---|---|
[내 맘대로 정리한 Kotlin] Functional Interaface: 오브젝트를 람다식으로 생성하기 (0) | 2021.07.15 |
[내 맘대로 정리한 Kotlin] @JvmOverloads: constructor를 일일이 상속받아 만들기 귀찮다면! (0) | 2021.03.30 |
[내 맘대로 정리한 Kotlin] 확장 함수와 확장 프로퍼티: 직접 수정할 수 없는 클래스에 함수&프로퍼티 추가하기 (2) | 2020.12.13 |
[내 맘대로 정리한 Kotlin] vararg(가변인자)로 파라미터 원하는 개수만큼 받기 (0) | 2020.12.11 |