1. 정의 및 핵심 개념
Sealed Class
- 자기 자신을 상속받는 하위 클래스의 종류를 제한하는 추상 클래스
- 컴파일러가 하위 클래스의 전체 목록을 이미 알고 있음
특징
- 제한된 계층: 동일한 패키지 또는 모듈 내에서만 자식 클래스 정의가 가능.
- 추상화: 직접 인스턴스화할 수 없으며, 상태를 가질 수 있음.
- 컴파일 타임 안전성:
when식 사용 시 모든 타입을 처리했는지 컴파일러가 체크
2. 주요 비교 (Vs. Enum, Abstract Class)
| 구분 | Enum Class | Sealed Class | Abstract Class |
|---|---|---|---|
| 인스턴스 | 상수당 1개만 존재 (싱글톤) | 타입별 여러 인스턴스 생성 가능 | 자유롭게 생성 가능 |
| 데이터 독립성 | 모든 상수가 같은 프로퍼티 공유 | 하위 클래스별 각기 다른 데이터 가능 | 자유로움 |
| 상속 가능성 | 상속 불가 | 제한적 상속 (동일 모듈 내) | 누구나 상속 가능 |
| When 사용 시 | else 절 생략 가능 | else 절 생략 가능 | else 절 필수 |
3. 실무 핵심 활용 코드 (Result 패턴)
sealed class NetworkResult<out T> {
data class Success<T>(val data: T) : NetworkResult<T>()
data class Error(val message: String, val code: Int) : NetworkResult<Nothing>()
object Loading : NetworkResult<Nothing>()
}
fun handleResponse(result: NetworkResult<String>) {
// 모든 분기를 처리하지 않으면 컴파일 에러 발생
val displayMessage = when (result) {
is NetworkResult.Success -> "데이터: ${result.data}"
is NetworkResult.Error -> "오류(${result.code}): ${result.message}"
NetworkResult.Loading -> "로딩 중..."
}
println(displayMessage)
}4. 고급 특징 및 제약 사항
- Sealed Interface (Kotlin 1.5+)
- 클래스 계층에 묶이지 않고 공통 동작을 정의할 때 사용
- 다중 상속이 필요한 경우 유용.
- 중첩 허용
- 하위 클래스 → 일반 클래스, 데이터 클래스, 오브젝트(싱글톤), Sealed 클래스 모두 가능.
- 생성자 제한: 생성자는 내부적으로
private. - 바이트코드: 자바 수준에서는
abstract클래스로 변환되며, 하위 클래스들은 이를 상속받는 구조로 구현됨.