이번에 알아볼 것은 열거형 클래스 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()를 통해 모든 속성을 가져올 수 있습니다.
'코틀린 파헤치기 > 2부. 코틀린 객체지향' 카테고리의 다른 글
[코파기 2부] 9. 코틀린과 정적 (Object/Companion Object) (2) | 2023.03.15 |
---|---|
[코틀린 2부] 8. 코틀린과 상수 Const (0) | 2023.03.15 |
[코파기 2부] 6. 코틀린과 늦은 초기화 : lazy, lateinit (0) | 2023.03.15 |
[코파기 2부] 5. 코틀린과 추상 클래스와 인터페이스 (+ 둘의 차이점) (3) | 2023.03.15 |
[코파기 2부] 4. 코틀린과 접근 제한자 (0) | 2023.03.15 |