세상을 더 편리하게
728x90

실드 클래스 ( Sealed Class )

 실드 클래스는 다음과 같은 특성을 지닌다.

  1. 추상클래스와 같기 때문에 객체를 생성할 수 없다

  2. 생성자는 private 이여야만 한다.

  3. 실드 클래스는 같은 파일 안에서만 상속이 가능하다.

  4. 블록 안에 선언되는 클래스는 상속이 필요한 경우 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")

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)
}

실드 클래스는 손 쉽게 생각해서 클래스의  집합체라고 보면 편할 것이다.

16줄에 result가 Success 클래스로 들어가고 eval 매소드에서 Success 클래스이므로 11번째 줄이 실행이 되면

16줄에 2번 줄 코드 message = Good 이므로 결과 값은 Good 일 것이다.

이처럼 sealed 클래스는 eval 매소드 처럼 when 이랑 같이 쓰인다.

열거형 클래스 ( Enum Class )

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

enum class Brush(var prio:Int) {
    THIN(4),			// 상수1(값),
    NORMAL(5),			// 상수2(값),
    THICK(6);			// 상수3(값);
}

fun main() {
    println(Brush.THIN.prio)
    println(Brush.NORMAL.prio)
    println(Brush.THICK.prio)

    println(Brush.THIN)
    println(Brush.NORMAL)
    println(Brush.THICK)
}

/*
4
5
6
THIN
NORMAL
THICK
*/

enum 클래스를 가장 쉽게 표현한 코드가 위에 코드이다. 상수에 따라서 prio 값이 바뀐다. 그리고 상수 자체를 출력할 수 있다.

만약 enum 클래스와 인터페이스가 만나면 어떻게 구현될까?

interface Score {
    fun getScore(): Int
}

enum class MemberType(var prio: String) : Score {
    NORMAL("Third") {
        override fun getScore() = 100
    },
    SILVER("Second") {
        override fun getScore() = 500
    },
    GOLD("First") {
        override fun getScore() = 1500
    };
}

fun main() {
    println("|" + MemberType.NORMAL.getScore() + "|" + MemberType.SILVER.getScore() + 
    		"|" + MemberType.GOLD.getScore())

    println("|" + MemberType.NORMAL + "|" + MemberType.SILVER + "|" + MemberType.GOLD)

    println("|" + MemberType.NORMAL.prio + "|" + MemberType.SILVER.prio + 
    		"|" + MemberType.GOLD.prio)
}
/*
|100|500|1500
|NORMAL|SILVER|GOLD
|Third|Second|First
*/

 

다음과 같이 모든 상수에 인터페이스의 매소드를 override 해야 한다. 

enum 클래스는 다음과 같은 특성을 갖는다.

  1. 클래스를 상속 받을 수 없고 상속 할 수도 없다.

728x90

'Programming > Kotlin' 카테고리의 다른 글

[Kotlin] 제네릭 / Generic  (0) 2020.03.19
[Kotlin] 연산자 오버로딩  (0) 2020.03.18
[Kotlin] 내부 클래스(1)  (0) 2020.03.15
[Kotlin] 데이터 클래스  (0) 2020.03.15
[Kotlin] 인터페이스  (0) 2020.03.14
profile

세상을 더 편리하게

@쵱니

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!