Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

Kotlin에서 리스트(List)를 맵(Map)으로 변환하는 3가지 방법

이 글에서는 Kotlin 표준 라이브러리가 제공하는 다양한 함수를 활용하여 리스트(List)맵(Map)으로 변환하는 방법을 살펴보겠습니다. 대표적인 세 가지 방법으로 associate(), associateBy(), toMap() 함수가 있으며, 각각의 특징과 사용 예제를 함께 확인해 보겠습니다.

1. associate() 함수 사용하기

리스트를 맵으로 변환하는 가장 표준적인 방법은 associate() 함수를 사용하는 것입니다. 이 함수는 리스트의 각 항목에 대해 키-값 쌍(Pair)을 생성하고, 그 결과를 하나의 맵으로 반환합니다. 아래 예제를 통해 동작 방식을 살펴보겠습니다.

data class mySubjectList(var name: String, var priority: String)

fun main() {
    val mySubjectList: List<mySubjectList> = listOf(
        mySubjectList("Java", "1"),
        mySubjectList("Kotlin", "2"),
        mySubjectList("C", "3")
    )

    // 맵을 생성하고 직접 정의한 값 목록을 추가합니다.
    val myMap: Map<String, String> = mySubjectList.associate {
        Pair(it.priority, it.name)
    }

    println(myMap)
}

실행 결과

위 코드를 실행하면 다음과 같이 키-값 형태의 맵이 출력됩니다.

{1=Java, 2=Kotlin, 3=C}

2. associateBy() 함수 사용하기

associateBy() 역시 리스트를 맵으로 변환할 때 사용할 수 있는 함수입니다. 이 함수는 키를 결정하는 keySelector와 값을 결정하는 valueTransform을 각각 인자로 받아 처리합니다. 아래 예제를 통해 구현 방법을 확인해 보겠습니다.

data class mySubjectList(var name: String, var priority: String)

fun main() {
    val mySubjectList: List<mySubjectList> = listOf(
        mySubjectList("Java", "1"),
        mySubjectList("Kotlin", "2"),
        mySubjectList("C", "3")
    )

    // 맵을 생성하고 직접 정의한 값 목록을 추가합니다.
    val myMap: Map<String, String> = mySubjectList.associateBy(
        { it.priority }, { it.name }
    )

    println(myMap)
}

실행 결과

마찬가지로 키-값 형태의 맵이 출력됩니다.

{1=Java, 2=Kotlin, 3=C}

3. toMap() 함수 사용하기

Kotlin 라이브러리는 리스트를 맵으로 변환하는 또 다른 방법도 제공합니다. toMap() 함수는 주어진 컬렉션에 포함된 모든 키-값 쌍으로 구성된 새로운 맵을 반환합니다. 일반적으로 map{} 연산으로 Pair 리스트를 먼저 만든 뒤 이를 맵으로 변환하는 방식으로 활용됩니다.

data class mySubjectList(var name: String, var priority: String)

fun main() {
    val mySubjectList: List<mySubjectList> = listOf(
        mySubjectList("Java", "1"),
        mySubjectList("Kotlin", "2"),
        mySubjectList("C", "3")
    )

    // 맵을 생성하고 직접 정의한 값 목록을 추가합니다.
    val myMap: Map<String, String> = mySubjectList.map {
        it.priority to it.name
    }.toMap()

    println(myMap)
}

실행 결과

위 코드를 실행하면 동일하게 키-값 형태의 맵이 출력됩니다.

{1=Java, 2=Kotlin, 3=C}

어떤 함수를 선택해야 할까?

세 가지 함수 모두 같은 결과를 만들지만, 상황에 따라 적합한 함수가 다릅니다.

  • associate(): 각 요소에서 키와 값을 한 번에 계산할 때 적합합니다.
  • associateBy(): 키 선택자와 값 변환 로직을 분리해서 지정하고 싶을 때 유용합니다.
  • toMap(): 이미 Pair 형태의 데이터가 있거나 map{} 연산과 조합해 사용할 때 편리합니다.

참고로 세 함수 모두 원본 리스트를 변경하지 않고 새로운 맵을 반환하며, 동일한 키가 여러 번 등장할 경우 마지막에 등장한 값이 최종 맵에 저장된다는 점도 함께 기억해 두세요.