TIL - 7 # Sealed class vs Sealed interface Kotlin 사용자라면 Sealed class를 많이 사용하고 있을 겁니다. Kotlin 1.5 부터 Sealed Interface를 사용할 수 있으며, 두개의 차이가 무엇인지 알아보겠습니다. ## Sealed class란? `Sealed class`는 공식문서에 보면 이렇게 정의되어있습니다. “***Sealed*** classes and interfaces represent restricted class hierarchies that provide more control over inheritance. All direct subclasses of a sealed class are known at compile time. No other subclasses may appear outside the module and package within which the sealed class is defined. For example, third-party clients can't extend your sealed class in their code. Thus, each instance of a sealed class has a type from a limited set that is known when this class is compiled” 정리를 해보면 아래와 같습니다. - Sealed class와 interface는 상속에 대한 더 많은 제어를 제공하는 제한된 클래스 계층을 나타냅니다. - Sealed class에 직접 상속된 모든 서브 클래스들은 컴파일 타임에 알 수 있습니다. - 다른 서브 클래스들은 Sealed 모듈 또는 패키지 밖에서 정의할 수 없습니다. - 제3자가 코드에서 Sealed class를 확장할 수 없습니다. 따라서, 컴파일 시점에 모든 분기점을 알 수 있습니다. ## Enum 과의 차이 그러면 Enum을 사용하는것과 큰 차이가 없을것 같은데 Sealed Class가 존재하는걸까요? Enum 같은 경우는 단일 인스턴스만 허용되지만, Sealed class의 경우는 여러개의 인스턴스가 존재될수 있으며, 각각 자신 만의 상태를 가질 수 있습니다. 또한 클래스의 서브 클래스들은 반드시 같은 파일 내에 선언되어야 합니다. 따라서 각 상황에 맞게 구현하는 것이 중요합니다. ## Sealed class vs Sealed interface Sealed class과 Sealed interface라는 네이밍을 봤을때 차이점은 class와 interface입니다. 각 특징을 살펴보면 class는 단일 상속밖에 안되지만 interface는 다중 상속이 가능합니다. Sealed class와 Sealed interface도 마찬가지로 class의 경우 다른 Sealed class간의 단일 상속밖에 안되지만, Sealed interface의 경우는 다중 상속이 되어, 쉽게 Sealed interface간의 서브 클래스들을 Sealed class에 확장해나갈 수 있습니다. 또한 `Sealed interface`는 `Sealed class`와 다르게 같은 모듈안에서 다른 파일에 있어도 상관이 없습니다. ## 번외: `data object` Kotlin 1.7.20 버전에 소개 되었으며, 1.9 버전에 출시 되었습니다. 일반 Sealed class와 Sealed interface와 같은 경우 서브 클래스들로 `data class`, `object`, `class` 로만 선언이 가능하였는데, 이번에 `data object`라는 것이 왜 나오게 된걸까요? 일반 data class의 경우에는 자동으로 toString이 override되어 클래스 이름과 파라미터 등이 출력이 되도록 구현이 되어있지만, object의 경우에는 “패키지명.$object클래스이름@주소값” 과 같이 각 object의 클래스 정보와 주소값인 기본 정보로 출력이 됩니다. 이를 해결하기위해서 toString을 override 해줘서 직접 다 구현을 해줄 수 밖에 없습니다. 하지만 `data object`가 나오고 나서 toString을 일일이 override하지 않고 `data class`와 유사하게 출력이 된다고 합니다. (IDE 에서 object 로 선언했을 경우 data object로 변경하라고 제안해줍니다 😁) 참고 문서 : [https://kotlinlang.org/docs/sealed-classes.html](https://kotlinlang.org/docs/sealed-classes.html)