코틀린에서 봉인된(Sealed) 클래스는 특정 클래스를 직접적으로 상속할 수 있는 클래스를 제한하는 특별한 종류의 클래스입니다. 봉인된 클래스는 특정 클래스를 상속할 수 있는 하위 클래스를 제한하여 상속 계층 구조를 제한적으로 관리할 수 있게 해줍니다.
봉인된 클래스 선언
봉인된 클래스는 sealed 키워드를 사용하여 선언됩니다.
sealed class Result {
class Success(val value: Int) : Result()
class Error(val message: String) : Result()
}
위의 예제에서 Result 클래스는 봉인된 클래스이며, 두 개의 하위 클래스인 Success와 Error를 가지고 있습니다.
봉인된 클래스의 사용
봉인된 클래스의 주요 특징 중 하나는 하위 클래스의 모든 가능한 유형을 미리 정의하는 것입니다. 이로써 컴파일러는 해당 클래스의 모든 하위 클래스를 알 수 있습니다.
fun getResultMessage(result: Result): String {
return when (result) {
is Result.Success -> "Success: ${result.value}"
is Result.Error -> "Error: ${result.message}"
}
}
위의 함수에서 when 식에서는 Result 클래스의 모든 하위 클래스에 대한 처리가 명시되어 있습니다.
봉인된 클래스의 장점
1. 모든 하위 클래스를 알고 있다: 봉인된 클래스를 사용하면 컴파일러는 해당 클래스의 모든 하위 클래스를 알기 때문에 when 식 등을 사용할 때 모든 경우에 대한 처리를 필수로 만들어주어야 합니다.
2. 타입 안정성: 봉인된 클래스를 사용하면 컴파일러가 해당 클래스의 모든 하위 클래스를 알기 때문에 모든 유형에 대한 처리가 없을 경우 컴파일 오류가 발생합니다.
주의사항
1. 동일한 파일 내에서만 상속 가능: 봉인된 클래스의 하위 클래스는 동일한 파일 내에서만 정의될 수 있습니다. 이로 인해 봉인된 클래스의 계층 구조가 더 관리하기 쉽고 의도한 대로 작동하도록 할 수 있습니다.
2. 제한된 상속: 봉인된 클래스의 상속은 미리 정의된 클래스만 가능합니다. 따라서 새로운 하위 클래스를 동적으로 추가하는 것이 불가능합니다.
// 컴파일 오류: Cannot inherit from sealed class 'Result'. Only the original
// sealing class declaration or one of its direct subclasses expected
class CustomResult : Result()
사용 예제
sealed class Result {
class Success(val value: Int) : Result()
class Error(val message: String) : Result()
}
fun getResultMessage(result: Result): String {
return when (result) {
is Result.Success -> "Success: ${result.value}"
is Result.Error -> "Error: ${result.message}"
}
}
fun main() {
val successResult = Result.Success(42)
val errorResult = Result.Error("Something went wrong")
println(getResultMessage(successResult)) // 출력: Success: 42
println(getResultMessage(errorResult)) // 출력: Error: Something went wrong
}
봉인된 클래스를 사용하면 모든 하위 클래스를 미리 정의하고, 해당 클래스 계층 구조를 안전하게 다룰 수 있습니다. 이는 특히 제한된 상속을 허용하고 타입 안정성을 강화하고자 할 때 유용합니다.
With ChatGPT
'Kotlin > 포스팅' 카테고리의 다른 글
코틀린 제네릭스 (0) | 2024.01.02 |
---|---|
코틀린 인터페이스 봉인 (0) | 2024.01.02 |
코틀린 인터페이스 (0) | 2024.01.02 |
코틀린 추상클래스의 추상 멤버 (0) | 2024.01.02 |
코틀린 추상 클래스 (0) | 2024.01.02 |