Uknow's Lab.
article thumbnail

 

 

이번에 알아볼 것은 열거형 클래스 Enum 입니다.

Enum은 Enumeration의 줄임말로써, 말 그대로 속성들을 나열한 클래스를 의미합니다.

 

자동차가 있습니다.

저는 이 자동차의 상태를 표현하고 싶습니다.

자동자의 상태는 대략 시동 꺼짐(off), 정지(stop), 주행중(drive), 주유중(refuel)으로 나눴습니다.

 

 

String을 사용하여 상태 표현하기

class CAR {
	var state = "DRIVE"
}

fun main() {
	val car1 = CAR()
	car1.state = "STOP"

	val car2 = CAR()
	car2.state = "OFF"
	
}

 

저는 이러한 속성들을 String으로 표현하는건 그리 좋아하진 않습니다.

오타도 자주 나고, 미리 정의해놓는게 그냥 문서로 정의해놓고 봐야지,

코드 상으로 미리 정의가 안되니까요.

 

 

Int를 사용한 상태 표현

class CAR {
	var state = 0
}


fun main() {
	val car1 = CAR()
	car.state = 0
	
	val car2 = CAR()
	car.state = 1
}

 

오타를 자주 낸 저는 결국 상태와 같은 걸 표현할 때 숫자를 쓰곤 했습니다.

0 - off, 1 - stop, 2 - drive, 3 - refuel과 같이 저만의, 혹은 팀원간의 규칙을 정해서요.

하지만, 여전히 이는 종이 or 워드 문서 상으로 정의해놓고 필요할 때마다 보면서 하는,

코드 상으로 미리 정의해놓는게 불가능했습니다.

 

따라서, 상태 관련 코드를 삽입할 땐, 상태를 정의해 놓은 문서를 보기가 귀찮아

항상 주석으로 // 0 - off, 1 - stop, 2 - drive, 3 - refuel 등으로 적어놓곤 했습니다.

 

 

정적 클래스를 사용한 상태 표현

object STATE {
    const val OFF = 0
    const val STOP = 1
    const val DRIVE = 2
    const val REFUEL = 3
}

class Car {
    val state = STATE.OFF
}

fun main() {
	val car1 = CAR()
	car1.state = STATE.DRIVE
	val car2 = CAR()
	car2.state = STATE.REFUEL	
}

 

그리고 이러한 상태를 별도의 클래스로 따로 분리하여, 관리함으로써

코드에 미리 정의하여 불러오기도 편하고, 오타 걱정도 없고,

손쉽게 관리할 수 있는 방법을 떠올렸습니다.

 

 

Enum...! 너 이넘...! 왜 이제야 알게 된거야!

enum class STATE {
    OFF, STOP, DRIVE, REFUEL
}

class CAR {
    var state: STATE = STATE.OFF
}

fun main() {
    val car1 = CAR()
    car1.state = STATE.DRIVE

    val car2 = CAR()
    car2.state = STATE.REFUEL

 

그러던 중, enum이라는 클래스를 알게되었습니다.

별도의 정적(static/companion object) 클래스를 만드는 것보다 간편하게,

 

서로 관련있는 상수들을 쉽게 관리할 수 있습니다.

 

 

// 클래스를 통한 관리

class Color(val r: Int, val g: Int, val b: Int)

val RED = Color(255, 0, 0)
val GREEN = Color(0, 255, 0)
val BLUE = Color(0, 0, 255)

클래스를 통해 관리할 경우, 각각의 케이스에 대해 별도의 인스턴스화가 필요함.


====================================================


// enum을 통한 관리

enum class Color(val r: Int, val g: Int, val b: Int) {
    RED(255, 0, 0),
    GREEN(0, 255, 0),
    BLUE(0, 0, 255),
    YELLOW(255, 255, 0),
    CYAN(0, 255, 255),
    MAGENTA(255, 0, 255),
    BLACK(0, 0, 0),
    WHITE(255, 255, 255); // enum에서 멤버변수 정의 시 마지막에 ;를 붙여줘야 함

    fun printRGB() {
        println("$r, $g, $b")
    }
}

fun main() {
    val color = Color.BLUE
    color.printRGB()
}

// 출력
>>> 0, 0, 255

 

enum 클래스는 단순 속성들을 열거할 뿐만 아닌, 멤버변수와 메소드를 가질 수 있습니다.

유사한 속성들을 통합하여 관리하기 아주 편리하죠.

 

 

Enum의 모든 속성 가져오기

enum class Color(val r: Int, val g: Int, val b: Int) {
    RED(255, 0, 0),
    GREEN(0, 255, 0),
    BLUE(0, 0, 255),
    YELLOW(255, 255, 0),
    CYAN(0, 255, 255),
    MAGENTA(255, 0, 255),
    BLACK(0, 0, 0),
    WHITE(255, 255, 255);

    fun printRGB() {
        println("$r, $g, $b")
    }
}

fun main() {
    for (color in Color.values()) {
        print("${color.name} ")
        color.printRGB()
    }
}


// 출력
>>> RED 255, 0, 0
GREEN 0, 255, 0
BLUE 0, 0, 255
YELLOW 255, 255, 0
CYAN 0, 255, 255
MAGENTA 255, 0, 255
BLACK 0, 0, 0
WHITE 255, 255, 255

 

enum에서는 (Enum).values()를 통해 모든 속성을 가져올 수 있습니다.

profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.