enum이 무엇인지 enum class엔 무엇이 정의되는지 언제 쓰면 좋은지 알아보자. 그다음 kotlin의 sealed class를 알아보고 enum과 비교해보자.
런타임: 컴퓨터 프로그램이 실행되고 있는 동안의 동작
컴파일 타임: compile 과정을 통해 컴퓨터가 이해할 수 있는 기계어로 변환되는 과정
1) 특정값으로 초기화 할 수 있다.
enum class Direction{
NORTH, SOUTH, WEST, EAST
}
enum class Color(var rgb: Int){
RED(0xFF0000),
GREEN(0x00FF00),
Blue(0x0000FF)
}
fun main(){
println(Direction.NORTH.toString())
println(Color.Red.rgb.toString(16))
}
2) 자신의 anonymous class들과 method들을 선언할 수 있고 base method를 override 할 수 있다.
재사용할 필요가 없는 일회성 클래스를 굳이 클래스를 정의하고 생성하는 것이 비효율적이기 대문에, 코드를 줄이는 일종의 기법
enum class ProtocolState{
WAITING{
override fun signal() = TALKING
},
TALKING{
override fun signal() = WAITING
},
abstract fun signal(): Protocolstation
}
3) 상속 대신 interface를 사용
상속: is-a관계, 현대차는 자동차
인터페이스: can-do 관계, has-a 관계, 나는 모바일 앱 개발도 할 수 있고, 웹 개발 도 할수 있다, 나는 노트북도 있고 컴퓨터도 있다.
4) 정의된 enum constant를 리스트화 할 수 있고 이름으로 enum constant를 얻을 수 있는 synthetic method를 가진다.
// EnumClass is the name of enum class
EnumClass.valueOf(value: String): EnumClass
EnumClass.values(): Array<EnumClass>
println(Direction.valueOf("NORTH"))
println(Direction.values().joinToString())
// output:
// NORTH
// NORTH, SOUTH, WEST, EAST
대수적타입이란? 부분으로 전체를 나타내는 타입. 곱타입과 합타입으로 분리 가능
https://velog.io/@ehgus8621/kotlin-%EB%8C%80%EC%88%98%EC%A0%81-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85%EC%9D%B4%EB%9E%80
1) enum
2) sealed
3) 비교
메모리 관점에서는 enum이 더 효율적이다. 간단한 상태 정의를 위함이라면 enum을 사용, 하지만 성능적으로는 sealed가 우세하므로 동작을 명령하는 등의 정확한 명령이 포함될 계획이라면 sealed class를 사용
https://eatnows.tistory.com/91
https://iosroid.tistory.com/66