Kotlin sealed class 란?
코틀린에서 sealed class는 다른 클래스가 상속을 받지 못하도록 제한하는 클래스이다. 이 클래스는 클래스 계층 구조에서 제한된 개수의 클래스를 나타낼때 사용하게 된다.
sealed class Result<out T> {
data class Success<out T>(val data: T) : Result<T>()
data class Error(val exception: Exception) : Result<Nothing>()
}
sealed class의 특징을 정리하면 다음과 같다.
sealed class의 특징
1. 상속을 제한한다.
sealed class는 다른 클래스에서 상속을 받지 못하도록 제한합니다. 그렇기 떄문에 sealed class의 하위 클래스는 sealed class의 내부에서 정의되어야 합니다.
2. 유한한 개수의 하위 클래스를 갖는다.
sealed class는 상속을 제한하는 특성이 있기 때문에 유한한 개수의 하위 클래스를 가지게 됩니다.
3. 하위 클래스의 종류를 제한한다.
sealed class는 하위 클래스의 종류를 제한하여 클래스 계층 구조를 제한 할 수 있다는 특징이 있습니다.
이러한 sealed class를 사용하면 어떤 점이 좋을까?
sealed class의 장점
1. 코드 안정성 향상
컴파일 타임에 모든 하위 클래스를 확인하고 사용할 수 있기 때문에 런타임에서 예상치 못한 동작을 방지하여 코드 안정성을 향상시킨다.
2. 가독성 향상
sealed class를 사용하면 클래스 계층 구조가 명확해 지기 떄문에 코드의 가독성이 향상되고 유지보수성이 향상된다.
3. 패턴 매칭
패턴 매칭은 일반적으로 타입이 서로 다른 값들을 패턴으로 지정하고, 해당 값이 각각 어떤 타입인지 판별하는 기능입니다. 이를 통해 코드를 간결하고 가독성 높게 작성할 수 있습니다.
하지만 일반적인 클래스나 인터페이스를 사용한 경우, 패턴 매칭을 하기 위해서는 is 연산자를 사용하여 타입을 비교해야 합니다. 이 경우, 패턴이 추가될 때마다 is 연산자를 사용하여 해당 타입에 대한 분기를 모두 추가해주어야 합니다. 이렇게 되면 코드가 복잡해지고, 가독성이 떨어지며, 유지 보수성이 떨어지게 됩니다.
하지만 sealed class를 사용하면, 상속 계층 구조 내에서 패턴 매칭을 할 수 있습니다. sealed class를 사용하면 자식 클래스를 모두 정의한 상태에서 when 표현식 등을 이용하여 패턴 매칭을 할 때, 모든 자식 클래스에 대한 분기를 명시적으로 작성하지 않아도 됩니다. 이를 통해 코드의 가독성과 유지 보수성을 높일 수 있습니다.
일반 class 패턴 매칭 예제
interface Animal
class Dog(val name: String) : Animal
class Cat(val name: String, val age: Int) : Animal
class Fish(val color: String) : Animal
fun printAnimalInfo(animal: Animal) {
when (animal) {
is Dog -> println("This is a dog named ${animal.name}.")
is Cat -> println("This is a cat named ${animal.name}, and it is ${animal.age} years old.")
is Fish -> println("This is a ${animal.color} fish.")
}
}
sealed class 패턴 매칭 예제
sealed class Animal {
abstract fun getInfo(): String
data class Dog(val name: String) : Animal() {
override fun getInfo() = "This is a dog named $name."
}
data class Cat(val name: String, val age: Int) : Animal() {
override fun getInfo() = "This is a cat named $name, and it is $age years old."
}
data class Fish(val color: String) : Animal() {
override fun getInfo() = "This is a $color fish."
}
}
fun printAnimalInfo(animal: Animal) {
println(animal.getInfo())
}
다들 이러한 sealed class를 잘 활용하여서 예상치 못한 하위 클래스의 추가로 인한 버그가 생기는 것을 방지하자!
'안드로이드(Kotlin)' 카테고리의 다른 글
Kotlin 코틀린의 DI(의존성 주입) (0) | 2023.03.26 |
---|---|
Kotlin 코틀린의 Flow (0) | 2023.03.17 |
Kotlin 코틀린의 Coroutine (1) | 2023.02.09 |
Kotlin 코틀린의 object VS companion object (0) | 2022.08.30 |
Kotlin 코틀린의 싱글톤(Singleton) (0) | 2022.08.30 |