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챌린지
쉬움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))
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: Kotlin 플레이그라운드