
java의 반복문으로는 for문, while문, do~while문이 있다.
흐름: 변수를 하나 할당 > 변수 초기화(임의의 값) > 조건 체크(중괄호 영역에서 반복) > 증감 > 조건 달성하여 false가 되면 반복문을 빠져 나옴(≠ 출력)
즉, for문은 조건이 true일 때만 수행문을 반복한다.
그리고 위의 흐름을 for문에서 사용하는 명칭으로 바꾸어 보면 다음과 같다.
아래 예제를 통해 for문을 더 자세히 알아 보자.
package kr.s05.operation;
public class ForMain01 {
public static void main(String[] args) {
System.out.println("===for문===");
//초기식;조건식;증감식
for(int i=1;i<=5;i++) {
System.out.println(i);
}
System.out.println("================");
//수행문이 한 줄일 경우 {} 생략 가능
for(int i=1;i<=5;i++)
System.out.println(i);
for(int i=5;i>=1;i--) {
System.out.print(i + "\t");
}
System.out.println("\n===============");
System.out.println("프로그램 끝");
}
}
여기서 int i=1;이 초기식, i<=5;가 조건식, i++가 증감식에 해당하며
i가 1에서 출발해 5 이하일 동안, i를 하나씩 증가시키면서 출력하는 for문임을 알 수 있다.
또한, 아래와 같이 for문과 대입 연산자 혹은 if문을 함께 활용 시 짝수만 출력할 수 있다.
package kr.s05.operation;
public class ForMain02 {
public static void main(String[] args) {
for(int i=0;i<=10;i+=2) {
System.out.print(i + "\t");
}
System.out.println("\n================");
for(int i=0;i<=10;i++) {
if(i%2==0) {
System.out.print(i + "\t");
}
}
}
}
1번 방법은 i+=2 복합 대입 연산자를 활용해 i를 2씩 더해준 뒤 출력하는 것이고
2번 방법은 i가 2로 나누었을 때 나머지가 0인, 즉 짝수일 때만 출력되도록 if문의 중괄호 안에 출력식을 넣어준 것이다.
package kr.s05.operation;
public class ForMain03 {
public static void main(String[] args) {
//1부터 100까지의 합 구하기
int sum = 0;
for(int i=1;i<=100;i++) {
sum += i;//sum = sum + i
}
System.out.println("1부터 100까지의 합 : " + sum);
System.out.println("=====================");
//1부터 100까지의 범위에서 짝수의 합을 구하기
int total = 0;
for(int i=1;i<=100;i++) {
if(i%2==0) {//짝수일 경우 누적
total += i;
}
}
System.out.println("1부터 100까지 짝수의 합 : " + total);
}
}
또한, for문과 복합 대입 연산자를 활용하면 일련의 숫자들을 더해 합계를 구하는 것도 손쉽게 할 수 있다.
for문 안에서 sum+= i와 같은 방법을 '누적'이라고 표현하며 if문을 통해 짝수를 구하는 방식을 접목해 1부터 100까지 짝수의 합을 구할 수도 있다.
다음은 Scanner를 통해 정수를 입력 받은 다음, for문을 통해 간단한 구구단 프로그램을 만드는 방법이다.
> Scanner, for문을 활용해 구구단 프로그램 만들기
순차적으로 증감하는 값이 여러 개 필요할 경우 다중 for문을 사용하게 되는데, 프로그램이 느려질 위험이 있어 가급적 덜 쓰는 것이 좋으며 가장 많이 사용되는 것은 '이중 for문'이다.
package kr.s05.operation;
public class ForMain05 {
public static void main(String[] args) {
//2~9단까지 출력하기 위해 다중for문을 사용
for(int dan=2;dan<=9;dan++) {//dan : 구구단의 단 2~9
System.out.println("***" + dan + "단****");
for(int i = 1;i<=9;i++) {//i : 곱해지는 수 1~9
System.out.println(dan + "*" + i + "=" + dan*i);
}
}
}
}
위 예제는 앞선 구구단 프로그램과 달리 단(dan)과 곱해지는 수 모두가 변하는 프로그램을 만들기 위해 이중 for문 형태를 띈다.
출력)
***2단****
2*1=2
2*2=4
2*3=6
2*4=8
2*5=10
2*6=12
2*7=14
2*8=16
2*9=18
***3단****
3*1=3
3*2=6
3*3=9
3*4=12
3*5=15
.
.
.
흐름: while문 바깥에서 변수를 하나 할당 > 변수 초기화(임의의 값) > while문 안에서 조건 체크 > 조건에 부합할 때만 증감(중괄호 영역에서 반복)
while문은 조건 비교에 만족할 때만 수행문을 수행하는 반복문이다.
다음 예제를 통해 더 자세히 알아 보자.
package kr.s05.operation;
public class WhileMain01 {
public static void main(String[] args) {
int i = 1;
while(i <=10) {
System.out.println(i++);
}
System.out.println("================");
int j = 10;
while(j >=0) {
System.out.println(j--);
}
}
}
1) 여기서 int i = 1;이 초기식, i<=10;가 조건식, System.out.println(i++);가 증감식에 해당하며
i가 1에서 출발해 10 이하일 동안, i를 하나씩 증가시키면서 출력하는 for문임을 알 수 있다.
2) 만약 while문에서 증감식을 작성해 주지 않으면, 무한루프에 빠지게 된다.
ex.
while(i <=10) {
System.out.println(i);
}
→ 이때는 콘솔의 빨간 네모 버튼(terminate)을 눌러 루프를 멈추고 코드를 수정해야 한다.

