개발일지

Kotlin in A..Z (23) - 열거형 클래스, 실드 클래스 본문

Kotlin (코틀린)

Kotlin in A..Z (23) - 열거형 클래스, 실드 클래스

강태종 2020. 7. 17. 18:21

- 열거형 클래스 (Enum Class)

Java의 Enum Class와 매우 유사하다

 

코드

enum class Direction {
    NORTH, SOUTH, WEST, EAST
}

- 멤버를 가지는 열거형 클래스

프로퍼티와 메서드를 가질 수 있다.

 

코드

enum class Direction(private val value: Int = 0) {
    NONE {
    	val str: String = "None"
    }, NORTH(1), SOUTH(2), WEST(3), EAST(4);

    fun getValue() {
        println(value)
    }
}

- 인터세이스를 상속받는 열거형 클래스

인터페이스를 상속받고 개별적, 통합적으로 재정의할 수 있다.

 

코드

enum class Direction(private val value: Int = 0) : Action {
    NONE {
        // 개인적인 오버라이딩
        override fun action() {
            println("NONE")
        }
    },
    NORTH(1) {
        // 개인적인 오버라이딩
        override fun action() {
            println("Go North")
        }
    },
    SOUTH(2) {
        // 개인적인 오버라이딩
        override fun action() {
            println("Go South")
        }
    },
    WEST(3) {
        // 개인적인 오버라이딩
        override fun action() {
            println("Go West")
        }
    }, EAST(4);

    fun getValue() {
        println(value)
    }

    // 통합적인 오버라이딩
    override fun action() {
        println("Go $value")
    }
}

- when문을 이용한 케이스 처리

when은 기본적으로 else가 필수이지만, 모든 경우를 brach할 경우 else를 생략할 수 있다.

코드

enum class Direction {
    NONE, NORTH, SOUTH, WEST, EAST
}

fun action(direction: Direction) = when(direction) {
    Direction.NONE -> {
        
    }
    
    Direction.NORTH -> {
        
    }
    
    Direction.SOUTH -> {
        
    }
    
    Direction.EAST -> {
        
    }
    
    Direction.WEST -> {
        
    }
}

- 실드 클래스 (Sealed Class)

Enum 클래스의 확장형이다.

기본이 abstract 클래스이고 생성자는 private이기 때문에 인스턴스를 만들 수 없다.

같은 파일 안에서만 상속이 가능하다. (다른 파일에선 상속이 불가)

Enum과 달리 서로 다른 생성자를 가진 class를 만들 수 있다.

 

코드

sealed class State {
    abstract fun action()
}

class Slow(val time: Int, val speed: Int) : State() {
    override fun action() {
        println("SLOW")
    }
}

class Air(val time: Int) : State() {
    override fun action() {
        println("Air")
    }
}
Comments