본문 바로가기
Android/Kotlin

[Android/Kotlin] Kotlin 컬렉션 확장 함수 정리: associateBy 사용법

by quessr 2025. 3. 27.

 

Kotlin에서는 리스트나 배열과 같은 컬렉션을 다룰 때 유용한 확장 함수(Extension Function)들이 많이 제공됩니다. 그 중에서도 associateBy는 컬렉션을 Map으로 변환할 때 자주 사용되는 함수입니다.

이 글에서는 associateBy의 기본 개념부터 실전 예제까지 정리해보았습니다.


associateBy란?

associateBy는 컬렉션(List, Array 등)의 요소를 기준값으로 묶어 Map으로 변환해주는 확장 함수입니다.

즉, 리스트의 각 요소에서 특정 값을 꺼내 Key로 삼고, 해당 요소를 Value로 하여 Map을 만드는 방식입니다.


기본 사용법

val resultMap = list.associateBy { it.someProperty }

 

  • someProperty는 각 요소에서 추출한 값이며, Map의 Key가 됩니다.
  • Value는 기본적으로 요소 자체가 사용됩니다.

예제: 사용자 리스트를 ID 기준으로 매핑하기

data class User(val id: Int, val name: String)

val users = listOf(
    User(1, "Alice"),
    User(2, "Bob"),
    User(3, "Charlie")
)

val userMap = users.associateBy { it.id }

 

 

위 코드를 실행하면 userMap은 다음과 같은 구조의 Map<Int, User>가 됩니다:

mapOf(
    1 to User(1, "Alice"),
    2 to User(2, "Bob"),
    3 to User(3, "Charlie")
)

이제 userMap[2]를 호출하면 User(2, "Bob")을 바로 얻을 수 있습니다.


Key와 Value를 모두 지정하는 방법

associateBy는 Key뿐만 아니라 Value도 선택적으로 지정할 수 있습니다.

val userNameMap = users.associateBy(
    keySelector = { it.id },
    valueSelector = { it.name }
)

 

이 경우 userNameMap은 Map<Int, String> 타입이며 다음과 같은 결과를 반환합니다:

mapOf(
    1 to "Alice",
    2 to "Bob",
    3 to "Charlie"
)

실전 예제: Enum 값을 Map으로 변환하기

예를 들어 다음과 같은 Enum 클래스가 있다고 가정해보겠습니다.

enum class JuiceColor(val label: Int, val color: Long) {
    RED(R.string.red, 0xFFE57373),
    ORANGE(R.string.orange, 0xFFFFB74D),
    GREEN(R.string.green, 0xFF81C784)
}

 

Compose 코드 안에서는 다음과 같이 사용할 수 있습니다:

val colorLabelMap = JuiceColor.values().associateBy { stringResource(it.label) }

 

여기서 stringResource(it.label)은 각 색상의 문자열 리소스("레드", "오렌지" 등)를 반환하고, 이를 Key로 사용하여 해당 Enum 값을 찾을 수 있는 Map<String, JuiceColor>을 만들 수 있습니다.


정리

항목 설명
Key 선택 람다를 통해 지정한 기준값
Value 기본값 컬렉션의 요소 자체
Value 지정 가능 valueSelector를 통해 별도로 지정 가능
반환 타입 Map<Key, Value> 형태의 Map 생성

마무리

associateBy는 컬렉션을 Map 형태로 변환할 때 매우 유용하게 사용할 수 있는 함수입니다.
특정 속성을 기준으로 빠르게 탐색하거나 정리하고 싶을 때 유용하며, 코드의 가독성도 높일 수 있습니다.

반응형