코틀린에서의 봉인 클래스와 열거형 클래스에 대해 알아봅니다.
1. 봉인(Sealed) 클래스
실드(Sealed) 클래스는 미리 만들어 놓은 자료형들을 묶어서 제공합니다.
따라서 어떤 의미에서는 열거형(Enum) 클래스의 확장으로 볼 수도 있습니다.
실드 클래스는 sealed 키워드를 통해 선언할 수 있습니다.
실드 클래스는 추상 클래스와 같기 때문에 객체를 만들 수 없습니다.
실드 클래스는 private 이 아닌 생성자는 허용하지 않습니다.
실드 클래스는 같은 파일안에서만 상속을 허용합니다.
다음 예제를 통해 실드 클래스에 대해 알아보도록 하겠습니다.
sealed class Result{
open class Success(val message: String): Result()
class Error(val code: Int, val message: String): Result()
}
class Status: Result()
class Inside: Result.Success("Status")
fun eval(result: Result): String = when(result) {
is Status -> "in progress"
is Result.Success -> result.message
is Result.Error -> result.message
}
fun main() {
val result = Result.Success("Good!")
val msg = eval(result)
println(msg)
}
- sealed class Result: 실드 클래스를 선언합니다.
- class Stauts: Result(): 실드 클래스를 상속합니다. 같은 파일에서만 가능합니다.
- class Inside: Result.Success("Status"): 내부 클래스 상속
위의 코드를 실행하면 다음과 같은 결과를 확인할 수 있습니다.
실드 클래스는 특정 객체 자료형에 따라 when문과 is에 의해 선택적으로 실행할 수 있습니다.
2. 열거형 클래스
열거형 클래스는 여러 상수를 선언하고 열거된 값을 조건에 따라 선택할 수 있는 특수한 클래스입니다.
열거형 클래스는 실드 클래스처럼 다양한 자료형을 다룰 순 없습니다.
열거형 클래스는 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
}
fun getColor(color:Color) = when(color) {
Color.RED -> color.name
Color.ORANGE -> color.ordinal
Color.YELLOW -> color.toString()
Color.GREEN -> color
Color.BLUE -> color.r
Color.INDIGO -> color.g
Color.VIOLET -> color.rgb()
}
fun main() {
println(Color.BLUE.rgb())
println(getColor(Color.BLUE))
}
- enum class Color: enum 키워드를 이용해 열거형 클래스를 선언합니다.
- VIOLET(238, 130, 238); : 세미콜론을 통해 끝을 알려줍니다.
위의 코드를 실행하면 다음과 같은 결과를 확인할 수 있습니다.
열거형 클래스에서 인터페이스의 메서드를 구현할 수도 있습니다.
다음 예제를 통해 인터페이스의 메서드를 구현하는 방법을 알아봅시다.
interface ScoreScore { fun getScore(): Int}
enum class MemberType(var prio: String): Score {
NORMAL("Third"){ override fun getScore(): Int = 100},
SILVER("Second"){ override fun getScore(): Int = 500},
GOLD("First"){ override fun getScore(): Int = 1500}
}
fun main() {
println(MemberType.NORMAL.getScore())
println(MemberType.GOLD)
println(MemberType.valueOf("SILVER"))
println(MemberType.SILVER.prio)
for( grade in MemberType.values() ){ println("grade.name = ${grade.name}, prio = ${grade.prio}") }
}
- interface Score: 인터페이스를 선언합니다.
- enum class MemberType: 인터페이스를 구현하는 열거형 클래스입니다.
- for( grade in MemberType.values() ): 열거형 클래스의 모든 값을 가져오는 반복문입니다.
위의 코드를 실행하면 다음과 같은 결과를 확인할 수 있습니다.
'Programming' 카테고리의 다른 글
[Kotlin] 36. 연산자 오버로딩 (0) | 2019.09.16 |
---|---|
[Kotlin] 35. 어노테이션 클래스 (0) | 2019.09.16 |
[Kotlin] 33. 내부 클래스 (0) | 2019.09.16 |
[Kotlin] 32. 데이터 클래스 (0) | 2019.09.12 |
[Kotlin] 31. 인터페이스 (0) | 2019.09.12 |