[Kotlin] Enum class

developer-shkim·2021년 6월 26일
1

Kotlin

목록 보기
1/4
post-thumbnail

Enum class 정의

  • enum 은 자바보다 코틀린 선언에 더 많은 키워드를 써야 하는 흔치 않은 예다.
  • 코틀린에서는 enum class 사용하고, java 는 enum 사용한다.
  • enum
    • soft keyword -> class 앞에서만 특별한 의미를 지니지만 다른 곳에서는 이름에 사용 가능
  • class
    • keyword -> class 표현하는 변수 정의할 때는 clazz, aClass 와 같은 다른 이름 사용
  • 단순히 값만 열거하지 않고, 클래스 내부에서 프로퍼티나 메소드 정의 가능
  • 일반 클래스와 마찬가지로 생성자, 프로퍼티 선언
  • 각 enum 상수 정의 시, 해당하는 프로퍼티 값 지정해야 한다.
enum class Color (
    val r: Int, val g: Int, val b:Int
) {
    RED(255, 0, 0), ORANGE(255, 165, 0),
    YELLOW(255, 255, 0), GREEN(0, 255, 0), BLUE(0, 0, 255),
    INDIGO(75, 0, 130), VIOLET(238, 130, 238); 
    // 유일하게 세미콜론 필수인 부분
    
    fun rgb() = (r * 256 + g) * 256 + b
}

fun main() {
    println(Color.BLUE.rgb())    // 255
}

when 과 함께

  • 자바의 switch 와 비슷하지만 더 강력하다.
  • if 와 마찬가지로 값을 만들어내는 식이다.
    • 식이 본문인 함수에 when 바로 사용 가능하다.
  • 자바와 달리 각 분기 끝에 break 넣지 않아도 된다.
  • 한 분기 안에서 여러 값을 매치 패턴으로 사용할 수도 있다. (콤마 구분)
enum class Color (
    val r: Int, val g: Int, val b:Int
) {
    ...
    fun getWarmth(color: Color) = when(color) {
        Color.RED, Color.ORANGE, Color.YELLOW -> "warm"
        Color.GREEN -> "neutral"
        Color.BLUE, Color.INDIGO, Color.VIOLET -> "cold"
    }
}

import 해서 간단하게

import Color.*

// Color enum class 생략, 위와 동일

fun getWarmth(color: Color) = when (color) {
    RED, ORANGE, YELLOW -> "warm"
    GREEN -> "neutral"
    BLUE, INDIGO, VIOLET -> "cold"
}

fun main() {
    println(getWarmth(RED)) // warm
}

when, 임의 객체

  • 분기 조건에 상수만 사용할 수 있는 자바와 달리 코틀린 when 분기 조건은 임의의 객체를 허용한다.
  • 색깔을 혼합했을 때 어떤 색깔이 나오는지 반환하는 코드이다.
    • 순서가 중요하지 않으므로 set 을 사용한다.
    • setOf(c1, c2) 와 setOf(RED, YELLOW) 같다는 의미는 c1이 RED이고, c2가 YELLOW거나, c1이 YELLOW이고 c2가 RED 라는 의미다.
    • 인자값과 매치하는 조건 값을 찾을 때까지 각 분기 검사 => 동등성
fun mix(c1: Color, c2: Color) = 
    when (setOf(c1, c2)) {
        setOf(RED, YELLOW) -> ORANGE
        setOf(YELLOW, BLUE) -> GREEN
        setOf(BLUE, VIOLET) -> INDIGO
        else -> throw Exception("Dirty color")
    }

fun main() {
    println(mix(RED, YELLOW))
}

when, 인자 없이

  • 분기 조건에 식을 넣을 수 있어 간결하고 아름답게 작성할 수 있다.
  • 위의 코드에서는 함수가 호출될 때마다 여러 Set 인스턴스 생성
  • 이 함수가 자주 호출된다면, 불필요한 가비지 객체가 늘어날 수 있다.
  • 인자없는 when 사용하면 불필요한 객체 생성 막을 수 있다.
  • when 에 아무 인자도 없으려면 각 분기 조건이 Boolean 반환
fun mixOptimized(c1: Color, c2: Color) =
    when {
        (c1 == RED && c2 == YELLOW) || 
        (c1 == YELLOW && c2 == RED) -> ORANGE

        (c1 == YELLOW && c2 == BLUE) ||
        (c1 == BLUE && c2 == YELLOW) -> GREEN
        
        (c1 == BLUE && c2 == VIOLET) ||
        (c1 == VIOLET && c2 == BLUE) -> INDIGO
        
        else -> throw Exception("Dirty color")
    }

fun main() {
    println(mixOptimized(BLUE, YELLOW))
}

느낀 점

CQRS 패턴에서 Command 에 따른 Handler 분기할 때 사용할 수 있을 것 같다.

참고

  • 『Kotlin IN ACTION』(드미트리 제메로프, 스베트라나 이사코브, 2017, 에이콘)
  • Kotlin Playground 에서 확인 가능합니다.
profile
기록하고 기억하자!

1개의 댓글

comment-user-thumbnail
2021년 6월 26일

kotlin when 문법 잘 보고갑니다. 정리가 잘 되어있네요!

답글 달기