DeveloPiano

[Kotlin] 코틀린(Kotlin) forEachIndexed 완벽 가이드 본문

Develop/Kotlin

[Kotlin] 코틀린(Kotlin) forEachIndexed 완벽 가이드

DevPi 2025. 3. 5. 18:05
반응형

코틀린(Kotlin)에서는 컬렉션을 순회할 때 for 문뿐만 아니라 다양한 반복 함수가 제공됩니다. 그중에서도 forEachIndexed는 인덱스와 요소를 함께 사용할 수 있어 리스트나 배열을 다룰 때 매우 유용한 함수입니다. 이번 포스팅에서는 forEachIndexed 함수의 개념과 실용적인 사용법을 예제와 함께 살펴보겠습니다.


📌 forEachIndexed 함수란?

코틀린의 forEachIndexed 함수는 forEach 함수와 유사하지만, 요소뿐만 아니라 인덱스도 함께 제공하는 특징이 있습니다.

🔹 기본 문법

inline fun <T> Iterable<T>.forEachIndexed(action: (index: Int, T) -> Unit)
  • Iterable<T>: 리스트, 배열 등 컬렉션을 반복할 수 있는 인터페이스
  • action: (index: Int, T) -> Unit: 인덱스와 요소를 인자로 받아 원하는 작업을 수행하는 함수

이 함수는 컬렉션의 각 요소를 순회하면서, 현재 요소의 인덱스와 값을 함께 처리할 수 있도록 합니다.


🛠 forEachIndexed 사용 예제

1️⃣ 리스트(List)에서 forEachIndexed 사용하기

fun main() {
    val names = listOf("Alice", "Bob", "Charlie")
    
    names.forEachIndexed { index, name ->
        println("$index: $name")
    }
}

출력:

0: Alice
1: Bob
2: Charlie

위 코드에서 forEachIndexed를 사용하면 indexname을 동시에 가져올 수 있습니다.

 

2️⃣ 배열(Array)에서 forEachIndexed 사용하기

fun main() {
    val numbers = arrayOf(10, 20, 30, 40)
    
    numbers.forEachIndexed { index, value ->
        println("Index $index: Value $value")
    }
}

출력:

Index 0: Value 10
Index 1: Value 20
Index 2: Value 30
Index 3: Value 40

배열에서도 동일하게 인덱스와 요소를 함께 사용할 수 있습니다.

 

3️⃣ 특정 조건이 있는 경우

forEachIndexed를 활용하여 특정 조건을 만족하는 요소만 출력할 수도 있습니다.

fun main() {
    val numbers = listOf(5, 15, 25, 35, 45)
    
    numbers.forEachIndexed { index, value ->
        if (value > 20) {
            println("$index 번째 값 $value 는 20보다 큽니다.")
        }
    }
}

출력:

2 번째 값 25 는 20보다 큽니다.
3 번째 값 35 는 20보다 큽니다.
4 번째 값 45 는 20보다 큽니다.

 

4️⃣ for 문과 forEachIndexed 비교

방식코드 스타일장점

for for (i in list.indices) { println("$i: ${list[i]}") } 명확한 반복이 필요할 때 사용
forEachIndexed list.forEachIndexed { index, value -> println("$index: $value") } 가독성이 좋고 간결함

forEachIndexed간결하고 가독성이 뛰어나며, 인덱스와 값을 직관적으로 사용할 수 있는 장점이 있습니다.


🎯 forEachIndexed 사용 시 주의할 점

성능 고려:

  • forEachIndexed는 내부적으로 for 문을 사용하여 동작하므로, 단순 반복 작업에서는 for 문과 성능 차이가 크지 않습니다.
  • 하지만 성능이 중요한 경우(예: 매우 큰 리스트를 다룰 때) 반복 횟수를 줄이는 최적화가 필요할 수 있습니다.

조기 종료 불가능:

  • forEachIndexed 내부에서는 return을 사용할 수 있지만, 이는 현재 람다 함수만 종료할 뿐 전체 반복을 멈출 수는 없습니다.
  • 전체 반복을 조기 종료하려면 for 문과 break를 사용하는 것이 좋습니다.
fun main() {
    val numbers = listOf(1, 2, 3, 4, 5)
    
    for (i in numbers.indices) {
        if (numbers[i] == 3) break // 반복 중단
        println(numbers[i])
    }
}

null 값 처리:

  • 리스트 요소가 null을 포함할 수 있는 경우, filterNotNull()을 먼저 적용하는 것이 안전합니다.
fun main() {
    val list = listOf("A", null, "B", "C")
    list.filterNotNull().forEachIndexed { index, value ->
        println("$index: $value")
    }
}

✨ 결론

코틀린의 forEachIndexed 함수는 컬렉션을 순회하면서 인덱스와 요소를 함께 활용할 수 있는 강력한 함수입니다.

forEachIndexed를 사용하면:

  • for 문보다 코드가 간결하고 가독성이 좋다
  • 배열과 리스트의 인덱스와 요소를 동시에 활용할 수 있다
  • 특정 조건을 만족하는 요소만 쉽게 필터링할 수 있다

단, 조기 종료가 필요하거나 성능이 중요한 경우 for 문이 더 적합할 수 있습니다.

이제 forEachIndexed를 적극 활용하여 더욱 깔끔하고 효율적인 코드를 작성해 보세요! 🚀

 

반응형