Development record of developer who study hard everyday.

레이블이 코틀린enum인 게시물을 표시합니다. 모든 게시물 표시
레이블이 코틀린enum인 게시물을 표시합니다. 모든 게시물 표시
, ,

코틀린 enum class 개념 정리

 코틀린 enum class 개념 정리

안드로이드 개발 블로그

지금 회사에 입사하기 전에 코틀린을 아예 몰랐다....

자바로만 안드로이드 개발을 공부하다가 뒤늦게 취업을 해야겠다 싶어서 지금 회사에 들어왔다.

그래서 들어오자마자 코틀린 공부에 열을 올렸다.

코틀린을 공부하면서 enum 클래스에 대한 개념은 자바와 똑같기 때문에 이해하고 있지만 막상 쓰려고하면 망설임이 있었다.

그래서 이번에 블로그에 기록하면서 제대로 공부해보려고한다.


1. 정의 

enum은 열거형 클래스라고 한다.

주로 클래스의 타입을 구분하기 위해 사용한다.

자바에서는 enum을 사용하는데 코틀린에서는 enum class를 사용한다.

선언하는 방식은 아래와 같다.

enum class Color {
RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET
}

각 enum 상수는 객체이다.

enum 상수는 ,(콤마)로 구분된다.

각 enum은 enum class의 객체이기때문에 초기화될 수 있다.

enum class Color(val rgb: Int) {
RED(0xFF0000),
GREEN(0x00FF00),
BLUE(0x0000FF)
}


2. 프로퍼니와 메서드 정의하기

enum은 단순히 값만 열거하는 존재가 아니다.

enum 클래스 안에도 프로퍼티나 메서드를 정의할 수 있다.

enum class Color(val r: Int, val g:Int, val b: Int) {
RED(255, 0, 0), ORANGE(255, 165, 0), //생성자 파라미터 형태로 프로퍼티 값 지정
YELLOW(255, 255, 0), GREEN(0, 255, 0),
BLUE(0, 0, 255), INDIGO(75, 0, 130),
VIOLET(238, 130, 238);    //여기 반드시 세미콜론 사용

fun rgb() = (r * 256 + g) * 256 + b    //메서드 정의
}

enu에서도 일반적인 클래스와 마찬가지로 생성자와 프로퍼티를 생성한다.

enum 상수를 정의할 때 그 상수에 해당하는 프로퍼티 값을 지정해야만 한다.

enum 클래스 안에 프로퍼티나 메서드를 정의하는 경우 반드시 enum 상수 목록과 메서드 정의 사이에 세미콜론을 넣어야한다.


3. 익명 클래스

enum 상수들은 익명객체를 선언할 수 있다.

그리고 메소드를 상속거나 구현할 수도 있다.

enum class ProtocolState {
WAITING {
override fun signal(): ProtocolState = TALKING

},
TALKING {
override fun signal(): ProtocolState = WAITING
};

abstract fun signal() : ProtocolState
}


4. interface 구현하기

enum class는 interface를 구현할 수 있다.(하지만 클래스는 상속할 수 없다.)

한번에 공통의 인터페이스 멤버를 구현할 수도 있고(applyAsInt()) 익명 클래스를 만들어서 각각 구현할 수도 있다.(apply()) 

enum class IntArithmetics : BinaryOperator<Int>, IntBinaryOperator {
PLUS {
override fun apply(t: Int, u: Int): Int = t + u
}
,
TIMES {
override fun apply(t: Int, u: Int): Int = t * u    //익명 객체에 각각 구현
}
;

override fun applyAsInt(t: Int, u: Int): Int = apply(t, u)    //공통의 인터페이스 멤버 구현
}


5. enum 상수 활용하기

enum class는 enum 상수 목록을 보여주는 메서드와 이름으로 enum 상수를 가져오는 메서드를 제공한다.

EnumClass.valueOf(value: String): EnumClass
EnumClass.values(): Array<EnumClass>


6. ordinal 과 name

모든 enum 상수들은 ordinal과 name 프로퍼티를 가진다.

ordinal을 사용하면 해당 타입이 enum에서 몇 번째 타입인지 알 수 있다.

단, 인덱스가 0부터 시작한다.

val type : Color = Color.ORANGE
println("Orange의 순서는 ${type.ordinal}번째 입니다")  

위 코드를 실행하면,

"Orange의 순서는 1번째 입니다." 라고 나온다.


Share:
Read More