알고리즘 공부를 하다가 for each문이 나와서 글을 작성해 본다.
학부에서 Java를 공부할 때 for each문을 접해본 적이 없었는데
NHN 아카데미 자바 백엔드 과정을 수료하면서 처음 배웠던 기억이 있다....
for each문이란?
for-each 문은 컬렉션(Collection)이나 배열(Array)에 저장된 요소들을 하나씩 순차적으로 반복(iterate) 할 때 사용하는
간편한 반복문이다...
라고 하는데 향상된 for문이라고 부르기도 한다.
for (자료형 변수 : 컬렉션 또는 배열) {
// 반복할 코드
}
예시로 코드를 작성해 본다면 이런 식으로 사용할 수 있겠다.
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
for (String name : names) {
System.out.println(name);
}
사실 for문으로 작성해도 아무 이상이 없는 코드인데
왜 for each문을 사용하는 걸까?라는 생각이 들 수 있는데...
그 이유는 아래와 같다.
- 가독성: 코드가 간결하고 읽기 쉬움
- 코드량 감소: 인덱스를 따로 관리할 필요 없음
- 오류 감소: 반복 범위 실수나 인덱스 오류(IndexOutOfBoundsException) 가능성 줄어듦
그렇다면 사용할 때 주의할 점은 뭐가 있을까?
for each문은 Iterable 인터페이스를 상속하는 자료구조에만 사용할 수 있다!@
이게 무슨 말이냐면



이렇게 쭉쭉 타고 들어가다 보면 결국 Iterable을 상속하는 걸 볼 수 있다.
아니 그럼 그건 또 뭐야... 라고 할 텐데!
Iterable은 Java에서 iteration이라 하는 즉 반복을 할 수 있게 만들어주는 최상위 인터페이스다
이 인터페이스를 구현한 클래스가 for each문을 사용할 수 있는 것이다
그렇다면 어떤 상황에 사용해야 하나?
기존의 for문 방식은 list의 원소를 접근할 때 get()을 사용해 접근한다. 그렇다면 ArrayList와 LinkedList의 get() 메서드 시간 복잡도는 어떻게 될까?
ArrayList는 해당 인덱스로 바로 접근이 가능하기 때문에 O(1)의 시간 복잡도를 가지지만
LinkedList는 매번 첫 번째의 Head에서 해당 인덱스까지 이동하기 때문에 O(N)의 시간 복잡도를 가진다.
즉, 다음과 같은 상황에서 List가 LinkedList라면 O(N)이 아닌 O(N^2)의 시간 복잡도를 가지게 된다.
하지만 for each문 같은 경우는 Iterator를 사용하기 때문에 cursor변수를 가지고 자신이 순환하는 위치를 알고 있으므로
매번 처음부터 순환할 필요가 없다
LikedList에서 for each문을 사용한다면 O(N)의 시간 복잡도 나오는 것이다.
하지만 반대로 ArrayList인 경우는 평균적으로 기존의 for 문 방식이 더 빠르다. for-each문 방식은 Iterator라는 객체를 만들기 때문에 get()보다 next() 비용이 더 크기 때문이다. 하지만 사실 큰 차이는 없다고 한다.
index를 사용하지 않는다면 for each문을 사용하는 걸 추천한다.
'Java' 카테고리의 다른 글
| [Java] 제네릭 (Generic) 완전 정복 T와 와일드 카드 (0) | 2026.06.17 |
|---|---|
| [Java] HashMap 은 뭐고 어떻게 동작 하는 걸까? (0) | 2026.04.03 |
| Java - Collection Framework란? (0) | 2025.04.24 |
| Java - 면접 질문으로 다시 보는 Java의 List와 구현체(ArrayList 등)와 관계 (2) | 2025.04.24 |
| Java - for each문 직접 구현해보기 (0) | 2025.04.24 |
