[Java] Enhanced for loop에 대한 관찰

sania Ka·2021년 11월 20일
0

Java 기능 관찰

목록 보기
1/8
post-thumbnail

Enhanced for loop는 JDK 5에서 추가된 기능으로, 기존 for 루프보다 명확하게 코드를 읽을 수 있고, 간결하게 순회를 할 수 있도록 해준다.
간단하게 일반적인 for loop와 Enhanced for loop의 차이점을 알아보자.

for loop vs Enhanced for loop (code)

Array 순회

일반 for loop

for(int i = 0; i<arr.length; ++i){
    System.out.println(arr[i]);
}                             

Enhanced for loop

for(String text : arr){
    System.out.println(text);
}                             

List 순회

일반 for loop

for(String i = 0; i<list.size(); ++i){
    System.out.println(list.get(i));
}                             

Enhanced for loop

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

Enhanced for loop의 특징

위에 명시된 배열과 List 뿐만 아니라 Iterable이 구현된 모든 클래스가 사용 가능하다. Collection 클래스는 Iterable을 상속 받았고, List는 Collection을 상속받았으니, 당연히 List는 Enhanced for loop에서 사용이 가능한 것이다. 참고로, Collection을 상속받은 클래스에는 List, Set, Queue등이 있다.

Enhanced for loop의 장점

  1. 순회 코드를 작성할 때 일반적인 for loop를 사용하는 것 보다 코드의 길이가 짧다.
  2. 순회하는 데이터의 이름을 통해, 명확히 어떠한 데이터를 사용하는지 쉽게 알아볼 수 있다.

Enhanced for loop의 단점

  1. 순회의 시작점과 끝을 임의로 지정할 수 없다
  2. 순회 중 원소의 변경 또는 삭제가 불가능하다.

시작점과 끝을 임의로 지정할 수 없는 이유

사실 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";
}

0개의 댓글