Development/Kotlin
Sealed Class
지으니88
2022. 2. 25. 20:08
Sealed Class 사용 X
여러개의 자식클래스들이 A라는 부모클래스를 상속받았다고 했을때, 컴파일러는 A 클래스를 상속 받은 자식 클래스들이 있는지 알지 못한다. 따라서 when에서 상태에 따라 처리를 해주려면 else 처리도 같이 해주어야 한다.
// 부모클래스
abstract class ListState
// 자식클래스
class Loading: ListState()
class Success: ListState()
class Failure: ListState()
// ListState에 따라 동작하는 함수
fun doListState(listState: ListState): String {
return when(listState) {
is Loading -> { "Loading" }
is Success -> { "Success" }
is Failure -> { "Failure" }
else -> { "Other"} // 없으면 에러 발생
}
}
Sealed Class 사용 O
Sealed Class는 추상클래스(abstract class)로 상속 받는 자식 클래스의 종류를 제한하는 특성이 있다. 즉, 컴파일러는 sealed class의 자식 클래스가 어떤 것인지 알 수 있다. 따라서 위의 코드에서 else 처리를 하지 않아도 된다. 또한 ListState를 상속받는 자식 클래스가 추가 되었을때는 when문에서도 추가 처리를 해주어야 한다.
sealed class ListState
object Loading: ListState()
object Success: ListState()
object Failure: ListState()
data class Proceeding(val percentage): ListState() // 자식 클래스 추가
// ListState에 따라 동작하는 함수
fun doListState(listState: ListState): String {
return when(listState) {
is Loading -> { "Loading" }
is Success -> { "Success" }
is Failure -> { "Failure" }
is Proceeding -> { "Proceeding" } // 추가
}
}
object는 싱글톤이다. 따라서 상태(변수)가 없거나 equals를 오버라이드 할 필요가 없는 경우에는 object를 쓰면 메모리 낭비를 하지 않는다.
Sealed Class 특징
- 상태값(변수)을 포함하고 있는 여러 instance를 가질 수 있다. 따라서 생성자도 각각의 특징에 따라 달라질 수 있다.
- 생성자는 protected(by default) 이거나 private이다. 따라서 같은 패키지의 자식 클래스만 상속 가능하다.
- 추상클래스로 직접 객체 인스턴스 생성이 불가능하고, (Sealed types cannot be instantiated) abstract 멤버를 가질 수 있다.
참고