enum은 enumerated 의 약자로, Enum class는 열거하는 값들의 클래스라고 볼 수 있다.
어떤 변수의 값이 여러개의 옵션 중의 하나로 결정될 때 사용하면 좋다. ex) 동서남북, 요일 등
기본 사용법
각 enum은 쉼표( , )로 구분한다. 내부적으로 Comparable interface를 구현하고 있어서, toString( )을 포함한 편리한 기능을 추가 구현 없이 사용할 수 있다.
enum class Direction {
NORTH, SOUTH, WEST, EAST
}
val directions: Array<Direction> = Direction.values() // 모든 타입 인스턴스를 배열로 받는다.
속성값과 메소드
enum class의 각 enum은 속성값과 abstract function을 가질 수 있다.
역시 쉼표( , )로 구분하며, 마지막 enum 끝에만 세미콜론을 붙이자.
enum class Color(val rgb: Int) {
RED(0xFF0000){
override fun draw() {
println("red line")
}
},
GREEN(0x00FF00){
override fun draw() {
println("green line")
}
},
BLUE(0x0000FF){
override fun draw() {
println("blue line")
}
}; // <- 세미콜론
abstract fun draw()
}
속성값이 될 수 없는 식별자(Inbuilt properties)
모든 enum class들은 생성과 동시에 아래 두 속성을 가지게 된다. 이 이름을 내가 사용하려고 들면 안된다.
val name: String // 각 enum을 선언할 때 결정됨. toString()으로 얻을 수 있다.
val ordinal: Int // [Ordering](<https://kotlinlang.org/docs/collection-ordering.html>) 규칙에 따라 0 ~ n-1 의 값을 갖는다.
name을 통해 Enum 객체를 받고싶을 때 valueOf() 메서드를 사용할 수 있다.
enum class Direction {
NORTH, SOUTH, WEST, EAST
}
val north = try {
Direction.valueOf("NORTH")
} catch (e: Exception) {
e.printStackTrace() // 이름 틀리면 바로 exception 뜸
Direction.NORTH
}
속성값으로 enum 타입 찾기
'속성값으로 enum 객체 얻기 (value to enum)' 참고
EnumMap
enum에 따라 다른 값을 저장하고 싶을 때 사용할 수 있다.
내부 Ordering 규칙에 따라 순서가 지정되고, 이후로 이 순서가 유지된다.
HashMap과 달리 Hash 충돌의 위험이 없다는 것도 장점이다.
EnumMap 초기화
// 각 성적의 점수 컷을 저장하는 enum map을 만든다.
enum class Type {A,B,C,D}
// 1. EnumMap(m: MutableMap<K, out V>!) 생성자 사용.
val initmap = Type.values().associate { it -> it to 0 } // 모든 enum 객체와 Int 0을 페어링함.
val enumMap1 = EnumMap(initmap)
// 2. **EnumMap(keyType: Class<K>!)** 생성자 사용. 빈 맵이 생성됨.
val enumMap2 = EnumMap<Type, Int>(Type::class.java)
Getter / Setter
: 일반적인 map과 방법이 같다.
참고한 자료
Kotlin 공식문서 : https://kotlinlang.org/docs/enum-classes.html
Enum Map 공식문서 : https://developer.android.com/reference/kotlin/java/util/EnumMap
참고자료 : https://medium.com/lucky-sonnie/item-37-ordinal-인덱싱-대신-enummap을-사용하라-작성중-8889791bc7e1
'프로그래밍 언어 > Kotlin' 카테고리의 다른 글
[JUnit] assert 함수 종류 (0) | 2022.10.05 |
---|---|
[IntelliJ] JUnit5 라이브러리 maven으로 적용하기 (0) | 2022.10.05 |
Kotlin의 class(3) - Nested and inner classes (0) | 2022.10.03 |
Kotlin의 class(2) - abstract class와 interface (0) | 2022.10.03 |
Kotlin의 class(1) - 생성 및 상속 (1) | 2022.10.03 |