![[Kotlin] sealed class](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnOPNX%2FbtsIoOQVdlp%2FkSKAaSk24pwmiXl6Dgo5mK%2Fimg.png)
[Kotlin] sealed classlegacy/Kotlin2024. 7. 5. 16:40
Table of Contents
1. 등장 배경
부모 클래스가 있고 자식 클래스가 3개가 존재할 때, 컴파일러 입장에서는 부모 클래스를 상속하는 클래스가 몇 개인지 알 수 없다.
1-1. 부모 클래스
open class Car(
val name: String,
val color: String
) {
internal fun carInfo() {
println("차의 종류는 ${name}이며 색깔은 ${color}입니다.")
}
}
1-2. 자식 클래스
class Honda(
name: String,
color: String
) : Car(name = name, color = color)
class Hyundai(
name: String,
color: String
) : Car(name = name, color = color)
class Kia(
name: String,
color: String
) : Car(name = name, color = color)
위 상태에서 when 절을 사용하여 조건문을 작성해 보자.
fun handleCar(car: Car) {
when(car) {
is Hyundai -> println("현대 자동차입니다.")
is Kia -> println("기아 자동차입니다.")
}
}
그렇다면 아래와 같이 "when"절에는 else 조건이 필요하다고 에러가 뜬다. 입력받은 car가 hyunda도 아니고 kia도 아닌 경우 else문을 호출해야 하기 때문이다.
2. sealed 클래스란?
sealed 클래스란 상속을 제한하는 클래스이다. 특징으로는 같은 패키지에 있는 자식 클래스만 부모 클래스를 상속할 수 있다.
sealed 클래스를 사용하면 컴파일 타임에 클래스를 상속하는 모든 하위 클래스를 알고 있기 때문에 when 절에서 else 문을 사용하지 않아도 된다.
컴파일러는 hyundai, kia, honda를 제외한 다른 case가 존재하지 않음을 알고 있기 때문에 else를 사용하지 않아도 오류가 발생하지 않는다.
fun handleCar(car: Car) {
when(car) {
is Hyundai -> println("현대 자동차입니다.")
is Kia -> println("기아 자동차입니다.")
is Honda -> println("혼다 자동차입니다.")
}
}
참고