brunch

You can make anything
by writing

C.S.Lewis

by 이승현 Aug 07. 2018

Effective Java - 프로그래밍 일반

#46 종전의 for 루프보다는 for-each 루프를 사용하자

Effective Java - 프로그래밍 일반


#46 종전의 for 루프보다는 for-each 루프를 사용하자


#01 for loop


인덱스(index) 변수를 3번 노출하는 왼쪽 for 루프보다, 1번만 노출하는 오른쪽 for-each 루프를 이용하자는 내용인데, 이에 대해 알아보겠습니다.




for loop vs for-each loop


#02 for loop

인덱스 변수가 3번 나타나므로 잘못 이용될 가능성이 3번이나 일어날 수 있고, 이를 컴파일러가 에러로 반드시 잡아낸 다는 보장이 없습니다.


#03 for-each loop

인덱스 변수가 1번만 나타나므로 잘못 이용될 가능성이 줄어듭니다.

게다가 일반 for loop에 비해 성능 저하가 없습니다.




중첩 반복 처리


여러 개의 컬렉션에 대해 중첩된 반복 처리를 할 때는, for 루프보다 for-each 루프가 더 좋습니다.


아래 코드는 두 개의 컬렉션을 이용해 모든 요소들을 순차적으로 출력하는 코드입니다.

#04 for loop


cps 컬렉션의 next 메서드가 한번 호출된 후(외곽 루프), types 컬렉션의 next 메서드가 모두 호출(내부 루프) 되길 바라면서 만든 코드이지만, 실제로는 NoSuchElementException이 발생합니다. 

#05 for loop error


이런 문제를 방지하기 위해, 외곽 루프의 요소를 외곽 루프의 유효 범위에 변수로 추가해야 합니다.

#06 fixed for loop


for-each 루프를 이용하면 훨씬 간편하게 구현할 수 있습니다.

#06 for-each loop




이처럼 for-each 루프는 for 루프에 비해 성능 저하가 없고, 간단명료하며 버그를 방지해 줍니다.

하지만 이를 이용하지 못하는 경우도 있습니다.


1. 필터링(Filtering)

- 컬렉션 요소들을 삭제할 필요가 있을 때 > iterator가 필요함


2. 변환(Transforming)

- 요소들의 값을 변경할 필요가 있을 때 > 인덱스가 필요함


3. 병행 반복 처리(Parallel iteration)

- 병행으로 여러 컬렉션의 요소들을 오가면서 처리할 필요가 있을 때 > iterator나 인덱스가 필요함





매거진의 이전글 Effective Java - 프로그래밍 일반
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari