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

Kotlin에서 HashMap을 순회하는 방법 총정리: for 루프부터 iterator()까지

맵(Map)은 데이터를 키-값(key-value) 쌍으로 저장하는 컬렉션이며, 각 키는 반드시 고유해야 합니다. HashMapMutableMap 인터페이스를 기반으로 하는 컬렉션 클래스로, 해시 테이블(HashTable) 구조를 통해 이 인터페이스를 구현합니다. Kotlin은 HashMap을 정의하고 조작할 수 있도록 네 가지 생성자를 제공합니다.

  • HashMap() – 기본 생성자로, 비어 있는 HashMap을 생성합니다.

  • HashMap(initialCapacity: Int) – 지정된 초기 용량으로 HashMap을 생성합니다.

  • HashMap(initialCapacity: Int, loadFactor: Float = 0f) – 초기 용량과 로드 팩터를 지정하여 HashMap을 생성하며, 값이 주어지지 않으면 기본값으로 동작합니다.

  • HashMap(original: Map<out K, V>) – 전달받은 맵의 내용을 그대로 복사하여 새로운 HashMap 인스턴스를 생성합니다.

이 글에서는 가장 기본적인 HashMap() 생성자로 맵을 만들고, put() 메서드로 과목명과 선호도 점수 데이터를 저장한 뒤, Kotlin 표준 라이브러리에서 제공하는 여러 가지 방법으로 이 HashMap을 순회(iterate)하는 방법을 살펴보겠습니다.

1. for 루프로 순회하기

전통적인 프로그래밍 언어에서처럼 Kotlin에서도 for() 루프를 사용해 컬렉션을 순회할 수 있습니다. Kotlin의 for 루프는 맵의 엔트리를 구조 분해(destructuring)하여 키와 값을 한 번에 꺼낼 수 있어 매우 직관적입니다.

예제 코드

fun main(args: Array<String>) {
   // HashMap 선언
   var subject : HashMap<String, Int>
      = HashMap<String, Int> ();

   // HashMap에 값 할당
   subject.put("Java" , 1);
   subject.put("Kotlin" , 2);
   subject.put("Python" , 3);
   subject.put("C++" , 4);
   subject.put("SQL" , 5);

   // for 루프로 순회
   println("---------iterate using for Loop------------\n")
   for ((k, v) in subject) {
      println(" Subject Name -> $k and its preference -> $v")
   }
   println("\n\n")
}

실행 결과

코드를 실행하면 아래와 같은 출력이 생성됩니다.

$kotlinc -nowarn main.kt -include-runtime -d main.jar
$java -Xmx128M -Xms16M -jar main.jar

---------iterate using for Loop------------
Subject Name -> Java and its preference -> 1
Subject Name -> C++ and its preference -> 4
Subject Name -> Kotlin and its preference -> 2
Subject Name -> Python and its preference -> 3
Subject Name -> SQL and its preference -> 5

2. forEach()로 순회하기

for 루프 외에도 forEach() 함수를 사용하면 컬렉션을 손쉽게 순회할 수 있습니다. forEach는 람다식 형태로 키와 값을 받아 처리하므로 코드가 더욱 간결해집니다.

예제 코드

fun main(args: Array<String>) {
   // HashMap 선언
   var subject : HashMap<String, Int>
      = HashMap<String, Int> ();

   // HashMap에 값 할당
   subject.put("Java" , 1);
   subject.put("Kotlin" , 2);
   subject.put("Python" , 3);
   subject.put("C++" , 4);
   subject.put("SQL" , 5);

   // forEach로 순회
   println("------iterate using forEach Method---------\n")
   subject.forEach { (k, v) ->
      println(" Subject Name -> $k and its preference -> $v")
   }
   println("\n\n")
}

실행 결과

코드를 실행하면 다음과 같은 출력이 나타납니다.

$kotlinc -nowarn main.kt -include-runtime -d main.jar
$java -Xmx128M -Xms16M -jar main.jar

------iterate using forEach Method---------
Subject Name -> Java and its preference -> 1
Subject Name -> C++ and its preference -> 4
Subject Name -> Kotlin and its preference -> 2
Subject Name -> Python and its preference -> 3
Subject Name -> SQL and its preference -> 5

3. iterator() 메서드로 순회하기

위의 일반적인 방법들 외에도, Kotlin 표준 라이브러리는 iterator() 함수를 제공합니다. 이터레이터를 사용하면 컬렉션의 내부 구조를 노출하지 않고 객체에 순차적으로 접근할 수 있으며, 대용량 컬렉션을 다룰 때 가장 효율적인 접근 방식 중 하나로 꼽힙니다.

예제 코드

fun main(args: Array<String>) {
    // HashMap 선언
    var subject : HashMap<String, Int>
       = HashMap<String, Int> ();

    // HashMap에 값 할당
    subject.put("Java" , 1);
    subject.put("Kotlin" , 2);
    subject.put("Python" , 3);
    subject.put("C++" , 4);
    subject.put("SQL" , 5);

    // iterator() 메서드 사용
    println("-----------Using iterator() Method-----------\n")
    val i = subject.keys.iterator()
    while (i.hasNext()) {
       val key = i.next()
       val value = subject[key]
       println("Subject Name -> ${key} and its preference -> $value")
    }
}

실행 결과

코드를 실행하면 아래와 같은 출력이 생성됩니다.

$kotlinc -nowarn main.kt -include-runtime -d main.jar
$java -Xmx128M -Xms16M -jar main.jar

-----------Using iterator() Method-----------
Subject Name -> Java and its preference -> 1
Subject Name -> C++ and its preference -> 4
Subject Name -> Kotlin and its preference -> 2
Subject Name -> Python and its preference -> 3
Subject Name -> SQL and its preference -> 5

마무리

지금까지 Kotlin에서 HashMap을 순회하는 세 가지 대표적인 방법을 살펴보았습니다. 간단한 조회에는 for 루프, 함수형 스타일의 처리에는 forEach(), 성능과 유연성이 중요한 경우에는 iterator()를 활용하는 것이 좋습니다. 참고로 HashMap은 내부적으로 해시 테이블을 사용하기 때문에 출력 결과의 요소 순서는 저장 순서와 다를 수 있다는 점도 함께 기억해 두시기 바랍니다.