[Kotlin] Enum class

최율·2022년 12월 6일
0

Kotlin

목록 보기
3/10

Enum Class 란?

열거형(또는 열거형 형식)은 기본 정수 숫자 형식의 명명된 상수 집합에 의해 정의되는 값 형식입니다. 열거형을 정의하려면 enum 키워드를 정의하고 열거형 멤버의 이름을 지정합니다.
from: link

Enum이 무엇인지 제대로 아는 것보다 어떤 때 사용하는지 생각하면 Enum이 무엇이고 왜 필요한지 알 수 있다.

Enum Class 예제

사용자의 인적사항을 받아 기록하는 프로그램이 있다고 가정하자.
인적사항 중 성별은 2가지 중 하나로 이를 판단하기 위해 다음과 같은 객체를 만들었다.

class Person(val name: String, val gender: Int) 

성별이 2가지인 경우 gender를 0 혹은 1로 받아 남자인지 여자인지 구분할 수 있다.
그런데 요즘은 어느시대인가? 정치적으로 올바른 시대아닌가?

그렇기에 제 3의 성을 추가하려고 하면, Person의 리팩토링이 힘들 뿐 아니라 성별이 새로 추가될수록 어떤 숫자가 어떤 성별을 의미하는지 알기 힘들다.
그렇다면 새로운 Enum Class 다음과 같이 정의 해보자.

enum class Gender {
    MALE, FEMALE, MEFALE // 제 3의 성 추가
}

class Person(val name: String, val gender: Gender) {

}

fun main() {
	val me = Person("율초이", Gender.MALE)
}

확실히 성별을 나타내기 위해 숫자(0, 1, 2...)를 사용하는 것보다 enum을 사용하는것이 명시하기 편하다.

Enum Class 의 다양한 기능들

멤버 변수

놀랍게도, enum class 는 추상 클래스이기 때문에 각 enum마다 멤버 변수가 존재한다.
1. name : enum class의 문자열을 반환한다.

fun main(){
	val me = Person("율초이", Gender.MALE)
    println(me.gender.name) // MALE 출력
}
  1. ordinal : enum class의 인덱스를 반환한다.
enum class Gender {
    MALE, FEMALE, MEFALE // 0, 1, 2
}

fun main() {
	val me = Person("율초이", Gender.MALE)
    println(me.gender.ordinal) // 0
}

2-1. 순서 비교

fun main() {
	println(Gender.MALE > Gender.FEMALE) // false
}

enum class 의 원소를 비교 연산자로 비교할 경우 ordinal을 기준으로 비교한다.

메서드

enum class는 2가지 메서드가 존재한다.
nameordinalenum class의 각 원소의 멤버 변수였다면 이 메서드는 enum class의 메서드임으로 주의하자!

여튼 메서드를 알아보면
1. values() : 해당 enum class의 배열을 반환한다.

enum class WeekDay {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
fun main() {
	val days = WeekDay.values()
    for (day in days) {
    	println(day.name)
    }
    // MONDAY 부터 SUNDAY까지 출력됨
}
  1. valuesOf() : name 문자열로부터 enum object 를 얻어온다.
enum class WeekDay {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
fun main() {
	println(WeekDay.valuesOf("MONDAY")) // MONDAY 반환되어 출력됨
    println(WeekDay.valuesOf("MONDAY").ordinal) // MONDAY의 ordinal 출력
}

멤버 함수 및 생성자

위 메서드 values()valueOf() 함수에서 보았듯, enum class에 메서드가 존재한다.
그렇다면, 임의로 메서드를 정의할 수 있을까? 답은 Yes다! 당장 코드를 살펴보자.

멤버 함수

enum class WeekDay {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
    // enum class 에서 enum 선언이 끝나고 멤버를 선언하려면 ; 를 붙여줘야 한다.
    fun isWeekend() = this == WeekDay.SATURDAY || this == WeekDay.SUNDAY
}

fun main() {
	println(WeekDay.MONDAY.isWeekend()) // false
}

values()valueOf()와 다른 점이 있다면, 이 두 함수는 enum class에서 호출 가능하지만,
임의로 선언한 함수는 enum class 내의 object에서 호출할 수 있다.

생성자

enum class를 선언할 때 생성자도 명시할 수 있는데 다음의 예시를 보자

enum class Gender(val isPC: Boolean) {
    MALE(false), FEMALE(false), MEFALE(true)
}

fun main() {
	println(Gender.MEFALE.isPC) // true
}

성별이 정치적으로 올바른지 아닌지를 뜻하는 프로퍼티를 생성자에 명시하였다.
정말 놀라운 기능이다.

사용 방법은 무궁무진하니 잘 활용해보자~

profile
공부한 것을 기록하고 공유하는 학생입니다!

0개의 댓글