코틀린(Kotlin)으로 개발하다 보면 배열이나 리스트를 순회하면서 현재 요소의 인덱스가 필요한 경우가 자주 발생합니다. 일반적인 forEach() 함수는 값만 전달하기 때문에 인덱스에 직접 접근할 수 없는데요. 이번 글에서는 코틀린에서 forEach 루프를 사용하면서도 인덱스에 접근할 수 있는 두 가지 방법을 소개합니다.
방법 1: forEachIndexed() 사용하기
첫 번째 방법은 forEach() 대신 forEachIndexed()를 사용하는 것입니다. forEachIndexed는 코틀린 표준 라이브러리에서 제공하는 인라인(inline) 함수로, 컬렉션을 입력받아 각 요소의 인덱스와 값을 분리해서 접근할 수 있게 해줍니다.
아래 예제에서는 "Subject" 리스트를 순회하면서 각 항목의 인덱스와 값을 함께 출력해 보겠습니다.
예제 코드
fun main() {
var subject = listOf("Java", "Kotlin", "JS", "C")
subject.forEachIndexed { index, element ->
println("index = $index, item = $element ")
}
}실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
index = 0, item = Java index = 1, item = Kotlin index = 2, item = JS index = 3, item = C
방법 2: withIndex() 사용하기
두 번째 방법은 코틀린의 라이브러리 함수인 withIndex()를 활용하는 것입니다. withIndex()를 사용하면 배열의 인덱스와 해당 값을 동시에 얻을 수 있으며, 구조 분해 선언(destructuring declaration)과 함께 for 루프 안에서 사용해야 합니다.
앞선 예제와 동일한 배열을 사용하여, 이번에는 withIndex()로 인덱스와 값을 출력해 보겠습니다.
예제 코드
fun main() {
var subject = listOf("Java", "Kotlin", "JS", "C")
for ((index, value) in subject.withIndex()) {
println("The subject of $index is $value")
}
}실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
The subject of 0 is Java The subject of 1 is Kotlin The subject of 2 is JS The subject of 3 is C
정리
코틀린에서 인덱스와 값을 함께 순회하고 싶다면 forEachIndexed() 또는 withIndex()를 사용하면 됩니다. 람다 스타일의 간결한 코드를 원한다면 forEachIndexed()를, 기존의 for 루프 문법을 유지하고 싶다면 withIndex()를 선택하는 것이 좋습니다. 두 방법 모두 성능 차이는 거의 없으므로 코드의 가독성과 상황에 맞게 선택하시면 됩니다.