본문 바로가기
Study/Kotlin

[Kotlin] Sealed Class | 코틀린 실드 클래스

by M개발자 2024. 5. 1.
반응형

Sealed Class


  • Sealed 클래스는 클래스 계층 구조를 정의하는 특별한 종류의 클래스다.
  • sealed 클래스는 상속의 개념이 아니라 클래스의 종류를 제한하는 용도로 사용된다.
  • sealed 클래스는 해당 클래스의 하위 클래스를 한정하는 데 사용되며, 이 하위 클래스들은 sealed 클래스의 내부나 동일한 파일 내에서 정의되어야 한다. 이렇게 하면 sealed 클래스의 하위 클래스가 완전하고 제한된 집합을 형성하게 되어, 해당 클래스 계층 구조를 제한하고 더욱 안정적으로 만든다.

 

  • 제한된 하위 클래스: Sealed class는 제한된 수의 하위 클래스를 가질 수 있다.
  • 패턴 매칭: Sealed class는 패턴 매칭과 함께 사용되어 특정 유형의 인스턴스를 처리하는 코드를 보다 간결하게 작성할 수 있다. when 표현식을 사용하여 sealed class의 각 하위 클래스에 대해 다른 동작을 수행할 때 유용하다.
  • 캡슐화된 유형 계층: Sealed class를 사용하면 유형의 계층 구조를 명확하게 정의할 수 있다. 이는 코드의 가독성과 유지 보수성을 향상시키고, 클래스 간의 관계를 명확하게 보여준다.
sealed class Character {
    class Warrior(val name: String, val weapon: String) : Character()
    class Mage(val name: String, val spell: String) : Character()
    class Rogue(val name: String, val dagger: String) : Character()
}

fun attack(character: Character) {
    when (character) {
        is Character.Warrior -> println("${character.name} swings ${character.weapon}.")
        is Character.Mage -> println("${character.name} casts ${character.spell}.")
        is Character.Rogue -> println("${character.name} backstabs with ${character.dagger}.")
    }
}

fun main() {
    val warrior = Character.Warrior("Conan", "Sword")
    val mage = Character.Mage("Merlin", "Fireball")
    val rogue = Character.Rogue("Thief", "Dagger")

    attack(warrior)
    attack(mage)
    attack(rogue)
}

하위 Object와 class

정의

  • 파일 내에 하위 클래스로 정의한다. Sealed 클래스와 동일한 파일에서 하위 클래스를 정의하고 외부에서 사용하면 코드의 가독성과 유연성이 향상된다.
  • Sealed 클래스 내부에 클래스 정의는 피해야 한다. Sealed 클래스는 상위 수준의 클래스 계층을 제한하는 용도로 사용된다. 내부에 클래스를 정의하는 것은 유연성을 제한하고 가독성을 해칠 수 있다.

Result.kt

sealed class Result {
    companion object {
        fun success(message: String): Result = Success(message)
        fun error(error: Throwable): Result = Error(error)
    }
}

data class Success(val message: String) : Result()
data class Error(val error: Throwable) : Result()

 

main.kt

fun main() {
    val successResult = parseResult("Success: Data loaded successfully")
    val errorResult = parseResult("Error: Data loading failed")

    when (successResult) {
        is Success -> println("Success: ${successResult.message}")
        is Error -> println("Error: ${successResult.error.message}")
    }
}

fun parseResult(resultString: String): Result {
    return if (resultString.startsWith("Success")) {
        val message = resultString.substringAfter(": ")
        Result.success(message)
    } else {
        Result.error(Exception("Parsing failed"))
    }
}

Class

  • sealed 클래스의 특정한 종류를 나타내며, 해당 클래스의 속성을 확장하거나 변경할 수 있다.
  • 하위 클래스는 sealed 클래스의 특징을 상속하며, 추가적인 기능을 제공한다.
  • 예를 들어, 다양한 유형의 데이터를 처리하는 경우 sealed 클래스의 하위 클래스로 각 유형을 나타내는 클래스를 정의할 수 있다.
sealed class Vehicle {
    class Car(val model: String) : Vehicle()
    class Motorcycle(val model: String) : Vehicle()
}

Object

  • sealed 클래스의 특정한 인스턴스를 나타내는 싱글톤 객체를 정의할 때 사용된다.
  • 객체는 해당 클래스의 유일한 인스턴스를 나타내며, 싱글톤 패턴을 구현할 때 유용하다.
  • 예를 들어, 애플리케이션의 상태를 관리하는 데 사용되는 sealed 클래스의 객체를 정의할 수 있다.
sealed class Vehicle {
    object Car : Vehicle()
    object Motorcycle : Vehicle()
}

참고

반응형

댓글