728x90

- Sealed Class 정의와 용도

Sealed의 사전적 의미는 '봉인을 한' 이다

 

상속이 가능하도록 추상클래스를 만들까 하는데

(상속이 가능하도록 계층 구성을 하고 싶은데)

외부에서는 이 클래스를 상속받지 못하도록 하위 클래스를 봉인할 때 사용한다

 

컴파일 타임 때 하위 클래스의 타입을 모두 기억한다 (enum 클래스와 동일)

즉, 런타임 때 클래스 타입이 추가될 수 없다

하위 클래스는 같은 패키지에 있어야 한다


- Enum Class와 Sealed Class의 차이점

  • Sealed Class는 클래스를 상속받을 수 있다
  • Sealed Class의 하위 클래스는 멀티 인스턴스가 가능하다

- 구현 예시

sealed class HyundaiCar(
    val name: String,
    val price: Long
)

class Avante : HyundaiCar("아반떼", 1_000L)

class Sonata : HyundaiCar("소나타", 2_000L)

class Grandeur : HyundaiCar("그랜저", 3_000L)

sealed class로 선언된 것을 제외하면

그냥 추상 클래스와 큰 차이가 없어보인다

선언된 함수가 있었다면 해당 함수도 아래 하위 클래스에서 override 했어야 할 것이다

 

여기서 주목할 점은

컴파일 타임 때 하위 클래스의 타입을 모두 기억한다는 것

즉, 런타임 때 클래스 타입이 추가될 수 없다

따라서 enum 클래스와 마찬가지로 sealed 클래스에서도 when을 함께 활용하면 좋다

fun main() {
    handleCar(Avante())
}

private fun handleCar(car: HyundaiCar) {
    when (car) {
        is Avante -> TODO()
        is Sonata -> TODO()
        is Grandeur -> TODO()
    }
}

 

추상화가 필요한 DTO(Entity)에 sealed class를 활용하면 좋다


https://github.com/tyakamyz/kotlin-study/tree/master/src/main/kotlin/section03/s14_%EC%BD%94%ED%8B%80%EB%A6%B0%EC%97%90%EC%84%9C_%EB%8B%A4%EC%96%91%ED%95%9C_%ED%81%B4%EB%9E%98%EC%8A%A4%EB%A5%BC_%EB%8B%A4%EB%A3%A8%EB%8A%94_%EB%B0%A9%EB%B2%95

 

728x90
복사했습니다!