티스토리 뷰

Programming Language/Kotlin

[Kotlin] enum

SdardewValley 2022. 7. 16. 22:16
반응형

  코틀린에서 enum을 선언할 때 자바보다 더 많은 키워드를 선언해야 한다. Color라는 enum 클래스를 선언할 때 java에서는 enum Color로 선언하지만 코틀린에서는 enum class Color과 같이 선언을 하기 때문이다.

  코틀린에서 enum은 소프느 키워드(soft keyword)이다. 소프트 키워드는 변수 혹은 인자의 이름으로 사용가능한 키워드를 지칭한다. enum은 class 앞에서만 특별한 의미를 가지고 있고 다른 상황에서는 이름으로 사용이 가능하다. 

 

 

enum class Color {
    RED, YELLOW, GREEN, BLUE, VIOLET
}

 간단한 enum 클래스는 위와 같이 정의한다.

 

enum class Color(
    val r: Int,
    val g: Int,
    val b: Int
) {
    RED(255, 0, 0),
    YELLOW(255, 255, 0),
    GREEN(0, 255, 0),
    BLUE(0, 0, 255),
    VIOLET(230, 130, 230);

    fun rgb() = (r * 256 + g) * 256 + b
}

  자바에서 enum은 값과 메서드 가질수 있었고 코틀린도 프로퍼티와 메서드를 가질 수 있다. 위의 코드는 rgb 값을 가지는 enum class Color이다.

  상수(RED, YELLOW 등등) 뒤에는 괄호 안에 프로퍼티에 해당하는 값이 와야한다. 그리고 상수 나열의 끝에는 세미콜론(;)이 있어야 한다.

 

 

when의 조건으로 enum을 사용

  when은 java의 switch라고 생각하면 된다. 국가명이 enum으로 되어있고 해당 국가명에 해당되는 국가 코드 값을 알고 싶은 상황이라고 가정하자.

 

enum class Country {
    KOREA, USA, FRANCE
}

fun getCountryCode(country: Country) =
    when (country) {
        Country.KOREA -> "KR"
        Country.USA -> "US"
        Country.FRANCE -> "FR"
    }

  when은 값을 만드는 식이다. java에서는 break 넣어줘야 했는데 코틀린에서는 break를 넣지 않아도 된다. 

 

fun getContinent(country: Country) =
    when (country) {
        Country.KOREA -> "ASIA"
        Country.ITALY, Country.FRANCE -> "EUROPE"
        Country.USA -> "AMERICA"
    }

  만약 여러 값을 묶어서 처리하고 싶을 때는 ,로 나열을 하면 된다. 위의 함수는 나라가 속한 대륙을 리턴한다. 이탈리아와 프랑스는 같은 값을 리턴한다.

 

fun mix(c1: Color, c2: Color) =
    when(setOf(c1, c2)) {
        setOf(RED, YELLOW) -> "ORANGE"
        setOf(YELLOW, BLUE) -> "GREEN"
        else -> throw Exception("I don't know")
    }

  코틀린의 when의 조건으로 객체를 사용할 수도 있다. 위의 함수는 색을 섞었을 때 결과로 나오는 색을 리턴한다. setOf는 집합인 Set 객체로 만들어주기 때문에 파라미터의 순서는 중요하지 않다. 해당되는 분기가 없다면 마지막 else 문을 실행한다.

  위의 코드는 분기 조건을 위해서 Set 인스턴스를 생성하기 때문에 효율적이지 못하다.

 

fun mix(c1: Color, c2: Color) =
    when {
        (c1 == RED && c2 == YELLOW) ||
        (c1 == YELLOW && c2 == RED) -> "ORANGE"
        else -> throw Exception("I don't know")
    }

  when의 인자는 생략할 수 있다. when의 인자를 생략하기 위해서는 분기의 조건의 결과가 Boolean이어야 한다. 

 

 

 

참고

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함