반복문은 이름 그대로 특정 코드를 반복해서 실행할 때 사용한다.
자바는 다음 3가지 종류의 반복문을 제공한다.
while, do-while,for
While1_1
package loop;
public class While1_1 {
public static void main(String[] args) {
int count = 0;
count = count + 1;
System.out.println("현재 숫자는:" + count);
count = count + 1;
System.out.println("현재 숫자는:" + count);
count = count + 1;
System.out.println("현재 숫자는:" + count);
}
}
실행 결과
현재 숫자는:1
현재 숫자는:2
현재 숫자는:3
이렇게 특정 코드를 반복해서 실행할 때 사용하는 것이 바로 반복문이다.
while (조건식) {
// 코드
}
조건식을 확인한다. 참이면 코드 블럭을 실행하고, 거짓이면 while문을 벗어난다
조건식이 참이면 코드 블럭을 실행한다. 이후에 코드 블럭이 끝나면 다시 조건식 검사로 돌아가서 조건식을 검사한다. (무한 반복)
While1_2
package loop;
public class While1_2 {
public static void main(String[] args) {
int count = 0;
while (count < 3) {
count = count + 1;
System.out.println("현재 숫자는:" + count);
}
}
}
실행 결과
현재 숫자는:1
현재 숫자는:2
현재 숫자는:3
메모
참이면 변수를 1 증가시키고 다시 저장시킨다.
그리고 다시 1증가시킨 값이 참이면 1 증가시키고 다시 저장시킨다.
조건식이 false가 되기전까지 반복 실행한다.
문제: 1부터 하나씩 증가하는 수를 3번 더해라 (1 ~ 3 더하기)
이 문제는 1부터 하나씩 증가하는 수이기 때문에 1 + 2 + 3을 더해야 한다.
우선 while 문을 사용하지 않고 풀어보자.
While2_1
package loop;
public class While2_1 {
public static void main(String[] args) {
int sum = 0;
sum = sum + 1; //sum(0) + 1 -> sum(1)
System.out.println("i=" + 1 + " sum=" + sum);
sum = sum + 2; //sum(1) + 2 -> sum(3)
System.out.println("i=" + 2 + " sum=" + sum);
sum = sum + 3; //sum(3) + 3 -> sum(6)
System.out.println("i=" + 3 + " sum=" + sum);
}
}
출력 결과
i=1 sum=1
i=2 sum=3
i=3 sum=6
위 코드는 변경에 유연하지 않다. 만약 변경하려면 많은 수정이 필요하다.
변수를 사용해서 더 변경하기 쉬운 코드로 만들어보자.
변경되는 부분을 i로 바꾸어보자.
While2_2
package loop;
public class While2_1 {
public static void main(String[] args) {
int sum = 0;
int i = 1;
sum = sum + i;
System.out.println("i=" + i + " sum=" + sum);
i++;
sum = sum + i;
System.out.println("i=" + i + " sum=" + sum);
i++;
sum = sum + i;
System.out.println("i=" + i + " sum=" + sum);
}
}
출력 결과
i=1 sum=1
i=2 sum=3
i=3 sum=6
변수 i를 사용한 덕분에 i의 값만 변경하면 나머지 코드를 전혀 변경하지 않아도 된다.
좋은 코드인지 아닌지는 변경 사항이 발생했을 때 알 수 있다. 변경 사항이 발생했을 때 변경해야 하는 부분이 적을수록 좋은 코드이다.
endNum 활용
package loop;
public class While2_3 {
public static void main(String[] args) {
int sum = 0;
int i = 1;
int endNum = 3;
//i=2, endNum=3
while (i <= endNum) {
sum = sum + i;
System.out.println("i=" + i + " sum=" + sum);
i++;
}
}
}
실행 결과
i=1 sum=1
i=2 sum=3
i=3 sum=6
while문 작성하기
while문에서 i <= endNum 조건을 통해 i가 endNum이 될 때 까지 코드 블럭을 실행한다.i가 endNum보다 크면 while문을 종료한다.코드 분석
sum(0), i(1), endNum(3)
//루프 1
while (i(1) <= endNum(3)) -> true
sum(0)+i(1) -> sum(1)
i(1)++ -> i(2)
//루프 2
while (i(2) <= endNum(3)) -> true
sum(1)+i(2) -> sum(3)
i(2)++ -> i(3)
//루프 3
while (i(3) <= endNum(3)) -> true
sum(3)+i(3) -> sum(6)
i(3)++ -> i(4)
//루프 4
while (i(4) <= endNum(3)) -> false
do-while문은 while문과 비슷하지만, 조건에 상관없이 무조건 한 번은 코드를 실행한다.
do-while문 구조
do {
// 코드
} while (조건식);
DoWhile1
package loop;
public class DoWhile2 {
public static void main(String[] args) {
int i = 10;
do {
System.out.println("현재 숫자는:" + i);
i++;
}
while (i < 3);
}
}
코드 풀이
do-while문은 최초 한번은 항상 실행된다. 따라서 먼저 현재 숫자는 : 10이 출력된다.
코드 블럭을 실행 후에 조건식을 검증하는데, 조건식이 거짓이면 do-while문을 빠져나온다.
do-while문은 최초 한번은 코드 블럭을 꼭 실행해야 하는 경우에 사용하면 된다.
break는 반복문을 즉시 종료하고 나간다.
continue는 반복문의 나머지 부분을 건너뛰고 다음 반복으로 진행하는데 사용된다.
while, do-while,for와 같은 모든 반복문에서 사용할 수 있다.
break
while(조건식) {
코드1;
break;//즉시 while문 종료로 이동한다.
코드2;
}
//while문 종료
berak를 만나면 코드2가 실행되지 않고 while문이 종료된다.
continue
while(조건식) {
코드1;
continue;//즉시 조건식으로 이동한다.
코드2;
}
continue를 만나면 코드2가 실행되지 않고 다시 조건식으로 이동한다.
Break1
package loop;
public class Break1 {
public static void main(String[] args) {
int sum = 0;
int i = 1;
while(true) {
sum = sum + i; //sum=1+2+3+4+5
if (sum > 10) {
System.out.println("합이 10보다 크면 종료: i=" + i + " sum=" + sum);
break;
}
i++;
}
}
}
실행 결과
합이 10보다 크면 종료: i=5 sum=15
while (true)는 무한반복을 말한다.
break문을 통해 중간에 나올 수 있다.
Continue1
package loop;
public class Continue1 {
public static void main(String[] args) {
int i = 1;
while(i <= 5) {
if(i == 3) {
i++;
continue;
}
System.out.println(i);
i++;
}
}
}
풀이
i==3인 경우i를 하나 증가하고 continue를 실행한다. 따라서 이 경우에는 i를 출력하지 않고 바로 조건식으로 넘어간다.
노트
break와 continue는 사용할 때 if문을 같이 쓴다.
for문은 주로 반복 횟수가 정해져 있을 때 사용한다.
for문 구조
for (1.초기식; 2.조건식; 4.증감식) {
// 3.코드
}
for문은 복잡해 보이지만 while문을 조금 더 편하게 다룰 수 있도록 구조화 한 것 뿐이다.
예를 들어 1부터 10까지 출력하는 for문은 다음과 같다.
for (int i = 1; i <= 10; i++) {
System.out.println(i);
}
풀이
1. 초기식이 실행된다. int i = 1
2. 조건식을 검증한다. i <= 10
3. 조건식이 참이면 코드를 실행한다.
4. 코드가 종료되면 증감식을 실행한다.
5. 다시 조건식을 검증하는 과정을 반복 이후 조건이 거짓이 되면 for문을 빠져나간다.
For1
package loop;
public class For1 {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
System.out.println(i);
}
}
}
endNum 활용
package loop;
public class For2 {
public static void main(String[] args) {
int sum = 0;
int endNum = 3;
//1+2+3 = 6
for (int i = 1; i <= endNum; i++) {
sum = sum + i;
System.out.println("i=" + i + " sum=" + sum);
}
}
}
실행 결과
i=1 sum=1
i=2 sum=3
i=3 sum=6
노트
for문을 활용하면 루프 횟수와 관련된 코드와 나머지 코드를 명확하게 구분하기에 좋다.
for ( ; ;) = while (true) 둘다 무한반복이다.
for문에서 break활용
package loop;
public class Break3 {
public static void main(String[] args) {
int sum = 0;
for (int i = 1; ; i++) {
sum = sum + i;
if (sum > 10) {
System.out.println("합이 10보다 크면 종료: i=" + i + " sum=" + sum);
break;
}
}
}
}
실행 결과
합이 10보다 크면 종료: i=5 sum=15
while문과 결과가 똑같다.
반복 횟수가 정해진 경우에는 for문을 사용하는 것이 구조적으로 더 깔끔하다.
노트
선언한 변수를 쓸 수 있는 범위가 정해져 있다.
반복문은 내부에 또 반복문을 만들 수 있다. for, while 모두 가능하다.
Nasted
package loop;
public class Nested1 {
public static void main(String[] args) {
for (int i = 0; i < 2; i++) {
System.out.println("외부 for 시작 i:" + i + "_" + i);
for (int j = 0; j < 3; j++) {
System.out.println("-> 내부 for " + i + "_" + j);
}
System.out.println("외부 for 종료 i:" + i);
}
}
}
실행 결과
외부 for 시작 i:0_0
-> 내부 for 0_0
-> 내부 for 0_1
-> 내부 for 0_2
외부 for 종료 i:0
외부 for 시작 i:1_1
-> 내부 for 1_0
-> 내부 for 1_1
-> 내부 for 1_2
외부 for 종료 i:1
풀이
외부 for는 2번, 내부for는 3번 실행된다. 그런데 외부 for 1번당 내부 for가 3번 실행되기 때문에 2*3해서 총 6번의 내부 for 코드가 수행된다.
문제: 자연수 출력
처음 10개의 자연수를 출력하는 프로그램을 작성해 보세요. 이때, count 라는 변수를 사용해야 합니다.
while문, for문 2가지 버전의 정답을 만들어야 합니다
while문
package loop.ex;
public class WhileEx1 {
public static void main(String[] args) {
int count = 1;
while (count <= 10) {
System.out.println(count);
count++;
}
}
}
for문
package loop.ex;
public class ForEx1 {
public static void main(String[] args) {
for (int count = 1; count <= 10; count++) {
System.out.println(count);
}
}
}
문제: 짝수 출력
반복문을 사용하여 처음 10개의 짝수를 출력하는 프로그램을 작성해 보세요. 이때, num 이라는 변수를 사용하여 수를
표현해야 합니다.
while문, for문 2가지 버전의 정답을 만들어야 합니다
while문
package loop.ex;
public class WhileEx2 {
public static void main(String[] args) {
int num = 2;
int count = 1;
while (count <= 10) {
int max = num * count;
System.out.println(max);
count++;
}
}
}
package loop.ex;
public class WhileEx2 {
public static void main(String[] args) {
int num = 2;
int count = 1;
while (count <= 10) {
System.out.println(num);
num += 2;
count++;
}
}
}
노트
나는 문제를 보고 고정된 num값의 count를 증감시켜 곱셈을 하여 출력시켰고 문제 풀이는 num값의 2를 더해서 짝수를 구했다.
for문
package loop.ex;
public class ForEx2 {
public static void main(String[] args) {
for (int num = 2, count = 1; count <= 10; num += 2, count++) {
System.out.println(num);
}
}
}
노트
,를 활용해서 여러 조건을 넣을 수 있다.
package loop.ex;
public class ForEx2 {
public static void main(String[] args) {
int num = 2;
for (int count = 1; count <= 10; count++) {
System.out.println(num);
num += 2;
}
}
}
증감식만 for문에 적용해서 정리할 수 있다.
문제: 누적 합 계산
반복문을 사용하여 1부터 max 까지의 합을 계산하고 출력하는 프로그램을 작성해 보세요.
이때, sum 이라는 변수를 사용하여 누적 합을 표현하고, i 라는 변수를 사용하여 카운트(1부터 max까지 증가하는 변수)를 수행해야 합니다.
while문, for문 2가지 버전의 정답을 만들어야 합니다.
while문
package loop.ex;
public class WhileEx3 {
public static void main(String[] args) {
int sum = 0;
int i = 1;
int max =100;
while (i <= max) {
sum += i;
i++;
}
System.out.println(sum);
}
}
for문
package loop.ex;
public class ForEx3 {
public static void main(String[] args) {
int sum = 0;
int max = 100;
for (int i = 1; i <= max; i++) {
sum += i;
}
System.out.println(sum);
}
}
문제: 구구단 출력
중첩 for문을 사용해서 구구단을 완성해라.
풀이
package loop.ex;
public class NastedEx1 {
public static void main(String[] args) {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= 9; j++) {
System.out.println(i + " * " + j + " = " + i * j);
}
}
}
}
노트
앞에오는 숫자가 외부 for문 결과고 곱하기 뒤에 오는 숫자가 내부 for문에서 9번 반복해서 출력된 값이다.
문제: 피라미드 출력
int rows 를 선언해라.
이 수만큼 다음과 같은 피라미드를 출력하면 된다.
//rows = 2
*
**
//rows = 5
*
**
***
****
*****
참고:
println()은 출력후 다음 라인으로 넘어간다. 라인을 넘기지 않고 출력하려면print()를 사용하면 된다.
예)System.out.print("*")
노트
같은줄에 출력하고 싶으면 print()를 활용하자
풀이
package loop.ex;
public class NestedEx2 {
public static void main(String[] args) {
int rows = 5;
for (int i = 1; i <= rows; i++) {
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
노트
같은줄에 원하는 만큼 *을 출력하고 다음 줄로 넘기기 위해서
마지막에 System.out.println();를 삽입해준다.
반복문을 공부하면서 반복문이 실무에서 실제로 유용할 것 같은 느낌을 많이 받았다. 반복문은 참과 거짓을 활용해서 조건식이 거짓이 되기 전까지 계속 반복하는 형식을 활용하는 방식이다. 그리고 변경 사항이 발생했을 때 변경하는 부분을 적게 만드는 형식으로 만들기 위해서 노력해야 겠다 (예로 변수 i,endNum 선언과 같은 방식으로). 헷갈렸던 부분은 break, continue를 활용할 때 조건문인 if문을 삽입해 주어야 한다는 부분이 헷갈렸다. 마지막으로 같은 줄에 출력하고 싶으면 print()를 활용하고 다음 줄로 넘기고 싶을때 println()를 활용하면 된다는 점을 알게되어서 좋았다.