Sealed class 란?
Sealed class 와 interface 는 상속에 대한 제어를 제공하는 제한된 클래스 계층이다.
when으로 타입 검사할 때 문제점
코틀린 컴파일러는 when을 사용하여 타입을 검사할 때 꼭 else 분기를 덧붙이게 강제한다.
- 의미 없는 else 분기가 생길 수 있다.
- 이후 새로운 하위 클래스를 추가하더라도 컴파일러가 when이 모든 경우를 처리하는지 제대로 검사할 수 없다.
interface Expr
class Num(val value: Int) : Expr
class Sum(val left: Expr, val right: Expr) : Expr
fun eval(e: Expr) : Int =
when(e) {
is Num -> e.value
is Sum -> eval(e.right) + eval(e.left)
else -> throw IllegalArgumentException("Unknown expression")
}
Sealed classes로 when 표현
- Sealed class 와 interface 를 상속하는 모든 클래스들은 컴파일 시에 알 수 있다.
- 따라서 when 식에서 모든 하위 클래스를 처리한다면 else 분기는 필요 없다.
sealed class Expr {
class Num(val value: Int) : Expr()
class Sum(val left: Expr, val right: Expr) : Expr()
}
fun eval(e: Expr): Int =
when(e) {
is Expr.Num -> e.value
is Expr.Sum -> eval(e.right) + eval(e.left)
}
그 외 특징들
- sealed class 와 interface 는 open이다.
- sealed class의 생성자는 protected 또는 private 중에 선택할 수 있다.
- sealed class는 그 자체로 abstract이다.
- sealed class 자체는 인스턴스화 할 수 없다.
- abstract 멤버를 가질 수 있다.
- sealed class 와 interface의 하위 클래스는 동일 패키지내에 선언되어야 한다.
- 하위 클래스는 top-level 선언 또는 class, interface, object 안에 중첩(nested)하여 선언할 수 있다.
- 상속 클래스는 일반적인 상속 규칙과 호환되는 한 모든 가시성을 가질 수 있다.
- 상속 클래스는 정규화된 이름이 있어야 한다. 로컬 객체이거나 익명 객체일 수 없다.
- 상속 클래스는 object 또는 class가 될 수 있다.
- enum class도 enum 타입의 값을 제한된다는 점에서 유사하다.
- enum 상수는 오직 단일 인스턴스로 존재한다.
- Sealed class 와 interface를 상속하는 클래스는 여러 인스턴스를 가질 수 있다.
'기타 > Android' 카테고리의 다른 글
[Android] Android Activity Lifecycle 정리 (0) | 2023.04.13 |
---|---|
[Kotlin] This expressions 란? (1) | 2023.02.27 |
[Kotlin] Scope functions(let, run, with, apply, also) 정리 (0) | 2023.02.22 |
[Android] RecyclerView 스크롤을 특정 위치로 이동 (0) | 2022.11.19 |
[Android] Toolbar 뒤로가기 버튼 만들기 (0) | 2022.08.12 |