[코틀린기초] 34. 실드 클래스

‘봉인된’ 이라는 의미로 무언가 안전하게 보관하기 위해 묶어 두는 것

sealed 키워드를 이용함

실드 클래스 그 자체로는 추상 클래스와 같아 인스턴스 생성 불가능

생성자가 기본적으로 private, private이 아닌 생성자 허용x

실드 클래스는 같은 파일 안에서는 상속이 가능

블록 안에 선언되는 클래스는 상속이 필요한 경우 open 키워드로 선언

실드 클래스는 상태를 정의하고 관리하는데 주로 사용한다!

  // 실드 클래스 선언 방법 첫번째
  
  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")  //  내부 클래스 상속
  // 실드 클래스 선언 방법 두번째
  sealed class Result
  
  open class Success(val message: String) : Result()
  class Error(val code: Int, val message: String): Result()
  
  class Status: Result()
  class Inside: Success("Status")
  
  fun main(){
    val result = Result.Success("Good!")
    val msg = eval(result)
    println(msg)
  }
  
  fun eval(result: Result): String = when(result){
    is Status -> "in progress"
    is Result.Success -> result.message
    is Result.Error -> result.message
    //모든 조건을 가지므로 else가 필요가 없다! 다른 값이 들어오는 등 불안정한 상태를 방지할 수 있음
  }

열거형 클래스

여러 개의 상수를 선언하고 열거된 값을 조건에 따라 선택할 수 있는 특수한 클래스

자료형이 동일한 상수를 나열할 수 있다.

실드 클래스처럼 다양한 자료형을 다루지 못한다.

  enum class Direction{
    NORTH, SOUTH, WEST, EAST
  }
  
  enum class DayOfWeek(val num: Int){
    MONDAY(1), TUESDAY(2), WEDNESDAY(3), THURSDAY(4),
    FRIDAY(5), SATURDAY(6), SUNDAY(7)
  }
  
  val day = DayOfWeek.SATURDAY
  when(day.num){
    1,2,3,4,5 -> println("Weekday")
    6,7 -> println("Weekend!")
  }

##### 메서드가 포함되는 경우

  enum class Color(var r: Int, var g:Int, var n: Int){
    RED(255,0,0), ORANGE(255,165,0),
    YELLOW(255,255,0), GREEN(0,255,0), BLUE(0,0,255); // 세미콜론으로 끝을 알리고 메서드 선언
    
    fun rgb(r*256 + g) * 256 + b  //  메서드를 포함할 수 있음
  }
  
  fun main(){
    println(Color.BLUE.rgb())
  }

##### 인터페이스를 통한 enum 클래스 구현

  interface Score{
    fun getScore(): Int
  }
  
  enum class MemberType(var prio: String): Score{ //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.GOLD)
    println(MemberType.valueOf("SILVER"))
    println(MemberType.SILVER.prio)
    
    for(grade in MemberType.values()){
      println("grade.name = ${grade.name}, prio = ${grade.prio}")
    }
  }

애노테이션 클래스

애노테이션이란 코드에 부가 정보를 추가하는 역할

@ 기호와 함께 나타내는 표기법으로 주로 컴파일러나 프로그램 실행 시간에서 사전 처리를 위해 사용

  annotation class 애노테이션명

애노테이션 속성

사용 예는 다음과 같다

  @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION)
  @Retention(AnnotationRetention.SOURCE)  // 컴파일 시간에 제거됨
  @MustBeDocumented
  annotation class Fancy