sealed class
코틀린에서 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의 특징
1. 상속을 제한합니다.
sealed class는 다른 클래스에서 상속을 받지 못하도록 제한합니다.
그렇기 때문에 sealed class의 하위 클래스는 sealed class의 내부에서 정의되어야 합니다.
2. 유한한 개수의 하위 클래스를 갖습니다.
sealed class는 상속을 제한하는 특성이 있기 때문에 유한한 개수의 하위 클래스를 가지게 됩니다.
3. 하위 클래스의 종류를 제한합니다.
sealed class는 하위 클래스의 종류를 제한하여 클래스 계층 구조를 제한할 수 있다는 특징이 있습니다.
sealed class의 장점
1. 코드 안정성 향상
sealed class를 사용하면 컴파일 타임에 모든 하위 클래스를 확인하고 사용할 수 있기 때문에 런타임에서 예상치 못한 동작을 방지하여 코드 안정성을 향상시킵니다.
2. 가독성 향상
sealed class를 사용하면 클래스 계층 구조가 명확해지기 떄문에 코드의 가독성이 향상되고 유지보수성이 향상됩니다.
3. 패턴 매칭
패턴 매칭은 일반적으로 타입이 서로 다른 값들을 패턴으로 지정하고, 해당 값이 각각 어떤 타입인지 판별하는 기능입니다. sealed class를 사용하면 이를 통해 코드를 간결하고 가독성 높게 작성할 수 있습니다.
// 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 age: Int) : Animal() {
override fun getInfo() = "My cat is $age years old."
}
data class Fish(val color: String) : Animal() {
override fun getInfo() = "I have a $color fish."
}
}
fun printAnimalInfo(animal: Animal) {
println(animal.getInfo())
}
하지만, 일반적인 클래스나 인터페이스를 사용한 경우에는 패턴 매칭을 하기 위해서 is 연산자를 사용해 타입을 비교해야 합니다. 이 경우, 패턴이 추가될 때마다 is 연산자를 사용하여 해당 타입에 대한 분기를 모두 추가해주어야 합니다. 이렇게 되면 코드가 복잡해지고, 가독성이 떨어지며, 유지보수성이 떨어지게 됩니다.
// 일반 class 사용
interface Animal
class Dog(val name: String) : Animal
class Cat(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("My cat is ${animal.age} years old.")
is Fish -> println("I have a ${animal.color} fish.")
}
}
'안드로이드 > 개념' 카테고리의 다른 글
[Android] Broadcast Receiver (0) | 2023.08.01 |
---|---|
[Android] Service (0) | 2023.08.01 |
[Android] 런타임 권한 요청하기 (0) | 2023.07.28 |
[Android] registerForActivityResult 사용하기 (0) | 2023.07.26 |
[Android] Serializable vs Parcelable (0) | 2023.07.21 |