또한, for문과 마찬가지로 복합 대입 연산자를 활용해 일련의 숫자들을 더해 합계를 구하는 것이 가능하다.
package kr.s05.operation;
public class WhileMain02 {
public static void main(String[] args) {
//1부터 100까지의 합 구하기
int sum = 0, su = 1;//초기값
//조건식
while(su <=100) {
//누적
sum += su;
su++; //증감식
}
System.out.println("1부터 100까지의 합 : " + sum);
}
}
이때 int sum = 0은 while문을 돌며 숫자들이 누적될, 합계가 될 변수에 해당하고 su = 1의 경우 증감식에 따라 1씩 증가하며 sum에 누적될 숫자에 해당한다.
Scanner로 입력 받는 구구단 프로그램을 while문으로 작성하면 다음과 같다.
> Scanner, while문을 활용해 구구단 프로그램 만들기
위에서 배운 내용을 토대로 실습을 진행하였다.
package kr.s05.operation;
public class WhileMain04 {
public static void main(String[] args) {
/*
* [실습]
* 입력받은 정수값부터 0까지 출력하는 프로그램을 작성하시오.
* (0보다 큰 수를 입력하는데 만약 0을 입력하면
* "0보다 큰 수를 입력하세요"라고 출력)
*
* [입력 예시]
* 정수 입력: 3
*
* [출력 예시]
* 3
* 2
* 1
* 0
*/
java.util.Scanner input = new java.util.Scanner(System.in);
System.out.print("정수 입력 : ");
int num = input.nextInt();
if(num >0) {
while(num >=0) {
System.out.println(num--);
}
}else {
System.out.println("0보다 큰 수를 입력하세요");
}
input.close();
}
}
int num에 저장한다.if(num >0){ 0 초과면 while문으로while(num >=0) 입력받은 정수값을 0까지System.out.println(num--); 1씩 감소하며 출력한다.}else {System.out.println("0보다 큰 수를 입력하세요");} 0과 음수라면 "0보다 큰 수를 입력하세요" 문구를 출력한다.input.close();--
다음은 '0 전까지 입력받은 정수로 합 구하기' 예제에 대한 코드를 2가지 방법으로 작성해 보았다.
package kr.s05.operation;
public class WhileMain05 {
public static void main(String[] args) {
java.util.Scanner input = new java.util.Scanner(System.in);
int a, total = 0;
System.out.println("0 전까지 입력받은 정수로 합 구하기");
System.out.print("누적할 정수 데이터 입력: ");
while((a = input.nextInt()) != 0) {
total += a; //누적
System.out.print("누적할 정수 데이터 입력: ");
}
System.out.println("total = " + total);
input.close();
}
}
0 전까지 입력받은 정수들의 합을 구한다는 말은 곧,
① 0을 입력하면 while문을 통한 반복이 멈춘다는 뜻이고,
② 이 말은 false가 되는 조건이 입력받은 정수가 0이 된다는 뜻이며
③ 바꾸어 말하면 0이 아닌 정수들은 무엇을 입력하던 true라는 뜻이다.
그리고 조건문 자체에 입력값을 넣어 입력값이 변동되기 때문에 증감식이 필요하지 않다.
while((a = input.nextInt()) != 0) { 입력 받은 정수(변수 a)가 0이 아니면total += a; 정수형 변수 total에 누적한다.System.out.print("누적할 정수 데이터 입력: ");} 다시 출력하여 입력받도록 한다.System.out.println("total = " + total); 누적된 데이터를 출력한다.input.close();package kr.s05.operation;
public class WhileMain06 {
public static void main(String[] args) {
java.util.Scanner input = new java.util.Scanner(System.in);
int a, total = 0;
System.out.println("0 전까지 입력받은 정수로 합 구하기");
while(true) {
System.out.print("누적할 정수 입력> ");
a = input.nextInt();
if(a == 0) {
break;
}
total += a;
}
System.out.println("total = " + total);
input.close();
}
}
다음은 무한루프 형태 를 활용해 '누적할 정수 입력>'이라는 가이드를 두 번 쓰지 않고, 보다 효율적인 코드를 작성할 수 있는 방법이다.
while(true) { 조건 자체가 이미 true이므로 수행문을 실행한다.System.out.print("누적할 정수 입력> "); 문구를 출력한다.a = input.nextInt(); 정수를 a라는 변수에 입력 받는다.if(a == 0) {break;} 만약 0을 입력한다면, 'break;'를 통해 while 반복문을 빠져나간다.total += a; 정수형 변수 total에 입력 받은 정수를 계속 누적한다.System.out.println("total = " + total); 누적된 데이터를 출력한다.input.close();다음은 메뉴 반복을 통해 조금 더 고도화된 은행 프로그램을 만들어 보았다.
> Scanner, if문, while문을 활용한 은행 프로그램 만들기
이어 위에서 배운 내용을 바탕으로 다음과 같이 실습을 진행하였다.
> Scanner, if문, while문을 활용한 커피 주문 프로그램 만들기
흐름: do~while문 바깥에서 변수를 할당 > 변수 초기화(임의의 값) > do 블럭 안에서 수행문을 수행한 뒤 > while문 안에서 조건 체크 > 조건에 부합할 때 증감(do 블럭 안의 수행문 반복)
조건이 맞지 않으면 수행문으로의 진입이 불가한 while문과는 달리, do while문은 선처리후비교 방식이다.
아래 예제를 통해 while문과 do~while문의 차이를 알아 보자.
package kr.s05.operation;
public class DoWhileMain01 {
public static void main(String[] args) {
int su = 0;
String str = "Hello world";
//선 처리, 후 비교
do {
System.out.println(str);
}while(su++ < 5);
System.out.println("==============");
int su2 = 0;
//선 비교, 후 처리
while(su2++ < 5) {
System.out.println(str);
}
}
}
출력)
Hello world
Hello world
Hello world
Hello world
Hello world
Hello world
==============
Hello world
Hello world
Hello world
Hello world
Hello world
위와 같이 do~while문을 활용하게 될 경우, do 블럭에서 str 변수가 한 번 더 호출되기 때문에 'Hello world'가 6번 출력된다.
하지만 while문의 경우 su2 변수가 0에서부터 출발해 5 전인 4까지 증가하기 때문에 'Hello world' 문구가 5번 출력된다.
조금 더 심화된 예제를 통해 do~while문의 특징을 알아 보자.
> Scanner, do~while, switch문을 활용해 성적 프로그램 구하기