Enum Class: enumEntries

박양원·2024년 5월 9일
0

Kotlin

목록 보기
2/2
post-thumbnail

개요

사내 프로젝트의 Kotlin Migration을 진행하던 도중 Java와는 달리 새롭게 알게 된 Enum 전체 요소를 가져오는 방식과 그 차이에 대하여 정리하고자 한다.

Kotlin의 요소 탐색

java에서 Enum의 전체 요소를 가져오는 경우 흔히 아래와 같은 식의 방법을 사용한다.

Enum.values()

하지만 이를 kotlin에서 그대로 사용하면 IDE에서 아래와 같은 경고(?)가 뜬다.

enum values warning

친절하게도 values() 메소드를 entries() 메소드로 대체하기를 추천해준다. 대체 두 방식의 차이가 무엇이고 어떠한 이점이 있길래 IDE에서 이렇게까지 추천해주는지 알아보자.

values()

java와 kotlin 모두 Enum.values()를 사용하게 되면 Array를 반환하게 된다. Array를 반환하는 부분에 있어서 무슨 문제가 있는지 처음에는 잘 와닿지 않았으나 정리된 글을 보니 아래와 같이 제법 심각한 문제들이 존재하였다.

  • 호출이 일어날 때 마다 배열을 할당하고 복제하여 성능상의 이슈가 있음
  • Mutable하여 배열 자체를 변경 가능하며 Array 자체가 java 및 kotlin Collections와 호환이 좋지 않아 유연성이 떨어짐
  • kotlin에서 유용하게 쓸 수 있는 확장 함수의 개념을 적용하기에 Array는 유연하지 못함

위와 같은 단점들로 인하여 새롭게 등장하게 된 메소드가 바로 entries()이다.

entries()

entries() 메소드의 경우 kotlin 1.8.2에서 실험적인 모델로 추가되었으며 (1.9 이후 버전의 경우 stable) List<\ltE>\gt를 확장한 EnumEntries<\ltE>\gt 인터페이스를 반환해준다.

  • 사전에 할당되어 있는 List를 반환하기에 항상 동일한 List를 반환하여 values()보다 성능이 좋음
  • Immutable
  • Array가 아닌 EnumEntries를 변환해주기에 List의 확장 함수 및 Enum을 위한 커스텀 확장 기능을 쉽게 구현할 수 있음

결론

직접 차이를 비교하고 공부해보니 왜 values() 대신 entries()를 사용해야 하는지 확실하게 와닿았다. 아직 kotlin에 대한 이해도가 높지 않은 채로 코드를 작성하고 있는 단계이지만 지금처럼 하나 하나 공부하여 전반적인 kotlin의 이해도를 높여나가야겠다.

참고 포스팅
Kotlin Enums — Replace values() with entries
Kotlin 공식 문서
참고 블로그

0개의 댓글