References: Do it! 코틀린 프로그래밍

코틀린에서의 봉인 클래스와 열거형 클래스에 대해 알아봅니다.

 

 

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

+ Recent posts