sealed class
- 상속 계층을 제한하는 클래스
- 같은 파일 내에서만 상속이 가능
- 모든 서브클래스를 컴파일 시점에 알 수 있음
- when과 함께 사용하기 용이
- 추상 클래스처럼 동작하지만 서브클래스를 한정하여 완전한 경우의 수 처리가 가능
작동 예시
sealed class Result {
data class Success(val data: String): Result()
data class Error(val errorMsg: String): Result()
}
- Result: sealed class
- Success, Error: Result의 서브 클래스
사용 이유
- when 문으로 Result를 처리할 경우 모든 경우를 다루었는지 컴파일러 체크가 가능
- else없이 안전하게 분기 처리 가능
when 사용 예시
fun handle(result: Result) {
when(result) {
is Result.Success -> println("성공: ${result.data}")
is Result.Error -> println("오류: ${result.errorMsg}")
}
}
문제
1. NetworkResult 실드 클래스를 만들어서 다음 요구사항을 구현하기
[조건]
- NetworkResult는 다음 세 가지 상태를 표현할 수 있어야 해:
- Success: 서버에서 받아온 데이터(문자열)를 가지고 있어야 함
- Error: 에러 메시지(문자열)를 가지고 있어야 함
- Loading: 로딩 중 상태를 나타냄 (추가 데이터는 없음)
[처리]
handleResult라는 함수를 작성해서 NetworkResult를 인자로 받아서 아래 처리를 해줘:
- Success면 "데이터: [데이터 내용]" 출력
- Error면 "에러 발생: [에러 메시지]" 출력
- Loading이면 "로딩 중..." 출력
답:
sealed class NetworkResult {
data class Success(val data: String): NetworkResult()
data class Error(val data: String): NetworkResult()
object Loading: NetworkResult()
}
fun handelResult(result: Result){
when(result){
is NetworkResult.Success -> println("데이터: ${result.data}")
is NetworkResult.Error -> println("에러: ${result.exception.message}")
NetworkResult.Loading -> println("로딩 중")
}
}
보충:
object는 상태가 유일하고 인스턴스가 하나만 있으면 편하기 때문에 object를 사용
- 상태가 고정적이고 정보가 없으면 object
- 상태에 추가 정보가 필요하면 data class
변수나 다른 클래스를 사용할 수 있음
sealed class NetworkResult {
data class Success(val data: String) : NetworkResult()
data class Error(val message: String) : NetworkResult()
data class Loading(val progress: Int) : NetworkResult() // 진행률을 담을 수도 있음
}
2. 아래는 사용자의 인증 상태를 나타내는 AuthResult sealed class를 활용해서 사용자 상태에 따라 메시지를 출력하는 handleAuth 함수를 완성해봐.
sealed class AuthResult {
object Authenticated : AuthResult()
object Unauthenticated : AuthResult()
data class Error(val message: String) : AuthResult()
}
[요구사항]
- handleAuth 함수는 AuthResult를 인자로 받아서 상태에 따라 출력해야 해.
- 상태별 출력은 다음과 같아:
- Authenticated → "로그인되었습니다."
- Unauthenticated → "로그인이 필요합니다."
- Error → "오류 발생: ${message}"
답:
fun handleAuth(result: AuthResult){
when(result){
is AuthResult.Authenticated -> println("로그인되었습니다.")
is AuthResult.Unauthenticated -> println("로그인이 필요합니다.")
is AuthResult.ㄸrror -> println("오류 발생: ${result.message}")
}
}
'개발새발 > 코틀린' 카테고리의 다른 글
[코틀린/Kotlin] 위임(Delegation) (2) | 2025.08.28 |
---|---|
[코틀린/Kotlin] 코루틴(Coroutine) (3) | 2025.08.28 |
[코틀린/Kotlin] 스코프 함수 (0) | 2025.08.21 |
[코틀린/Kotlin] null처리와 스마트캐스트 (0) | 2025.08.20 |
[코틀린/Kotlin] 확장함수 (0) | 2025.08.19 |