밤빵's 개발일지
[TIL]20241107 실드클래스(Sealed Class) 본문
실드 클래스는 특정 계층의 클래스들을 제한된 범위 내에서 표현할 때 유용하다. 특히, 상태 관리(State Management) 코드에서 다양한 상태를 명확하게 나타내는 데 큰 도움이 된다.
▶실드 클래스(Sealed Class)란?
실드 클래스는 추상 클래스로, 하위 클래스의 종류를 제한할 수 있는 특징을 가진다. 실드 클래스를 상속받는 클래스들은 반드시 같은 파일 내에 정의되어야 한다. 이를 통해 계층 구조를 보다 명확하고 안전하게 관리할 수 있다. 자바에서는 상속 구조가 파일 단위로 제한되지 않기 때문에, 특정 계층 내의 클래스를 제한하고 싶을 때는 코틀린의 실드 클래스가 더 직관적이고 안전하다.
▷코틀린에서 실드 클래스를 선언하는 방법
sealed class Result
class Success(val data: String) : Result()
class Failure(val error: String) : Result()
object Loading : Result()
→ Result는 실드 클래스로, Success, Failure, Loading은 Result를 상속받는 하위 클래스이다. 이로 인해 Result 타입은 정의된 하위 클래스들로만 구성될 수 있다.
실드 클래스를 활용한 상태 관리 상태 기반의 프로그램을 작성할 때 실드 클래스는 다양한 상태를 관리하는 데 매우 유용하다. 예를 들어, 네트워크 요청을 처리하는 코드에서 성공, 실패, 로딩과 같은 상태를 하나의 타입으로 관리할 수 있다.
▷네트워크 요청 결과를 실드 클래스를 활용해 상태로 표현한 예시
fun fetchData(): Result {
return Loading // 로딩 중 상태 반환
// 실제 네트워크 요청 코드가 실행된 후
// return Success("데이터 수신 성공")
// 또는
// return Failure("오류 발생")
}
fun handleResult(result: Result) {
when (result) {
is Success -> println("Data: ${result.data}")
is Failure -> println("Error: ${result.error}")
Loading -> println("Loading...")
}
}
fun main() {
val result = fetchData()
handleResult(result)
}
→ fetchData 함수는 네트워크 요청의 상태를 반환하고, handleResult 함수는 해당 상태에 따라 다른 동작을 수행한다. when 표현식을 사용하면 모든 하위 클래스의 경우를 처리하도록 컴파일러가 강제하기 때문에, 새로운 하위 클래스가 추가될 경우에도 안전한 코드 유지가 가능하다.
▶실드 클래스의 장점
타입 안전성
모든 가능한 상태를 컴파일 시점에 보장한다. when 표현식을 사용할 때 모든 경우를 다루지 않으면 컴파일 오류가 발생하므로, 상태 누락을 방지할 수 있다.
코드 가독성
다양한 상태를 한눈에 파악할 수 있어 코드의 가독성이 높아진다. 특히, 복잡한 상태를 다루는 코드에서도 실드 클래스를 사용하면 상태 관리가 간결해진다.
유연성
객체, 클래스, 데이터 클래스 등 다양한 형태로 상태를 표현할 수 있어 상황에 맞게 확장할 수 있다.
▶자바와의 차이점
자바에는 코틀린의 실드 클래스와 같은 개념이 존재하지 않는다. 자바에서는 상태를 열거형(Enum)으로 표현하거나 추상 클래스를 상속받아 여러 서브 클래스를 정의하는 방식으로 상태를 관리한다. 그러나 이 방식은 실드 클래스처럼 컴파일러가 상태를 강제하지 않기 때문에 모든 경우를 처리했는지 보장하기 어렵다. 코틀린의 실드 클래스는 이러한 제약을 해결하며 상태 관리의 안정성을 높인다.
실드 클래스는 상태를 명확하고 안전하게 관리할 수 있는 코틀린의 유용한 도구이다. 다양한 상태를 다룰 때 실드 클래스를 사용하면 코드의 가독성과 안전성을 높일 수 있다. 이를 통해 복잡한 상태 기반 프로그램을 더 직관적으로 작성할 수 있으며, 코드 유지보수도 용이하다. 자바와의 차이점도 명확해서, 코틀린의 실드 클래스를 적극 활용하면 보다 안전한 상태 관리를 구현할 수 있다.
'Kotlin' 카테고리의 다른 글
[TIL]20241109 sealed interface (0) | 2024.11.09 |
---|---|
[TIL]20241108 Lazy (1) | 2024.11.08 |
[TIL]20241106 제네릭(Generic) (1) | 2024.11.06 |
[TIL]20241105 Label & break/continue (1) | 2024.11.05 |
[TIL]20241104 Named Argument (1) | 2024.11.04 |