Java

Enhanced for문

sejin2 2024. 6. 3. 15:10

자바의 향상된 for문은 배열이나 컬렉션을 순회하기 위해 사용되는 구문으로, for-each loop라고도 불린다.
기존의 for문에 비해 코드가 간결하고 읽기 쉬워서 반복적인 작업을 처리할 때 많이 사용된다.

 

기본 구조

for (타입 변수명 : 배열 또는 컬렉션) {
    // 반복할 코드
}

 

  • 타입 : 배열 또는 컬렉션에 포함된 요소의 타입
  • 변수명 : 반복되는 각 요소를 참조할 변수의 이름
  • 배열 또는 컬렉션 : 순회할 배열 또는 컬렉션
int[] numbers = {1, 2, 3, 4, 5};

for (int number : numbers) {
    System.out.println(number);
}

 

위 코드는 numbers 배열의 각 요소를 순회하며, 순회하는 각 요소의 값을 number 변수에 할당하고 그 값을 출력하는 코드이다.

특징

  • 내부적으로 Iterator를 사용하여 컬렉션을 순회한다. 따라서, 컬렉션이 Iterable 인터페이스를 구현하고 있어야 한다.
  • 배열 뿐 만 아니라 List, Set과 같은 컬렉션도 순회할 수 있다. 
  • 향상된 for문은 읽기 전용 순회를 수행한다. 즉, 순회 중에 컬렉션의 요소를 추가하거나 삭제할 수 없으나, 요소가 객체인 경우 요소의 상태를 변경하는 것은 가능하다.
  • 멀티 스레드 환경에서 컬렉션을 순회할 때는 주의해야한다. 순회 중에 다른 스레드가 컬렉션을 수정하게 되면 ConcurrentModificationException이 발생할 수 있다.

향상된 for문은 반복 작업을 보다 간결하고 명확하게 표현할 수 있도록 도와준다.
그러나 기존 for문을 완전히 대체할 수 있는 것은 아니기 때문에 같이 병행하여 사용해야 한다. 

 

+ Iterable 인터페이스란?

컬렉션 내의 요소들을 순차적으로 접근하는 방법을 제공한다. 이 인터페이스는 요소들을 순회하기 위한 여러 메서드를 정의하고 있다.

  • hasNext : 다음 요소가 있는지 여부를 반환한다. 더 이상 순회할 요소가 없으면 false를 반환한다. 
  • next( ) : 순회 중인 다음 요소를 반환한다.
  • remove( ) : next(  ) 메서드로 반환된 마지막 요소를 제거한다. 이 메서드 호출은 선택적이며, 모든 Iterator 구현체가 이 기능을 지원하는 것은 아니다. 

Iterable 인터페이스와 향상된 for 문

향상된 for문은 내부적으로 컬렉션의 iterator( ) 메서드를 호출하여 Iterator 객체를 얻는다. 그리고 이 Iterator를 사용하여 컬렉션을 순회한다.  
예를 들어, List 인터페이스는 Iterable 인터페이스를 구현하므로, 모든 리스트(List) 타입의 컬렉션은 향상된 for 문을 사용하여 순회할 수 있다.

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

for (String fruit : list) {
    System.out.println(fruit);
}

이 코드에서 향상된 for문은 list의 iterator( ) 메서드를 내부적으로 호출하여 순회를 진행한다. 
각 순회 단계에서 Iterator의 next( ) 메서드를 호출하여 다음 요소를 가져온다. 

 

향상된 for 문(enhanced for loop)은 내부적으로 Iteratornext() 메서드를 호출하여 리스트의 요소를 순회하지만, 이는 개발자가 코드 상에서 직접 확인할 수 있는 부분은 아니다. 이 동작은 Java 컴파일러가 자동으로 처리해주는 부분으로 향상된 for 문을 사용하는 코드에서는 Iterator 객체나 next() 메서드를 명시적으로 호출하는 부분을 볼 수 없다.

List<String> list = Arrays.asList("a", "b", "c");
for (String item : list) {
    System.out.println(item);
}

 

위 코드는 내부적으로 Iterator를 사용하여 리스트를 순회하지만, Iterator객체나 next(  ) 메서드 호출이 코드상에 명시되어 있지 않다. 만약 Iterator를 명시적으로 사용하는 코드가 보고싶다면, 아래와 같은 코드라고 보면 된다. 

List<String> list = Arrays.asList("a", "b", "c");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String item = iterator.next();
    System.out.println(item);
}

 

'Java' 카테고리의 다른 글

[인프런] 기본형과 참조형의 공유  (0) 2024.06.06
Labelled Loop ( 이름을 가지는 반복문 )  (0) 2024.06.03
[인프런] equals( )  (0) 2024.06.02
[인프런] toString( )  (0) 2024.06.02
[인프런] Object 클래스  (0) 2024.06.02