1. for 루프
for 루프는
인덱스
를 사용해 배열이나 리스트의 요소에 접근한다.따라서 for 루프는 순차적 인덱싱을 지원해 리스트나 배열의 요소에 대한 직접 접근이 가능하기 때문에 특정 구간의 요소만을 순회할 때 유용하게 사용가능하다.
다만 인덱스를 사용하기 때문에 OutOfRange 에러가 발생할 수 있고 LinkedList 순회 시 매우 느리다.
2. forEach 루프
forEach는 내부적으로 Iterator를 사용해서 컬렉션을 순회한다.
컬렉션 인터페이스에 정의된 iterator() 메서드를 호출해 Iterator 객체를 생성한 후, hasNext(), next() 메서드를 이용해서 각 요소에 접근한다.
인덱스를 직접 제어할 수 없기 때문에 중간에 특정 조건으로 순회를 건너뛰거나 역순으로 순회하는 작업이 어렵다.
Iterator를 사용하기 때문에 for문에 비해 추가적인 오버헤드가 발생할 수 있다.
forEach는 Iterable 인터페이스를 상속받아 사용하기 때문에 람다로 다루는 함수형 프로그래밍이 가능하다는 점에서 차이가 있다.
주의사항
forEach 사용시 함수형이기 때문에 non-final 변수를 사용할 수 없다.
이럴 때 사용하는 것이 atomicType이다.
향상 for 문에서는 break 등을 이용해서 흐름 제어가 가능하지만 forEach()에서는 불가능하다. 따라서 중간에 순회를 종료해야 하는 경우 불편하다.