Enum은 클래스 내에 상수들을 열거해 관리하는 문법으로, 각 상수들은 객체처럼 property와 function을 가질 수 있는 특징이 있습니다.
Stable replacement of the enum class values function
Enum 클래스의 열거된 상수들을 연속적으로 접근하고 싶을 때 values 함수를 자주 사용했었는데요. 그러다 최근 Kotlin 1.9.0 버전으로 업그레이드를 하니 values 대신 entries 속성을 사용하길 권장합니다.
Enum의 entries는 kotlin 1.8.20에서 Beta 기능으로 처음 등장했고 kotlin 1.9.0 버전에서 정식으로 Stable 되었습니다.
entries 속성도 values와 동일하게 열거된 상수들을 연속적으로 접근할 수 있습니다. 아니 애초에 values 함수를 대체하기 위해 추가된 속성입니다.
Entries의 탄생 배경, Values 함수의 문제점
https://github.com/Kotlin/KEEP/blob/master/proposals/enum-entries.md#examples-of-performance-issues
Enum values 함수는 한 가지 문제점이 있었습니다. 바로 열거된 상수들을 배열 형태로 반환한다는 것입니다.
배열은 기본적으로 내부 요소가 변경될 수 있기 때문에 Enum의 values는 매번 객체를 생성하는 구조로 설계될 수밖에 없었습니다. 이러한 단점은 Enum values 함수를 사용하는 개발자에게 공개되어 있지 않기 때문에 숨겨져 있는 성능 이슈라고 판단했던 것 같습니다.
또한 Kotlin에서는 배열보단 컬렉션 객체를 많이 사용하기 때문에 매번 개발자가 배열을 컬렉션으로 변경해야 하는 번거로움이 존재했을 것이라고 합니다.
fun main() {
println(Color.values())
println(Color.entries)
}
//출력
[LColor;@2f7a2457
[RED, BLUE, Green]
개선된 entries 속성 살펴보기
배열이 아닌 컬렉션 객체로 반환
@SinceKotlin("1.9")
@WasExperimental(ExperimentalStdlibApi::class)
public sealed interface EnumEntries<E : Enum<E>> : List<E>
entries 속성은 List를 상속받는 EnumEntries interface를 반환합니다. 문서에서는 List 클래스를 사용할 수 없는 이유를 설명해주고 있는데요. 나름 인상적이었습니다.
첫 번째 이유는 일반적으로 List는 값을 변경할 수 없는 Immutable 객체를 의미하지만 개발자가 코드에서 타입 캐스팅으로 충분히 mutable 객체로 변경될 수 있는 위험이 있다는 것입니다. 이는 장기적인 해결책이 될 수 없다고 합니다.
두 번째 이유로는 List 형태로 반환이 되면 이후 해당 리스트의 요소들이 Enum의 열거된 모든 상수를 가지고 있다는 의미가 퇴색될 수 있다는 것입니다. 따라서 EnumEntries라는 이름의 객체로 반환해서 해당 값이 항상 열거된 상수들의 리스트 객체임을 쉽게 알 수 있게 하도록 의도했습니다.
entries 지연 초기화 및 재사용
문서에서 설명한 Entries 설계 코드를 보면 컴파일 시점에 Entries 객체를 내부에 생성하고 개발자가 entries 속성에 접근할 때마다 미리 생성한 Entries 객체를 재사용하는 것을 확인할 수 있습니다.
'Language > kotlin' 카테고리의 다른 글
[Kotlin] 데이터 표현을 위한 Data Object (0) | 2024.03.26 |
---|---|
[Kotlin] Singleton (0) | 2020.06.01 |
[Kotlin] - 기본문법 2 (0) | 2020.02.10 |
Kotlin의 유용한 함수들 - let, apply, run, with (0) | 2020.02.10 |
[Kotlin] Kotlin을 왜 배워야 할까요? (0) | 2020.02.10 |