Enum class Default Method

Enum Class

아래에서 사용할 Enum 클래스

// JAVA
enum Animal {
    DUCK, PENGUIN, CAT, DOG
}

// Kotlin
enum class Animal {
    DUCK, PENGUIN, CAT, DOG
}

기본적인 Enum class property / method

// Kotlin 
fun sampleCodeForDefaultMethodInEnum() {
    // Return enum property's name
    println(CAT.name) // CAT

    // Return enum property's position in enum class
    println(CAT.ordinal) // 2

    // Get enum property by name
    println(valueOf("DUCK")) // DUCK
    // println(Animal.valueOf("DUCKY")) // throw IllegalArgumentException error ( no enum constants )

    // Return values to arrayList
    println(
        values()
            .map { "You are ${it.name} in position ${it.ordinal} !" }
            .toList()
    )
}
// enum 에서 어떤 값이 분기처리가 되지 않았는지 확인 할 수 있음
// 임의의 enum property 에 대한 예외처리를 하지않았을 때 아래의 warning 문구가 표출이 됨
// 'when' expression on enum is recommended to be exhaustive, add 'PENGUIN' branch or 'else' branch instead
when (values().random()) {
    DUCK -> {
        println("DUCK")
    }
    CAT -> {
        println("CAT")
    }
    DOG -> {
        println("DOG")
    }
}
// PENGUIN에 대한 case가 없음에도 불구하고 switch에 warning을 표출시켜 주지 않음
int randomIndex = new Random().nextInt(4);
Animal animal = Animal.values()[randomIndex];
switch (animal) {
    case CAT -> System.out.println("CAT !");
    case DOG -> System.out.println("DOG !");
    case DUCK -> System.out.println("DUCK !");
}

Enum with constructor

enum class AnimalWithName(val cryingSound: String, val age: Int) {
    DUCK("Quack", 123),
    PENGUIN("Peng", 12),
    CAT("Meow", 1),
    DOG("Bow", 31)
}

fun sampleCodeForEnumWithConstructor() {
    println(AnimalWithName.CAT.age) // 1
    println(AnimalWithName.CAT.cryingSound) // Meow
}

Enum with Abstract function / property