Sealed Class
- 봉인된 클래스, 클래스들을 묶은 클래스 입니다.
- enum class의 확장형, enum class의 특수한 형태이라고 생각하면 이해하기 쉽습니다.
Sealed class의 특징
- Kotlin 코드를 컴파일 할 때, Sealed 클래스를 상속받은 클래스들이 어떤 것들이 있는지 모두 알려 집니다.
- 컴파일 이후에, 해당 sealed 클래스를 상속받는 클래스는 존재하지 않습니다.
- 따라서, 컴파일 이후 해당 sealed 클래스의 subclass들이 어떤 것들이 있는지 모두 명확하게 알 수 있습니다.
- enum과 용도가 비슷하지만, enum의 property들은 모두 single instance 이지만, sealed class의 property들은 클래스 이기 때문에 multiple instance를 지원 합니다.
- Kotlin의
when 키워드와 함께 사용할 때 매우 강력합니다.
- sealed class 자체는 abstract class의 속성을 갖고 있습니다. ( 본인 객체 생성 불가, abstract property 소유 가능 )
Sealed class의 기본 형태
- sealed class를 생성하고, 해당 sealed class로 묶을 클래스들에 sealed class를 상속 해 줍니다.
- class를 상속 할 수 있는 형태라면 모두 sealed class의 subclass로 활용 가능 합니다. ( class / object / data class )
sealed class SealedThrowable : Throwable()
open class IOException : SealedThrowable()
class InvalidParameter : SealedThrowable()
class Forbidden : SealedThrowable()
object InternalServerError : SealedThrowable()
data class DataClassThrowable(val throwable: Throwable, val responseCode: Int) : SealedThrowable()
sealed class Animal {
class Duck : Animal()
data class Dog(val name: String) : Animal()
object Penguin : Animal()
}
Sealed class를 사용할 때 주의점
- sealed class의 subclass를 sealed class를 직접 상속 받은 direct subclass / sealed class를 상속받은 subclass를 상속받은 indirect subclass 로 나눌 수 있습니다.
- direct subclass는, 반드시 sealed class와 같은 파일에 서술되어 있어야 합니다. 그렇지 않으면 compile error를 발생 시킵니다.
- indirect subclass는 sealed class와 같은 파일에 서술되어 있지 않아도 됩니다.