Menu
Coddy logo textTech

Enum 클래스

Coddy Kotlin 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 33번째.

enum class는 고정된 값 집합인 상수를 갖는 타입을 선언합니다. 각 상수는 name과 0부터 시작하는 위치인 ordinal을 가진 enum의 객체입니다. entries는 상수들을 순서대로 나열합니다:

enum class Direction { NORTH, EAST, SOUTH, WEST }

main 내부:

val d = Direction.EAST
println(d)
println(d.ordinal)
println(Direction.entries)

출력:

EAST
1
[NORTH, EAST, SOUTH, WEST]

열거형 상수에는 속성이 있을 수 있으며, 이 속성은 열거형의 생성자에 전달되고, 열거형은 메서드를 선언할 수 있습니다. 세미콜론은 멤버 앞에서 상수 목록을 끝냅니다:

enum class Coin(val cents: Int) {
    PENNY(1), NICKEL(5), DIME(10), QUARTER(25);

    fun label() = "${name.lowercase()} ($cents c)"
}

main 내부:

println(Coin.DIME.label())
println(Coin.entries.sumOf { it.cents })

출력:

dime (10 c)
41

모든 상수를 나열하는 enum에 대한 when에는 else가 필요하지 않으며, 컴파일러는 누락된 상수를 알려 줍니다. valueOf("SOUTH")는 정확한 이름으로 상수를 찾고 알 수 없는 값에 대해서는 예외를 발생시키므로, 입력은 일반적으로 entries.find와 일치시킵니다:

enum class Direction { NORTH, EAST, SOUTH, WEST }

fun turnRight(d: Direction) = when (d) {
    Direction.NORTH -> Direction.EAST
    Direction.EAST -> Direction.SOUTH
    Direction.SOUTH -> Direction.WEST
    Direction.WEST -> Direction.NORTH
}

fun parse(text: String) = Direction.entries.find { it.name == text.uppercase() }

main 내부에서:

println(turnRight(Direction.valueOf("SOUTH")))
println(parse("north"))
println(parse("up"))

출력:

WEST
NORTH
null

상수는 자체 본문을 가지며 그 안에서 메서드를 재정의할 수 있습니다. 열거형에서 메서드를 abstract로 선언하면 모든 상수가 해당 메서드를 구현하도록 강제됩니다:

enum class Op(val symbol: String) {
    PLUS("+") {
        override fun apply(a: Int, b: Int) = a + b
    },
    TIMES("*") {
        override fun apply(a: Int, b: Int) = a * b
    };

    abstract fun apply(a: Int, b: Int): Int
}

main 내부에서:

for (op in Op.entries) println("6 ${op.symbol} 3 = ${op.apply(6, 3)}")

출력:

6 + 3 = 9
6 * 3 = 18
challenge icon

챌린지

쉬움

Size 열거형을 상수 SMALL(250 ml, 가격 300), MEDIUM(350 ml, 380), LARGE(500 ml, 450)로 완성하세요. 가격은 센트 단위입니다. label()은 medium (350 ml): 3.80을 반환하고, upsize()는 다음으로 큰 사이즈를 반환하거나 LARGE인 경우 같은 사이즈를 반환합니다. companion의 parse(text)는 대소문자를 무시하고 이름으로 사이즈를 찾거나 첫 글자(s, M)로 찾으며, 그렇지 않으면 null을 반환합니다.

제공된 코드는 medium, L 또는 up small(사이즈를 한 단계 키운 음료)과 같은 주문을 읽고 각 라벨 또는 unknown size x를 출력한 후, 마지막으로 total: 11.10을 출력합니다.

여러분의 코드는 Size.kt에 작성합니다. Main.kt에는 제공된 입력/출력 코드가 들어 있으며 편집할 수 없습니다.

직접 해보기

fun main() {
    // 제공된 입력/출력 코드: 그대로 유지하세요
    val input = generateSequence(::readLine).toList()
    var total = 0
    for (line in input) {
        val upsize = line.startsWith("up ")
        val size = Size.parse(line.removePrefix("up "))
        if (size == null) {
            println("unknown size $line")
            continue
        }
        val chosen = if (upsize) size.upsize() else size
        println(chosen.label())
        total += chosen.price
    }
    println("total: %d.%02d".format(total / 100, total % 100))
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: Kotlin 플레이그라운드