for (초기화; 조건식; 증감식) {
//조건식이 참일 때 수행될 문장들을 적는다.
}
- 수행순서: 초기화 > 조건식 > 수행될 문장 > 증감식
- 초기화, 조건식, 증감식 모두 생략 가능 => 참으로 간주되어 무한 반복문
for(int i=1; i<5; i++) { // 1부터 5까지 1씩 증가 System.out.printf("%d%n",i); } //출력 1 2 3 4
for (int i=1,j=0; i<=10; i++) { ... }
for(int i=1; i<=10; i++) { ... } // 'i<=10'가 참인 동안 블럭{}안의 문장들을 반복
for(int i=1; i<=10; i++) { ... } // 1부터 10까지 1씩 증가
for(int i=1; i>=1; i--) { ... } // 10부터 1까지 1씩 감소
for(int i=1; i<=10; i+=2) { ... } // 1부터 10까지 2씩 증가
✨ 예제 1
public class FlowEx7 {
public static void main(String[] args) {
for(int i=1; i<=5; i++) {
System.out.println(i);
}
}
}
✨ 예제 2
public class FlowEx8 {
public static void main(String[] args) {
int sum = 0; // 합계를 저장하기 위한 변수
for (int i=1; i<=10; i++) {
sum += i;
System.out.printf("1부터 %2d 까지의 합: %2d%n", i,sum);
}
}
}
✨ 예제 3
public class FlowEx9 {
public static void main(String[] args) {
for (int i=1; i<=5; i++){
for (int j=1; j<=10; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
✨ 예제 4
public class FlowEx10 {
public static void main(String[] args) {
for (int i=1; i<=5; i++) {
for (int j=1; j<=i; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
for (타입 변수명 : 배열 또는 컬렉션) {
// 반복할 문장
}for (int i=0, i<arr.length, i++) { System.out.println(arr[i]); } // 향상된 for문 변형 for (int tmp : arr) { System.out.println(tmp); }
while(조건식) {
// 조건식의 연산결과가 참(true)인 동안, 반복될 문장들을 적는다.
}
- 조건식이 참인동안 블럭{} 내 문장을 반복한다.
- while문의 조건식은 생략불가
int i=1; // 초기화 while(i<=3) { //조건식 System.out.println(i); i++; // 증감식 } //출력 1 2 3
✨ 예제 5
public class FlowEx11 {
public static void main(String[] args) {
int i=5;
while(i--!=0) {
System.out.printf("%d%n",i);
}
}
}
do {
// 조건식의 연산결과가 참일 때 수행될 문장들을 적는다.
} while (조건식);
- while문과 반대로 블럭{}을 먼저 수행한 후에 조건식을 평가한다.
- while문은 조건식의 결과에 따라 블럭{}이 한 번도 수행되지 않을 수 있지만 do-while문은 최소한 한번은 수행될 것을 보장한다.
✨ 예제 6
import java.util.*;
public class FlowEx12 {
public static void main(String[] args) {
int input = 0, answer = 0;
answer = (int)(Math.random() * 100) + 1; // 1~100 임의의 수를 저장
Scanner scanner = new Scanner(System.in);
do {
System.out.println("1과 100사이의 정수를 입력하세요.");
input = scanner.nextInt();
if(input > answer) {
System.out.println("더 작은 수로 다시 시도해보세요.");
} else if(input < answer){
System.out.println("더 큰 수로 다시 시도해보세요.");
}
} while (input!=answer);
System.out.println("정답입니다.");
}
}
switch문에서처럼 break문은 자신이 포함된 가장 가까운 반복문을 벗어난다.
✨ 예제 7
public class FlowEx13 {
public static void main(String[] args) {
int sum = 0;
int i = 0;
while(true) {
if(sum > 100)
break; // break문이 실행되면 아래 두 줄을 수행하지 않고 while문을 완전히 벗어난다.
++i;
sum += i;
} // end of while
System.out.println("i=" + i);
System.out.println("sum=" +sum);
}
}
반복문 내에서만 사용할 수 있으며, 반복이 진행되는 도중에 continue문을 만나면 반복문의 끝으로 이동하여 다음 반복으로 넘어간다. 반복문을 완전히 벗어나지 않는다는 점이 break문과 다르다.
✨ 예제 8
public class FlowEx14 {
public static void main(String[] args) {
for(int i=0; i<=10; i++) {
if(i%3==0)
continue; // 조건이 참이되어 continue문이 실행되면 블럭의 끝으로 이동
System.out.println(i);
} // 여기가 블럭의 끝
}
}
break문은 근접한 단 하나의 반복문만 벗어날 수 있기 때문에, 여러 개의 반복문이 중첩된 경우 break문으로 중첩 반복문을 완전히 벗어날 수 없다. 이때는 중첩 반복문 앞에 이름을 붙이고 break문과 continue문에 이름을 지정해 줌으로써 하나 이상의 반복문을 벗어나거나 건너뛸 수 있다.
✨ 예제 9
public class FlowEx15 {
public static void main(String[] args) {
Loop1 : for(int i=2; i<=9; i++) { // for문에 Loop1이라는 이름을 붙였다.
for(int j=1; j<=9; j++) {
if(j==5)
break Loop1;
System.out.println(i+"*"+j +"="+ i*j);
} // end of for i
System.out.println();
} // end of Loop1
}
}
참고
자바의 정석(저자: 남궁성)
드디어 반복문을 자바문법으로 배웠다. do-while문은 파이썬에서 생소하므로 많은 연습이 필요할 것 같다.
어떤 부분이나 똑같겠지만 특히 반복문은 예제를 많이 연습해야 익숙해질 것 같다.
자바 문법을 다 배우면 코딩테스트를 자바문법으로 연습해서 좀 더 능숙하게 다뤄보도록 해야겠다.
내일부터는 배열에 들어간다.
배열을 마치면 드디어! 객체지향 프로그래밍 챕터에 들어간다.