Enhanced for loop는 JDK 5에서 추가된 기능으로, 기존 for 루프보다 명확하게 코드를 읽을 수 있고, 간결하게 순회를 할 수 있도록 해준다.
간단하게 일반적인 for loop와 Enhanced for loop의 차이점을 알아보자.
for(int i = 0; i<arr.length; ++i){
System.out.println(arr[i]);
}
for(String text : arr){
System.out.println(text);
}
for(String i = 0; i<list.size(); ++i){
System.out.println(list.get(i));
}
for(String text : list){
System.out.println(text);
}
위에 명시된 배열과 List 뿐만 아니라 Iterable이 구현된 모든 클래스가 사용 가능하다. Collection 클래스는 Iterable을 상속 받았고, List는 Collection을 상속받았으니, 당연히 List는 Enhanced for loop에서 사용이 가능한 것이다. 참고로, Collection을 상속받은 클래스에는 List, Set, Queue등이 있다.
사실 enhanced for loop는 컴파일러 최적화를 통해 iterator를 기반으로 동작하기 때문이다.
for(String text : list){
System.out.println(text);
}
Iterator iter = list.iterator();
while(iter.hasNext()){
String text = (String) iter.next();
System.out.println(text);
}
순회 중 요소를 객체의 복사본으로 처리하기 때문이다.
복사본이기 때문에 다음 코드처럼 원소를 변경하는것은 불가능하다.
for(Text text : list){
System.out.println(text);
text = new Text("B");
}
그러나 얕은 복사를 하기 때문에, 다음처럼 내부 변수의 값을 변경하는것은 가능하다.
for(Text text : list){
System.out.println(text);
text.data = "B";
}