
향상된 for문은 배열이나 컬렉션에 들어 있는 요소(element)를 인덱스 없이 순차적으로 접근하기 위한 반복문이다.
일반 for문과의 가장 큰 차이점은 index 번호를 직접 다루지 않는다는 점이다.
일반 for문의 경우 index 번호(주소지)를 명확하게 알고 있어야 하며, 일일이 element의 개수를 세는 것이 번거롭기 때문에 arr.length와 같은 field 참조를 통해 길이를 얻어 반복 조건에 사용한다.
하지만 잘 생각해보면 for (int i = 0; ...) 에서 선언한 변수 i는 for문 내부에서만 사용되고, 반복이 끝나면 사라지는 임시 변수이다.
이 개념을 응용하여, 배열 내부의 element를 for문 내부에서만 사용하는 변수에 직접 대입하는 방식으로 index 번호 없이 반복할 수 있는 반복문이 바로 향상된 for문이다.
즉, 배열의 값을 수정해야 하는 경우에는 향상된 for문을 사용할 수 없다.
for (자료형 변수명 : 반복가능객체(배열)) {
반복 실행문
}
매 반복마다 배열의 요소 하나가 변수에 자동으로 대입된다.
public static void main(String[] args) {
int[] nums = new int[200];
// 1부터 200까지 숫자 대입
// 일반 for문으로 출력
for (int i = 0; i < nums.length; i++) {
nums[i] = i + 1;
System.out.print(nums[i] + " ");
}
System.out.println();
// 향상된 for문으로 출력
for (int number : nums) {
System.out.print(number + " ");
}
System.out.println();
}
향상된 for문의 첫 번째 반복에서는 배열의 첫 번째 요소가 변수에 대입된다.
즉, 내부적으로는 다음과 같은 흐름으로 동작한다.
number = nums[0];
number = nums[1];
number = nums[2];
...
public static void main(String[] args) {
String[] names = {"김일", "김이", "김삼", "김사", "김오"};
// 일반 for문
for (int i = 0; i < names.length; i++) {
System.out.print(names[i] + " / ");
}
System.out.println();
// 향상된 for문
for (String name : names) {
System.out.print(name + " / ");
}
}
출력 결과는 동일하지만, 향상된 for문은 index 관리가 필요 없기 때문에 코드가 더 간결하고 읽기 쉬워진다.
향상된 for문은 index를 제공하지 않기 때문에 번호가 필요할 경우 외부 변수를 함께 사용해야 한다.
public static void main(String[] args) {
String[] persons = {"김일", "김이", "김삼", "김사", "김오"};
/*
실행 예
1번 : 김일
2번 : 김이
3번 : 김삼
4번 : 김사
5번 : 김오
*/
// 일반 for문
for (int i = 0; i < persons.length; i++) {
System.out.println((i + 1) + "번: " + persons[i]);
}
System.out.println();
// 향상된 for문 + 외부 변수
int i = 0;
for (String person : persons) {
System.out.println(++i + "번: " + person);
}
}
향상된 for문은 배열이나 컬렉션의 값을 순차적으로 읽기만 할 때 가독성을 크게 높여주는 반복문이다.
하지만 배열의 값을 수정하거나, index를 이용한 세밀한 제어가 필요한 경우에는 일반 for문이 더 적합하다.
상황에 따라 두 반복문의 역할을 구분해서 사용하는 것이 중요하다.