티스토리 뷰

Java/Effective Java

[Item58] fori 대신 iter

ryumodern 2022. 6. 7. 21:30

item58에서는 fori 보다 iter를 사용하라 말한다

fori는 무엇인가, fori를 치면 생성되는 좌측의 코드 블록을 의미한다, 전통적인 for문 / for-loop라고 한다

iter는 무엇인가? iter를 치면 생성되는 우측의 코드 블록을 의미한다, 향상된 for문 / foreach-loop라고 한다

향상된 for문이라 부르는 이유는 성능 측면이 아닌 가독성 측면에서의 향상을 의미한다

 

 

특별한 이유가 있거나 학습의 목적이 아니라면 iterator()를 얻어서 iterator.next()로

순회하는 코드를 작성할 일은 거의 없으니 패스하자

for-loop과 foreach-loop는 반복 형태의 구조를 다룬다는 점에서 동일하다

가장 큰 차이는 for-loop은 외부에서 인덱스를 가지고 조작한다는 점에서 external iteration이라 할 수 있고

foreach-loop은 stream으로 돌릴 때와 마찬가지로 돌아가는 요소가 정해져 있는 internal iteration 이라는 점이다

 

왜 for-loop를 사용하지 말고 foreach-loop를 사용해야 하는 걸까?

대단한 이유는 아니고 인덱스로 요소를 다뤄야 하기 때문에 발생할 수 있는 실수들 때문이다

코드 가독성 측면에서도 foreach-loop가 더욱 깔끔하다

 

실수를 줄인다는 표현을 보고 객체지향 프로그래밍에 관한 책인 오브젝트가 떠올랐다

책에서는 절차지향, 객체지향, 함수형 프로그래밍은 기존보다 자유를 주는 것이 아닌

제약을 걸어 실수의 여지를 줄이고, 통일성을 지키도록 만들어준다는 내용이 있다

foreach-loop가 정확하게 그러한 의도대로 인덱스를 사용하지 못하게 하는 대신 인덱스를 잘못 사용할 실수를 줄여준다

 

foreach-loop가 개발자에게서 인덱스를 사용할 자유를 빼앗아간 것인데 그 대가로 단점 또한 존재한다

foreach-loop로는 해결할 수 없고 for-loop를 써야 하는 경우도 있기 때문이다

그럼 foreach-loop 대신 일반 for-loop를 써야하는 경우는 언제일까?, 아래의 경우와 같다
1. destructive filtering, 순회하면서 요소 삭제해야할 때 ex) iterator.remove() 혹은 Collection.removeIf()
2. transforming, 순회하면서 값을 변경해야 할 때
3. parallel iteration, 여러 컬렉션을 병렬로 순회해야 할 때

 

배열이든 컬렉션이든 요소를 담은 Container가 있고 그 안의 요소를 변경 or 삭제해야 할 때

그리고 하나의 인덱스로 두개 이상의 컨테이너를 돌아야 할 때가 for-loop를 써야 할 때다

일반적으로 for-loop를 쓰든 foreach-loop를 쓰든 성능 차이도 없고 구현 방법에 차이도 거의 없다

위에서 언급한 경우에는 foreach-loop를 사용할 수 없고 그 외의 경우엔 foreach-loop로 충분하다

실수할 여지를 없앨 수 있도록 foreach-loop를 사용하고 인덱스 조작이 필요한 경우에만 for-loop로 돌리자

댓글
링크
글 보관함
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Total
Today
Yesterday