Java for-each문 (향상된 for문)
요약
Java for-each문(향상된 for문)의 기본 문법과 동작 원리를 알아봅니다. 일반 for문과의 차이, 2차원 배열에서의 활용 등 정보처리기사 실기에 출제되는 for-each 개념을 정리합니다.
for-each문 핵심 정리
| 개념 | 설명 | 예시 |
|---|---|---|
| for-each문 | 배열의 원소를 처음부터 끝까지 하나씩 꺼내는 반복문 1 | for (int x : arr) |
| 기본 문법 | for (타입 변수 : 배열) — 콜론(:)은 "~에서 꺼낸다"는 뜻 | for (String s : names) |
| 일반 for문과 차이 | 값만 꺼낼 때 사용. 몇 번째 원소인지(인덱스)가 필요하면 일반 for문 사용 | for (int i = 0; i < arr.length; i++) |
for-each문이란?
for-each문은 배열의 원소를 처음부터 끝까지 하나씩 꺼내는 반복문입니다. "향상된 for문(enhanced for)" 이라고도 부릅니다. 여기서 "향상된"은 "더 좋다"는 뜻이 아니라, 배열 순회를 더 간편하게 쓸 수 있도록 추가된 문법이라는 의미입니다.

for (int x : arr) 은 "arr 배열에서 원소를 하나씩 꺼내 x에 담아라" 라는 뜻입니다. 콜론(:)이 "~에서 꺼낸다"는 역할을 합니다.
기본 문법
- 타입 2: 배열 원소의 타입과 같아야 합니다.
int[]배열이면int,String[]배열이면String - 변수명: 꺼낸 원소를 담을 변수 이름. 자유롭게 지을 수 있습니다
- 배열: 순회할 대상 배열
실행 순서
- 배열의 첫 번째 원소
names[0]을name에 복사하고, 중괄호 안의 코드를 실행 →"감자"출력 - 배열의 두 번째 원소
names[1]을name에 복사하고, 중괄호 안의 코드를 실행 →"고구마"출력 - 배열의 세 번째 원소
names[2]를name에 복사하고, 중괄호 안의 코드를 실행 →"옥수수"출력 - 배열의 끝에 도달하면 반복 종료

String은 참조형이라 배열 칸에 문자열 자체가 아니라 String 객체를 가리키는 참조값이 들어 있습니다. for-each문은 매 반복마다 이 참조값을 name에 복사하므로, name과 names[0]은 같은 "감자" 객체를 가리킵니다. 문자열이 하나 더 만들어지는 것이 아닙니다.
| 원소 타입 | 반복 변수에 복사되는 것 | 예시 |
|---|---|---|
기본형 (int, double 등) | 값 자체 (값 복사) | for (int x : arr) → x에 1이 복사됨 |
참조형 (String, 배열, 객체) | 객체를 가리키는 참조값 (참조값 복사) | for (String name : names) → name에 "감자" 객체의 참조값이 복사됨 |
일반 for문과 비교
같은 동작을 일반 for문으로 작성하면 이렇습니다.
![일반 for문과 for-each문 비교 — 일반 for문은 i로 arr[i] 칸을 읽고, for-each문은 인덱스 없이 원소 값을 x에 복사](/_next/image?url=%2Fcoding%2Fjava%2Ffor-each%2Ffor-each-vs-for.webp&w=3840&q=75&dpl=dpl_ALinWL5oQc9uopQwdKtTaoaNYcLW)
| 구분 | 일반 for문 | for-each문 |
|---|---|---|
| 인덱스 사용 | i로 인덱스 접근 가능 | 인덱스 없음 |
| 값 접근 | arr[i]로 접근 | 변수에 바로 담김 |
| 역순 순회 | 가능 (i--) | 불가능 (항상 처음부터 끝까지) |
| 원소 교체 | arr[i] = 값으로 가능 | 불가 (반복 변수에 대입해도 배열 칸은 그대로) |
역순 순회는 일반 for문으로만 가능합니다.
![일반 for문 역순 순회 — i가 2, 1, 0으로 줄어들며 arr[2], arr[1], arr[0]을 차례로 출력하는 과정](/_next/image?url=%2Fcoding%2Fjava%2Ffor-each%2Ffor-each-reverse.webp&w=3840&q=75&dpl=dpl_ALinWL5oQc9uopQwdKtTaoaNYcLW)
배열 칸에 새 값을 대입해 원소 자체를 바꾸는 것도 일반 for문으로 해야 합니다.
![일반 for문으로 원소 교체 — i가 0, 1, 2일 때 arr[i]에 10을 곱한 값을 대입해 배열이 {10, 20, 30}으로 바뀌는 과정](/_next/image?url=%2Fcoding%2Fjava%2Ffor-each%2Ffor-each-index-assign.webp&w=3840&q=75&dpl=dpl_ALinWL5oQc9uopQwdKtTaoaNYcLW)
![for-each문의 값 복사 — arr[0]의 값 1이 x에 복사되고, x를 10으로 바꿔도 arr는 {1, 2, 3} 그대로](/_next/image?url=%2Fcoding%2Fjava%2Ffor-each%2Ffor-each-copy-v2.webp&w=3840&q=75&dpl=dpl_ALinWL5oQc9uopQwdKtTaoaNYcLW)
2차원 배열과 for-each문
Java의 2차원 배열은 "배열의 배열"입니다. int[][] matrix는 int[] 타입의 원소들을 담은 배열이며, 각 원소가 또 하나의 1차원 배열(행)입니다. 따라서 for-each문으로 꺼내지는 원소는 1차원 배열(행)입니다.

