본문 바로가기
IT/자바스크립트

Java foreach문에서 index를 사용하는 방법

by 불멸남생 2025. 3. 28.

Java의 foreach문은 코드의 간결함과 가독성을 높여주는 강력한 반복문 구조입니다. 그러나 foreach문을 사용할 때 가장 많이 직면하는 문제 중 하나는 인덱스를 직접 참조할 수 없다는 점입니다. 본 문서에서는 Java에서 foreach문을 사용할 때 인덱스를 활용하는 다양한 방법을 완벽하게 정리합니다. 다양한 실전 예제, 고급 활용법, 성능 팁까지 포함된 본 콘텐츠는 Google에서 "java foreach index" 키워드로 상위 노출되기 위한 SEO 최적화형 콘텐츠입니다.

Java foreach 문이란?

Java의 foreach 문은 for-each, 혹은 "향상된 for문"이라고도 불리며, 배열이나 컬렉션을 반복할 때 간결한 문법을 제공합니다.

for (String item : items) {
    System.out.println(item);
}

장점

  • 코드가 간단하고 직관적임
  • NullPointerException 방지에 유리
  • Iterator의 명시적 사용 불필요

단점

  • 인덱스 접근 불가
  • 특정 요소에 대한 수정이 제한됨
  • 병렬 처리에 부적합
반응형

Java foreach에서 index 사용하는 방법

1. 전통적인 for문으로 대체

foreach 문에서는 인덱스를 사용할 수 없으므로, 가장 직관적인 방법은 기존의 인덱스 기반 for문을 사용하는 것입니다.

List<String> items = Arrays.asList("A", "B", "C");
for (int i = 0; i < items.size(); i++) {
    System.out.println("Index: " + i + ", Value: " + items.get(i));
}

장점

  • 인덱스를 직접 사용할 수 있음
  • 컬렉션의 요소와 인덱스를 동시에 처리 가능

단점

  • 코드가 길어짐
  • foreach문이 가진 간결함 손실
반응형

2. Java 8 Stream을 이용한 index 접근

Java 8부터 도입된 Stream API를 이용하면, 인덱스와 값을 동시에 처리하는 것이 가능합니다. 이 방법은 IntStream을 활용한 간접적 접근입니다.

List<String> items = Arrays.asList("Apple", "Banana", "Cherry");

IntStream.range(0, items.size())
         .forEach(i -> System.out.println("Index: " + i + ", Value: " + items.get(i)));

장점

  • 함수형 프로그래밍 스타일 가능
  • 가독성과 유지보수성 향상
  • 병렬 처리 적용 가능

단점

  • Stream에 익숙하지 않다면 복잡하게 느껴질 수 있음
  • List에서만 가능 (배열에 직접 적용 불가)
반응형

3. AtomicInteger 활용하기 (람다식에서 index 증가)

람다식 내부에서 인덱스를 사용해야 할 때는 **AtomicInteger**를 활용하면 thread-safe하면서 인덱스 처리가 가능합니다.

List<String> items = Arrays.asList("One", "Two", "Three");
AtomicInteger index = new AtomicInteger();

items.forEach(item -> {
    System.out.println("Index: " + index.getAndIncrement() + ", Value: " + item);
});

장점

  • foreach 스타일을 유지하면서 index 처리 가능
  • 병렬 환경에서도 안전

단점

  • 부가적인 코드 필요
  • 성능에 민감한 환경에서는 오버헤드 발생 가능
반응형

4. Guava 또는 Apache Commons 라이브러리 활용

외부 라이브러리를 활용하면 더욱 우아하고 기능적인 방법으로 인덱스를 처리할 수 있습니다.

Guava의 Streams.mapWithIndex

Streams.mapWithIndex(items.stream(),
    (item, index) -> index + ": " + item)
    .forEach(System.out::println);

Apache Commons Lang의 Pair 유틸

라이브러리를 도입함으로써 더 나은 코드 품질과 재사용성이 확보됩니다.

반응형

5. 사용자 정의 유틸 메서드 만들기

반복적으로 인덱스가 필요한 경우, 재사용 가능한 유틸리티 메서드를 만들어 유지보수를 향상시킬 수 있습니다.

public static <T> void forEachWithIndex(List<T> list, BiConsumer<T, Integer> consumer) {
    for (int i = 0; i < list.size(); i++) {
        consumer.accept(list.get(i), i);
    }
}

사용 예:

forEachWithIndex(items, (item, index) -> {
    System.out.println("Index: " + index + ", Item: " + item);
});
반응형

6. 배열에서 인덱스를 사용하는 foreach 변형

배열에서는 IntStream을 사용하여 인덱스를 직접 제어할 수 있습니다.

String[] arr = {"X", "Y", "Z"};

IntStream.range(0, arr.length)
         .forEach(i -> System.out.println("Index: " + i + ", Value: " + arr[i]));
반응형

결론

  • 단순한 반복에는 foreach 문 사용
  • 인덱스가 필요하면 for, IntStream, AtomicInteger, 또는 사용자 정의 유틸 메서드 활용
  • 프로젝트 규모에 따라 외부 라이브러리 도입 검토

정리하자면, Java의 foreach 문에서도 다양한 우회 방법을 통해 인덱스를 충분히 활용할 수 있으며, 프로젝트의 특성에 따라 적절한 방식을 선택하는 것이 중요합니다.

 

반응형