반복문(Iteration statements, loop)은 프로그램 내에서 똑같은 명령을 일정 횟수만큼 반복하여 수행하도록 제어하는 명령문 입니다.
- 어떤 실행문을 여러번 반복해서 실행하는 경우에 사용한다.
- 조건문을 만족하면 계속해서 실행한다.
- 실행문은 중괄호 {} 로 묶어서 표시한다.
- 형식
for(초기문; 조건문; 증감문) { 실행문 }
바로 예제를 풀어보도록 하겠다.
1에서 10까지의 숫자를 출력하시오.
이 문제도 System.out.println("1"); System.out.println("2"),,, 등등 쭉쭉 반복되는 코드를 반복문을 이용하여 혁신적으로 줄여줄 수 있다.
public class ExampleFor1 {
public static void main(String[] args) {
for(int i=1; i<=10; i++) {
System.out.print(i + " "); // 1 2 3 4 5 6 7 8 9 10
}
}
}
10에서 1까지의 숫자를 출력하시오.
public class ExampleFor2 {
public static void main(String[] args) {
for(int a = 10; a>=1; a--) {
System.out.print(a + " "); // 10 9 8 7 6 5 4 3 2 1
}
}
}
순차적으로 숫자를 출력하는 것으로 for문의 형식을 외울 수 있었다. 이제 조건을 하나 둘씩 더 걸어서 구현을 해보도록 하겠다.
알고리즘 문제에서 많이 보았던 구구단 문제이다. 현재 7월달이니 구구단 7단을 출력해보겠다.
구구단 7단을 출력하시오.
public class ExampleFor3 {
public static void main(String[] args) {
int dan = 7;
for(int chill = 1; chill <= 9; chill++) {
System.out.println("구구단 7단 : " + dan + " X " + chill + " = " + (dan*chill));
}
}
//구구단 7단 : 7 X 1 = 7
//구구단 7단 : 7 X 2 = 14
//구구단 7단 : 7 X 3 = 21
//구구단 7단 : 7 X 4 = 28
//구구단 7단 : 7 X 5 = 35
//구구단 7단 : 7 X 6 = 42
//구구단 7단 : 7 X 7 = 49
//구구단 7단 : 7 X 8 = 56
//구구단 7단 : 7 X 9 = 63
}
}
구구단을 구현하는 것도 알고리즘을 이해하면 구현하기 쉽다.
처음에는 엄청 버벅거리고 며칠을 헤맸는데 이젠 바로바로 구현이 가능한 것을 보니 코드와 싸운 효과가 있나보다.
1 ~ 100 사이의 모든 3의 배수만 출력하기
나머지를 활용하는 modular연산을 이용해서 구현할 수 있다.
public class ExampleFor4 {
public static void main(String[] args) {
for(int n = 1; n <= 100; n++) {
if(n%3 == 0) {
System.out.print(n + " ");
}
}
// 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99
}
}
1 ~ 100 모든 정수 더하기 (5050)
public class ExampleFor5 {
public static void main(String[] args) {
int sum = 0;
for(int i=1; i<=100; i++) {
sum += i;
}
System.out.println("전체 합 : " + sum);
// 전체 합 : 5050
}
}
이렇게 대입연산자를 활용한 반복문도 많이 활용되는것 같으니 잘 알아두어야겠다.
- begin ~ end 모든 정수 더하기.
- begin과 end 중 누가 큰지 모르는 상황, begin이 항상 end보다 작은 값이어야 함
조건문과 함께 활용해서 해결하면 된다.
public class ExampleFor6 {
public static void main(String[] args) {
int begin = 10;
int end = 1;
int total = 0;
// begin이 end보다 큰 경우
if(begin>end) {
int temp;
temp = begin;
end = begin;
begin = temp;
for(begin=0; begin<=end; begin++) {
total += begin;
}
System.out.println("begin+total=" + total);
} else {
// begin이 end보다 작은 경우
for(begin=0; begin<=end; begin++) {
total += begin;
}
System.out.println("begin+total=" + total);
//begin+total=55
}
}
}
이렇게 풀어도 되지만 비슷하지만 조금 더 간단하게 구현할 수도 있다.
public class ExampleFor7 {
public static void main(String[] args) {
int begin = 5;
int end = 1;
if(begin > end) {
int temp;
temp = begin;
begin = end;
end = temp;
}
int total = 0;
for(int n=begin; n<=end; n++) {
total += n;
}
System.out.println("begin+total=" + total);
// begin+total=15
}
}
평점에 따른 별(★) 출력하기
public class ExampleFor8 {
public static void main(String[] args) {
int point = 1;
String star = "";
// n=0으로 초기화하면 조건문에서 n < point 라고 해도 되고,
// n=1으로 초기화하면 조건문에서 n <= point라고 하면된다.
for(int n = 0; n < point; n++) {
star += "★";
}
System.out.println(star);
//★
}
}
- 특정 실행문을 반복할 때 사용한다.
- 특정 반복 횟수가 정해지지 않은 경우에 사용한다.
- 형식
public class while { public static void main(String[] args) { while(조건문) { 실행문 } } }
형식은 if문과 유사하게 생겼다.
- 실무에서는 API나 File, Database를 읽을 때 많이 사용된다고 한다.
예제를 풀어보자면
보이스피싱을 당해서 통장 잔고 중 450원씩 계속 빠져나간 내용을 표시하시오.
public class while1 {
public static void main(String[] args) {
int balance = 79350;
int money = 450;
while(balance>=money) {
System.out.println("잔액 " + balance + " 인출액 " + money);
balance -= money;
}
System.out.println("잔액 " + balance);
// 잔액과 인출액을 통장잔고가 바닥날 때 까지 반복하여 나타낸 후, 빠져나가지 못한 마지막 남은 잔액 150원이 표시된다.
}
}
조건문 안의 내용이 true라면 무한반복 된다.
반복문을 멈추고 싶을 때 switch에서 사용했던 break문을 사용하여 멈출 수 있다.
예제를 풀어봅시다.
크리스마스 모금을 받는데 모금 목표가 100000원이다.
한번에 30원씩 모금할 수 있는데 몇번 모금을 받아야 할까요?
public class break {
public static void main(String[] args) {
int total = 0;
int money = 30;
int serial = 0;
int goal = 100000;
while(true) { //무한루프
if(total>=goal) {
break;
}
total += money;
serial++;
System.out.println(serial + "회 모금액 " + money + "\t현재 " + total + "원");
} // 계속 반복되어 누적되는 것을 기록하여 보여주다가
// 마지막에 '3334회 모금액 30 현재 100020원' 을 표시해서 보여준다.
System.out.println();
System.out.println(serial + "회"); // 3334회
}
}
- 반복문(for, while)을 종료시키지 않고, 반복문의 시작 지점으로 이동한다.
- 반복문에서 실행을 제외하고 싶은 경우에 사용한다.
- 실무에서는 continue대신 활용할 수 있는 좋은 코드들이 있기 때문에 많이 중요하지 않다.
- 형식
public class continue { public static void main(String[] args) { while(true) { a; b; c; continue; // a b c 만 실행하고 다시 while()문으로 이동한다. d; e; f; g; // d e f g는 실행되지 않는다. (Dead Code) } } }
예제를 풀어보자.
1~ 100 중에서 3의 배수를 제외하고 모두 더하기
Continue를 사용한 풀이
public class continue {
public static void main(String[] args) {
int n = 0;
int total = 0;
while(n < 100) {
n++;
if(n % 3 == 0) {
continue;
}
total += n;
}
System.out.println(total); //3367
}
}
Continue를 사용하지 않은 풀이
public class continue {
public static void main(String[] args) {
int sum = 0;
int a = 0;
while(a<100) {
a++;
if(a % 3 != 0) {
sum += a;
}
}
System.out.println(sum); // 3367
}
}
Continue를 사용하지 않은 풀이가 더 간결하고 나중에 코드를 바꿀때도 더 이해하기 쉬울 것 같다.