+ 항공대학교 김철기 교수님의 객체 지향 프로그래밍 과목 내용를 정리한 글입니다.
enum 클래스
특정 부류의 상수 집합을 표현하기 위한 클래스이다.
- 한정된 개수의 인스턴스를 갖고 있다. (추가로 인스턴스를 생성할 수 없다.)
< enum 클래스 내에 함수 구현 >
enum class WeekDay {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
// enum 클래스에서는 세미콜론을 사용하여 인스턴스 종류의 끝을 나타낸다.
fun isWorkDay() = this == SATURDAY || this == SUNDAY
}
fun main() {
println(WeekDay.MONDAY.isWorkDay()) // false
println(WeekDay.SATURDAY.isWorkDay()) // true
}
< 확장 개념을 사용하여 함수 구현 >
enum class WeekDay {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
// enum 클래스에서는 세미콜론을 사용하여 인스턴스 종류의 끝을 나타낸다.
}
fun WeekDay.isWorkDay() = this == WeekDay.SATURDAY || this == WeekDay.SUNDAY
fun main() {
println(WeekDay.MONDAY.isWorkDay()) // false
println(WeekDay.SATURDAY.isWorkDay()) // true
}
enum과 when
enum의 각 element에 대한 조건문을 만들 때 when이 편리하다.
(else 문이 필요없다.)
enum class Direction {
NORTH, SOUTH, WEST, EAST
}
fun Direction.rotateClockwise(direction: Direction) = when (this) {
Direction.NORTH -> Direction.EAST
Direction.EAST -> Direction.SOUTH
Direction.SOUTH -> Direction.WEST
Direction.WEST -> Direction.NORTH
}
fun main() {
val dir = Direction.NORTH
println(dir.rotateClockwise(dir)) // EAST
}
import를 통한 클래스 이름 생략
enum 클래스를 import하면 클래스 이름을 생략하여 짧게 이용할 수 있다.
import Direction.*
enum class Direction {
NORTH, SOUTH, WEST, EAST
}
fun Direction.rotateClockwise(direction: Direction) = when (this) {
NORTH -> EAST
EAST -> SOUTH
SOUTH -> WEST
WEST -> NORTH
}
fun main() {
val dir = NORTH
println(dir.rotateClockwise(dir)) // EAST
}
커스텀 멤버가 있는 enum 클래스
enum도 일반 클래스처럼 커스텀 멤버를 가질 수 있다. (세미콜론이 필요하다.)
import WeekDay.*
enum class WeekDay {
MONDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
// 모든 enum 인스턴스는 name이라는 프로퍼티를 갖는다.
val lowercaseName get() = name.lowercase() // 소문자로 된 name
fun isWorkday() = this == SATURDAY || this == SUNDAY
}
fun main() {
println(MONDAY.isWorkday()) // false
println(WEDNESDAY.lowercaseName) // wednesday
}
enum 클래스 생성자
enum 클래스에 생성자가 있으면 상수 정의에도 생성자 호출이 필요하다.
import RainbowColor.*
enum class RainbowColor(val isCold: Boolean) {
RED(false), ORANGE(false), YELLOW(false),
GREEN(true), BLUE(true), INDIGO(true), VIOLET(true);
val isWarm get() = !isCold
}
fun main() {
println(BLUE.isWarm) // false
println(RED.isWarm) // true
}
enum 클래스의 공통 멤버
모든 enum 클래스는 kotlin.Enum 클래스의 하위 타입으로 공통의 멤버를 갖는다.
- ordinal: 상수의 순번 (0부터 시작)
- name: 상수의 이름을 (String 타입)
import RainbowColor.*
enum class RainbowColor(val isCold: Boolean) {
RED(false), ORANGE(false), YELLOW(false),
GREEN(true), BLUE(true), INDIGO(true), VIOLET(true);
val isWarm get() = !isCold
}
fun main() {
println(RED.name) // RED
println(VIOLET.ordinal) // 6
}
enum 클래스 내 상수간의 비교
enum 클래스 내 상수 간 비교는 ordinal 값 간 비교와 같다.
import RainbowColor.*
enum class RainbowColor(val isCold: Boolean) {
RED(false), ORANGE(false), YELLOW(false),
GREEN(true), BLUE(true), INDIGO(true), VIOLET(true);
val isWarm get() = !isCold
}
fun main() {
println(RED == BLUE) // 0 == 4 => false
println(YELLOW != INDIGO) // 2 != 5 => true
println(YELLOW > ORANGE) // 2 > 1 => true
}
valueOf()와 values() 함수
valueOf()
=> name 문자열로부터 상수를 반환
values()
=> 모든 enum 값이 들어있는 배열을 반환
import RainbowColor.*
enum class RainbowColor(val isCold: Boolean) {
RED(false), ORANGE(false), YELLOW(false),
GREEN(true), BLUE(true), INDIGO(true), VIOLET(true);
val isWarm get() = !isCold
}
// RainbowColor의 모든 enum 인스턴스가 저장된 배열 생성
val rainbowColors = RainbowColor.values()
// 다음 ordinal에 해당하는 인스턴스 반환
fun RainbowColor.nextColor() = rainbowColors[(ordinal + 1) % rainbowColors.size]
fun main() {
println(RED.nextColor()) // ORANGE
println(VIOLET.nextColor()) // RED
}
'Study > Kotlin Study' 카테고리의 다른 글
[Kotlin] 부호 없는 정수 (0) | 2023.11.14 |
---|---|
[Kotlin] data 클래스 (0) | 2023.11.14 |
[Kotlin] 인터페이스 (3) | 2023.11.02 |
[Kotlin] 추상 클래스와 추상 멤버 (0) | 2023.11.02 |
[Kotlin] 공통 메소드 (1) | 2023.10.23 |