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 형태로 변환할 때 매우 유용하게 사용할 수 있는 함수입니다.
특정 속성을 기준으로 빠르게 탐색하거나 정리하고 싶을 때 유용하며, 코드의 가독성도 높일 수 있습니다.
'Android > Kotlin' 카테고리의 다른 글
[Android/Kotlin] lateinit 이해하기: nullable과의 차이와 지연 초기화 이해하기 (0) | 2025.02.25 |
---|---|
[Android/Kotlin] mutableMapOf vs hashMapOf 차이점 및 성능 비교 (0) | 2025.02.06 |
[Android/Kotlin] fold 사용법과 예제 (0) | 2025.02.05 |
[Android/Kotlin] 코틀린의 mutableMapOf()는 왜 LinkedHashMap을 사용할까? (0) | 2025.02.04 |
[Android/Kotlin] 코틀린 컬렉션 함수: any와 all (0) | 2025.01.21 |