glenn-syj / more-effective-java

이펙티브 자바를 읽으며 자바를 더 효율적으로 공부합니다
4 stars 5 forks source link

[MEJ-011] Colleciton의 Iterable 인터페이스와 향상된 for문 #196

Open FickleBoBo opened 3 months ago

FickleBoBo commented 3 months ago

Based on : #193 by @yngbao97


Stream, Iterable, Collection에 관한 탐구와 정리를 진행하시느라 고생많으셨습니다.

처음 Collection에 대해 학습하며 Collection이 상속받는 Iterable에 대해 본 적이 있었는데 Stream 파트에서 다시 만나니 반가웠습니다. 인프런 김영한 강사의 Collection 파트를 수강하며 향상된 for문의 사용을 적극 추천했었는데, item58(p.350)에서 향상된 for문이 Iterable 인터페이스를 구현한 객체라는 설명에서 Collection 객체가 향상된 for문을 사용할 수 있는 이유를 이해하게 되었고, 향상된 for문이 내부적으로 Iterator를 통해 구현되었을 것으로 생각되었습니다.

단순히 기존 for문에 비해 가독성이 좋을 뿐만 아니라 성능도 좋아서 충분히 이해하고 활용하면 좋을 것 같습니다.

Collection의 모든 요소의 합을 구하는 간단한 테스트에서는 배열 기반의 ArrayList의 경우 별 차이가 없었으며, LinkedList의 경우 향상된 for문 압도적으로 빨랐는데, 탐색 과정에서 시간복잡도가 O(N), O(1)의 차이가 있어서 그런 것으로 보였습니다. 다른 Colletion들의 경우는 향상된 for문으로만 원소에 접근이 가능하기에(List 인터페이스를 구현하지 않아서 그런 것으로 생각합니다) 전용 컬렉션을 설계한다면 향상된 for문을 사용할 수 있게 Iterable 인터페이스를 꼭 같이 구현해야 할 것 같습니다.


참고자료 https://docs.oracle.com/javase/8/docs/api/

yngbao97 commented 2 months ago

일반 for문보다 향상된 for문이 더 빠르다는 이론만 들어왔지 직접 테스트 해본 적은 없었는데, 실험해주신 내용이 상당히 흥미롭네요!

순서를 보장하지 않는 컬렉션 자료구조들은 향상된 for문으로만 원소 접근이 가능한것 같습니다. 말씀해주신 것처럼 전용 컬렉션을 설계할 일이 생긴다면 Iterable 인터페이스를 구현하도록 하는 것이 필수적일 것 같아요. 중요한 포인트를 짚어주셔서 감사합니다!