JAVA 제어문 : 반복문(for, while)
반복문(Looping Statement)
어떠한 코드가 반복적으로 사용 될 때 사용되는 구문이다.
for
프로그래머가 설정한 조건이 만족 될 때까지 지정한 코드 블럭이 계속해서 수행된다.
카운팅을 할 수도 있겠지만, 배열 혹은 컬렉션 안에 저장되어 있는 값을 순회 할 때도 많이 사용된다.
for(초기식; 조건식; 증감식) {
반복 될 코드;
}
JDK 5.0 이상부터 배열 혹은 컬렉션의 순회시에 다음과 같이 조금 더 향상된 for 문을 사용할 수 있다.
for(타입 변수명 : 배열/컬렉션) {
반복 될 코드;
}
foreach 스타일 for문
: 어떤 컬렉션이든 순회할 수 있음
Effetive java - item 46 : for문보다는 for-each를 사용하라
for-each문은 반복자나 인덱스 변수를 제거해 오류 가능성을 줄인다
int[] nums = {1,2,3,4,5};
for (int num : nums) {
System.out.println(num);
}
while
특정 조건이 참일 경우에 지정한 코드 블럭이 계속해서 수행되는 구문이다.
while(조건식) {
조건식이 참일 경우 반복되는 코드;
}
조건식이 항상 참일 경우에는 계속해서 해당 코드들이 실행되므로 다음 명령들을 수행할 수 없는 상태가 된다.
따라서 조건식을 잘 유의해서 사용해야 된다.
do-while
while 문이 조건식을 먼저 판별하고 코드를 수행했다면, do-while 문은 먼저 코드블럭을 수행하고 조건을 판별한다.
do {
조건식이 참일 경우 반복되는 코드;
}while(조건식){
};
분기문(Branching Statement)
조건문에서 프로그래머의 의도에 의해 중간 흐름을 바꿀 수 있는 구문
break
break 문은 두가지 케이스로 나뉘는데, 이는 라벨링이 된 것과 안된 것이다.
먼저 라벨링이 되지 않는 break 문은 switch 문, 반복문에서 사용될 수 있으며, 해당 구문을 만났을 때 가장 가까운 조건문을 종료한다.
for(int i = 0; i <= 10; i++) {
if(i == 5) break;
System.out.println(i);
} // 출력 // 1 // 2 // 3 // 4
다음과 같은 예시가 존재할 때, i가 5가 되면 반복문을 종료하고 다음 코드로 진행하게 된다.
라벨링이 된 break 문은 똑같이 break를 만나면 제어문이 종료되지만, 해당 라벨링이 된 제어문 자체가 종료된다.
즉, 가장 가까운 제어문뿐만 아니라 자신이 표시한 위치안의 제어문을 종료하는 것이다.
int findIt = 10;
search:
for(int i = 0; i < arr.length; i++) {
for(int j = 0; j< arr[i].length; j++) {
if(arr[i][j] == findIt) {
break search;
}
}
}
위의 예시에서는 arr의 값이 10일 경우, search: 안에 있는 두개의 for 문 모두 종료된다.
continue
continue 문은 반복문 안에서 사용되며, 조건에 해당할 경우에만 반복문을 건너뛴다.
continue 문도 break 문과 똑같이 라벨링이 된 경우와 안된 경우가 존재하고 똑같은 메커니즘으로 동작한다.
for(int i = 0; i <= 10; i++) {
if(i == 5) continue; System.out.println(i);
}
// 출력 // 1 // 2 // 3 // 4 // 6 // 7 // 8 // 9 // 10
위의 예제에서는 i가 5일 경우에만 가장 가까운 반복문의 끝으로 건너뛴다.
int findIt = 10;
search:
for(int i = 0; i < arr.length; i++) {
for(int j = 0; j< arr[i].length; j++) {
if(arr[i][j] == findIt) {
continue search;
}
}
}
위의 예제의 경우, arr의 값이 10일 경우, search: 의 가장 바깥 for 문의 끝으로 건너뛰게 된다.
return
return 문은 현재 메소드를 종료시키고 해당 메소드를 호출한 위치로 돌아간다.
이 또한 메소드의 타입에 의해 뒤에 값이 올 수 있고 안올 수 있다.
int getAge(String name) {
if(name == "jongnan") return 28;
System.out.println("존재하지 않는 사람!");
return -1;
}
위의 예제는 메소드의 타입이 int 이므로 반환 값을 지정해주어야 한다.
void pringAge(String name) {
if(name == "jongnan") {
System.out.println("28");
return;
}
System.out.println("존재하지 않는 사람!");
return;
}
Enumeration
- 초기 Collection만 지원
- Snap-shot : 원본과 달리 사본을 남겨처리. 다른 처리가 발생하면 오류 가능성 생김
- hasMoreElements(), nextElement()
Vector<Integer> vector = new Vector<>(Arrays.asList(1,2,3));
Enumeration elements = vector.elements();
while (elements.hasMoreElements()) {
int e = (int)elements.nextElement();
System.out.println(e);
}
Iterator
- 모든 Collection 지원
- enumeration에 비해 빠르다.
- hasNext(), next(), remove()
Iterator<Integer> iterator = Arrays.asList(1, 2, 3).iterator();
while (iterator.hasNext()) {
Integer number = iterator.next();
}