밑빠진 지식에 블로그 쓰기

Enum 본문

카테고리 없음

Enum

쓰는녀석 2023. 3. 25. 10:43

상수를 사용해 본 적이 있다면 "어떻게 상수를 한 곳에 저장하고 동시에 모두 처리할 수 있을까?" 라는 생각을 한적이 있을것이다. 이 질문에 대해 Kotlin은 Enum이라고 말한다.

 

Enum은 상수를 논리적 집합으로 나타내고 코드를 더 명확하고 일기 쉽게 만든다.

 

enum은 일반적인 클래스에서 자체 열거(enum의 단어뜻)를 만들수 있게 해주는 키워드 입니다.

enum class Rainbow {
    RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET
}

위의 예에서 볼 수 있듯이 무지개의 7가지 색상에 대한 열거형이 있습니다. 이제 우리는 이 모든 색상에 대한 자체 저장소를 갖게 되었습니다. 

 

그들 각각은 별도의 Enum 인스턴스입니다. 추가로 수정할 수 있는 방법을 확인할 수 있습니다. 이제 예를 들어 주문 상태에 대해 고유한 Enum을 만들 수 있습니다.

enum class Status {
    OPEN, PENDING, IN_PROGRESS, RESOLVED, REJECTED, CLOSED
}

 

또는 건축 자재의 주요 유형:

enum class Materials {
    GLASS, WOOD, FABRIC, METAL, PLASTIC, CERAMICS, CONCRETE, ROCK
}

 

컨벤션

1. 대문자 밑줄로 구분된 이름 ex: RED_COLOR

2. 대문자로 시작하는 camelCase

 

색상에 대한 첫 번째 예로 돌아가 보겠습니다. 각 색상은 Rainbow Enum의 인스턴스이므로 이러한 색상의 이름을 생성자에 전달하여 초기화할 수 있습니다.

enum class Rainbow(val color: String) {
    RED("Red"),
    ORANGE("Orange"),
    YELLOW("Yellow"),
    GREEN("Green"),
    BLUE("Blue"),
    INDIGO("Indigo"),
    VIOLET("Violet")
}

이제 다음과 같이 원하는 곳 어디에서나 색상 값을 사용할 수 있습니다.

val color = Rainbow.RED.color

 

의무점

괜찮아 보이지만 그래서 이점이 뭔데 ? 왜 사용하는건데? 라는 의문점이든다.

그 의문점을 해결하기 위해 Enum을 수정하고 색상당 매개변수를 하나더 추가해 보겠습니다.

enum class Rainbow(val color: String, val rgb: String) {
    RED("Red", "#FF0000"),
    ORANGE("Orange", "#FF7F00"),
    YELLOW("Yellow", "#FFFF00"),
    GREEN("Green", "#00FF00"),
    BLUE("Blue", "#0000FF"),
    INDIGO("Indigo", "#4B0082"),
    VIOLET("Violet", "#8B00FF")
}

Rainbow enum은 색상 이름뿐만 아니라 HEX 값에 대한 정보도 포함합니다.

웹 개발에서 색상 값을 파란색, 빨간색 및 녹색 색상의 16진수 형식으로 저장하는 데 널리 사용되는 접근 방식입니다. 여기에서 웹 색상에 대해 자세히 알아볼 수 있습니다. 이제 다음과 같이 사용할 수 있습니다.

 

val rgb = Rainbow.RED.rgb

 

앞에서 말했듯이 Enum은 여전히 ​​사용자 지정 클래스이므로 자체 메서드를 추가할 수 있습니다. Rainbow 인스턴스에 대한 전체 정보를 인쇄하는 메서드를 추가해 보겠습니다.

enum class Rainbow(val color: String, val rgb: String) {
    RED("Red", "#FF0000"),
    ORANGE("Orange", "#FF7F00"),
    YELLOW("Yellow", "#FFFF00"),
    GREEN("Green", "#00FF00"),
    BLUE("Blue", "#0000FF"),
    INDIGO("Indigo", "#4B0082"),
    VIOLET("Violet", "#8B00FF");

