본문 바로가기
개발새발/코틀린

[코틀린/Kotlin] sealed class/when

by 조희우 2025. 8. 22.

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는 다음 세 가지 상태를 표현할 수 있어야 해:
    1. Success: 서버에서 받아온 데이터(문자열)를 가지고 있어야 함
    2. Error: 에러 메시지(문자열)를 가지고 있어야 함
    3. 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}")
	}
}