[Java] 반복문(while, do while, 이름붙은 반복문)
2.2 while문
for문에 비해 while문은 구조가 간단하다. if문처럼 조건식과 블럭{}만으로 이루어져 있다.
다만 if문과 달리 while문은 조건식이 ‘참(true)인 동안’, 즉 조건식이 거짓이 될 때까지 블럭 {}내의 문장을 반복한다.
while (조건식) {
// 조건식의 연산결과가 참인 동안, 반복될 문장들을 적는다.
}
- for문과 while문의 비교
1부터 10까지의 정수를 순서대로 출력하는 for문을 while문으로 변경해보자.
1) for문
for(int i = 1; i <= 10; i++) {
System.out.println(i);
}
2) while문
int i = 1; //초기화
while(i<=10) {
System.out.println(i);
i++;
}
for문과 while문은 항상 서로 변환이 가능하다.
초기화, 증감식이 필요하지 않은 경우 → while문이 적합
- while문의 조건식은 생략불가
for문과 달리 while문의 조건식은 생략할 수 없다.
그래서 while문의 조건식이 항상 참이 되도록 하려면 반드시 true를 넣어야 한다. 다음의 두 반복문은 블럭{} 내의 문장을 무한 반복한다.
1)
for(;;) { //조건식이 항상 참
...
}
2)
while(true) {
...
}
- 각 자릿수의 합 구하기
class FlowEx25 {
public static void main(String[] args) {
int num = 0;
int sum = 0;
System.out.print("숫자를 입력하세요.(예:12345)>");
Scanner scanner = new Scanner(System.in);
String tmp = scanner.nextLine(); // 화면을 통해 입력받은 내용을 tmp에 저장
num = Integer.parseInt(tmp); // 입력받은 문자열(tmp)을 숫자로 변환
while(num!=0) {
// num을 10으로 나눈 나머지를 sum에 더함
sum += num%10; // sum = sum + num%10;
System.out.printf("sum=%3d num=%d%n", sum, num);
num /= 10; // num = num / 10; num을 10으로 나눈 값을 다시 num에 저장
}
System.out.println("각 자리수의 합:"+ sum);
}
}
입력을 12345로 한다면, 출력으로는
sum= 5 num = 12345
sum= 9 num = 1234
sum= 12 num = 123
sum= 14 num = 12
sum= 15 num = 1
‘num/=10’에 의해 한 자리씩 줄어들다가 0이 되면, while문의 조건식이 거짓이 된다.
printf에 쓰인 포맷을 보면 ‘%3d’부분에서 10진수 앞에 공백을 3칸 만들어 자릿수가 늘어나면 공백이 없어지는 형식을 사용해서 출력이 깔끔하게 나온다.
2.3 do-while문
do-while문은 while문의 변형으로 기본적으로 구조는 while문과 같으나 조건식 블럭{}의 순서를 바꿔놓은 것이다. 그래서 while문과 반대로 블럭{}을 먼저 수행한 후 조건식을 평가한다.
while문은 조건식의 결과에 따라 블럭이 한 번도 수행되지 않을 수 있지만, do-while문은 최소 한번 수행을 보장한다.
do {
//조건식의 연산결과가 참일 때 수행될 문장
} while (조건식); //세미콜론을 잊지말자.
많이 사용되지는 않지만,
다음의 예제처럼 반복적으로 사용자의 입력을 받아서 처리할 때 유용하다.
class FlowEx28 {
public static void main(String[] args) {
int input = 0;
int answer = 0;
answer = (int)(Math.random() * 100) + 1; // 1~100사이의 임의의 수를 저장
Scanner scanner = new Scanner(System.in);
do {
System.out.print("1과 100사이의 정수를 입력하세요.>");
String tmp = scanner.nextLine();
input = Integer.parseInt(tmp);
if(input > answer) {
System.out.println("더 작은 수로 다시 시도해보세요.");
} else if(input < answer) {
System.out.println("더 큰 수로 다시 시도해보세요.");
}
} while(input!=answer);
System.out.println("정답입니다.");
}
}
Math.random()을 이용해서 임의의 수를 저장하고 이 값을 맞출 때까지 반복하는 예제이다.
사용자 입력인 input이 변수 answer의 값과 다른 동안 반복하다가 두 값이 같으면 반복을 벗어난다.
2.4 break문
- switch문에서 break를 사용하는 것을 배웠었다. 이 반복문에서도 break문을 사용할 수 있는데,
- break문은 자신이 포함된 가장 가까운 반복문을 벗어난다. 주로 if문과 함께 사용되어 특정 조건을 만족하면 반복문을 벗어나도록 한다.
2.5 continue문
- 반복문 내에서만 사용될 수 있으며, 반복이 진행되는 도중에 continue문을 만나면 반복문의 끝으로 이동하여 다음 반복으로 넘어간다.
- for문의 경우 증감식으로 이동하며, while문과 do-while문의 경우 조건식으로 이동한다.
- continue문은 반복문 전체를 벗어나지 않고 다음 반복을 계속 수행한다는 점이 break문과 다르다.
- 전체 반복 중에 특정 조건을 만족하는 경우를 제외하고자 할 때 유용하다.
class FlowEx31 {
public static void main(String[] args) {
for(int i=0;i <= 10;i++) {
if (i%3==0)
continue;
System.out.println(i);
} //i%3==0 즉, 3의 배수이면 continue 여기로 이동
}
}
1과 10 사이의 숫자를 출력하되 그중에서 3의 배수인 것들은 제외하는 코드이다.
이와 같이 조건식이 참이 되어 continue문에 의해 반복문 끝으로 이동되어 출력을 하지 않도록(제외) 하는 것에 유용하다.
2.6 이름 붙은 반복문
break문은 근접한 단 하나의 반복문만 벗어날 수 있기 때문에, 여러 개의 반복문이 중첩된 경우에는 break문으로 중첩 반복문을 완전히 벗어날 수 없다.
이때 중첩 반복문 앞에 이름을 붙이고 break문과 continue문에 이름을 지정해 줌으로 하나 이상의 반복문을 벗어나거나 반복을 건너뛸 수 있다.
class FlowEx33 {
public static void main(String[] args)
{
// for문에 이름을 붙임.
Loop1 : for(int i=2;i <=9;i++) {
for(int j=1;j <=9;j++) {
if(j==5)
break Loop1;
// break;
// continue Loop1;
// continue;
System.out.println(i+"*"+ j +"="+ i*j);
} // end of for i
System.out.println();
} // end of Loop1
}
}
j가 5일 때 반복분 Loop1을 벗어나도록 했으므로 2단의 4번째 줄까지 밖에 출력되지 않는다.
만일 반복문의 이름이 지정되지 않은 break문이었다면 2단부터 9단까지 모두 네 줄씩 출력되었을 것이다.
참고자료 -