바깥 for-each에서 int[] row로 받는 이유는, matrix의 각 원소가 int[](1차원 배열)이기 때문입니다. 안쪽 for-each에서 row의 원소를 다시 하나씩 꺼내면 개별 int 값을 얻을 수 있습니다.
반복 변수로 객체 내용 수정하기
원소가 참조형이면 반복 변수에는 참조값이 복사됩니다. 그래서 두 동작의 결과가 다릅니다.
- 반복 변수에 새 값을 대입 → 반복 변수만 다른 객체를 가리키게 되고, 배열 칸은 그대로
- 반복 변수로 객체의 내용을 수정 → 배열 칸과 반복 변수가 같은 객체를 가리키므로, 원본에서도 바뀐 내용이 보임
![반복 변수로 행 배열 내용 수정 — m[0]과 row가 같은 행 배열 주소200을 가리켜 row[0] = 9가 m[0][0]에도 보이는 과정](/_next/image?url=%2Fcoding%2Fjava%2Ffor-each%2Ffor-each-modify-row.webp&w=3840&q=75&dpl=dpl_ALinWL5oQc9uopQwdKtTaoaNYcLW)
row와 m[0]이 같은 행 배열을 가리키므로 row[0] = 9는 m[0][0]을 바꿉니다.
이어서 row에 새 배열을 대입해 봅니다.
![반복 변수에 새 배열 대입 — row만 새 배열 주소300을 가리키고 m[0]은 여전히 주소200의 행 배열을 가리키는 상태](/_next/image?url=%2Fcoding%2Fjava%2Ffor-each%2Ffor-each-reassign-row.webp&w=3840&q=75&dpl=dpl_ALinWL5oQc9uopQwdKtTaoaNYcLW)
row = new int[]{3}은 row가 새 배열을 가리키게 할 뿐, m[0] 칸에 든 참조값은 바뀌지 않습니다. 그래서 m[0][0]은 여전히 9입니다.
![반복 변수로 StringBuilder 내용 수정 — b[0]과 s가 같은 StringBuilder 객체 주소500을 가리켜 append 결과 AB가 b[0]에도 보이는 과정](/_next/image?url=%2Fcoding%2Fjava%2Ffor-each%2Ffor-each-stringbuilder.webp&w=3840&q=75&dpl=dpl_ALinWL5oQc9uopQwdKtTaoaNYcLW)
StringBuilder는 내용을 바꿀 수 있는 객체라 s.append("B")의 결과가 b[0]에도 보입니다. 반면 String은 내용을 바꿀 수 없는 객체라 name = name + "!"처럼 써도 새 문자열을 가리키게 될 뿐 배열 원소는 그대로입니다.
정리하면, for-each문으로 배열 칸 자체를 다른 값으로 교체할 수는 없지만, 원소가 가리키는 객체·행 배열의 내용은 반복 변수를 통해 수정할 수 있습니다. 3
정보처리기사 실기 대비 문제
Footnotes
-
배열 외에도 컬렉션(Collection)에 사용할 수 있습니다. 컬렉션은 여러 데이터를 모아서 관리하는 자료구조로, ArrayList, HashMap 등이 대표적입니다. 정보처리기사 실기에서는 주로 배열과 함께 출제됩니다. ↩
-
타입(자료형)은 변수에 담을 데이터의 종류를 뜻합니다.
int는 정수,double은 소수,String은 문자열,boolean은 참/거짓을 저장합니다. ↩ -
Java 언어 명세(JLS 14.14.2)는 배열에 대한 for-each문을 "배열 원소
a[i]를 반복 변수에 대입한 뒤 본문을 실행하는 일반 for문"과 같은 의미로 정의합니다. 따라서 반복 변수에는 원소의 값(참조형이면 참조값)이 복사됩니다. ↩