본문 바로가기

Study/Kotlin Study

[Kotlin] enum 클래스

+ 항공대학교 김철기 교수님의 객체 지향 프로그래밍 과목 내용를 정리한 글입니다.

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