    fun printFullInfo() {
        println("Color - $color, rgb - $rgb")
    }
}

 

val rgb = Rainbow.RED
rgb.printFullInfo()

 

이제 우리는 Enum이 무엇이고 어떻게 만드는지 알았지만 대부분의 상황에서 그것만으로는 충분하지 않습니다. 이제 Enum이 Kotlin에서 즉시 제공하는 메서드와 속성을 알아볼 차례입니다.

name을 사용하면 Enum의 인스턴스 이름을 얻을 수 있습니다. 예를 들면 다음과 같습니다.

val color: Rainbow = Rainbow.RED
println(color.name)
RED

 

서수에는 Enum 인스턴스의 위치가 포함됩니다. 예를 들면 다음과 같습니다.

val color: Rainbow = Rainbow.GREEN
println(color.ordinal)
3

 

values()는 Enum의 모든 인스턴스 배열을 반환합니다. Enum 인스턴스를 반복하려는 경우 유용할 수 있습니다. 이제 특정 색상이 Rainbow의 일부인지 여부를 확인할 수 있습니다.

fun isRainbow(color: String) : Boolean {
    for (enum in Rainbow.values()) {
        if (color.toUpperCase() == enum.name) return true
    }
    return false
}
println(isRainbow("black"))
false
println(Rainbow.valueOf("RED"))
RED

 

valueOf()는 문자열 유형 및 대소문자 구분이 있는 이름으로 Enum의 인스턴스를 반환합니다.

println(Rainbow.valueOf("RED"))
RED

 

적절한 Enum 인스턴스가 없으면 IllegalArgumentException이 발생합니다. 이 방법은 대소문자를 구분합니다.

enum class Rainbow(val color: String, val rgb: String) {
    RED("Red", "#FF0000"),
    ORANGE("Orange", "#FF7F00"),
    YELLOW("Yellow", "#FFFF00"),
    GREEN("Green", "#00FF00"),
    BLUE("Blue", "#0000FF"),
    INDIGO("Indigo", "#4B0082"),
    VIOLET("Violet", "#8B00FF"),
    NULL("", "");

    fun printFullInfo() {
        println("Color - $color, rgb - $rgb")
    }
}

fun findByRgb(rgb: String): Rainbow {
    for (rainbow in Rainbow.values()) {
        if (rgb == rainbow.rgb) return rainbow
    }
    return Rainbow.NULL
}
println(findByRgb("#FF0001"))
NULL

 

왜 NULL인지 짐작하셨습니까? 알다시피 RGB 매개변수로 색상을 찾을 수 없는 경우 반환하기 위해 NULL 상수를 하나 더 추가했습니다. 이 예에서는 "#FF0001" RGB와 연결된 색상이 없으므로 출력은 NULL입니다.

 

결론 

위의 모든 정보를 요약해 보겠습니다. 간단히 말해서 Kotlin의 Enum은 상수 컬렉션을 위한 컨테이너입니다.

편의를 위해 상수의 이름과 순서를 가져올 수 있는 내장 속성과 메서드가 있습니다.

Enum의 모든 인스턴스를 가져오거나 그 중 하나만 얻을 수 있으며, 이는 삶을 더 쉽게 만들어 줄 것입니다. 원할 때마다 Enum을 확장할 수 있다는 것을 잊지 마십시오. 사용법을 알았으니 이제 연습할 준비를 합시다!

 

 

참고

https://hyperskill.org/learn/step/6245

 

Enum - Hyperskill — Learn programming by building your own apps

If you've ever used constants in programming, then you might have asked yourself: "How can I store a bunch of constants in one place and handle them all at the same time?" Well, for this question Kotlin has an answer and we call that answer Enums. Basicall

hyperskill.org