Kotlin

[Kotlin] 다양한 클래스(2)

Jyuni 2023. 5. 26. 00:16

열거형 클래스 (Enum class)

  • 별도의 인자가 없는 열거형 클래스이다.
  • [클래스 이름.name]으로 이름 값을 가져올 수 있습니다.
  • [클래스 이름.ordinal]로 해당 값이 몇 번째에 있는지 순서 값을 가져올 수 있습니다.
  • 인자가 있는 열거형 클래스인 경우 각 열거 값들을 표현하는 방식을 다채롭게 할 수 있습니다.
// 인자 없는 enum class
enum class Animal {
    DOG, CAT, PANDA
}

fun main() {
    val animalEnum: Animal = Animal.CAT
    println("${animalEnum.name}...${animalEnum.ordinal}")

    val animalEnum2: Array<Animal> = Animal.values()
    for (i in animalEnum2.indices) {
        print("${animalEnum2[i].name} \n")
    }
}

/* 결과
CAT...1
DOG
CAT
PANDA
*/
// 인자 있는 enum class
enum class Animal(val age: Int) {
    DOG(5), CAT(10), PANDA(15)
}

fun main() {
    val animalEnum: Animal = Animal.CAT
    println("name : ${animalEnum.name}, age: ${animalEnum.age}...${animalEnum.ordinal}")
}

/* 결과
name : CAT, age: 10...1
*/

Sealed class

  • 부모 클래스의 상속을 받는 자식 클래스의 종류를 제한하는 클래스입니다.
  • sealed class에 정의된 하위 클래스 외의 다른 하위 클래스는 존재하지 않는 것을 컴파일러에게 알려줍니다.
  • sealed class로 선언하고 사용합니다.
  • 생성자는 private로 한정됩니다.
  • sealed class와 그 하위 클래스는 동일한 파일에 정의되어야 합니다. (서로 다른 파일에서 정의 불가능)
  • 하위 클래스는 class, data class, object로 정의할 수 있습니다.
// sealed class를 선언 후 아래에 object 클래스 선언
sealed class Color {
    object Red: Color()
    object Green: Color()
    object Blue: Color()
}

fun main() {
    val color: Color = Color.Red

    val select = when(color) {
        is Color.Red -> "Red Color"
        is Color.Green -> "Green Color"
        is Color.Blue -> "Blue Color"
    }

    println(select)
}

/* 결과
Red Color
*/

Enum class vs Sealed class

공통점

  • 타입을 제한할 때 사용합니다.

차이점

  • enum class은 하나의 객체만 만들 수 있습니다.
  • sealed class는 객체를 여러개 생성할 수 있습니다.