반복문

이상민·2024년 7월 11일

반복문 시작

반복문은 이름 그대로 특정 코드를 반복해서 실행할 때 사용한다.
자바는 다음 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 (조건식) {
	// 코드
}
  • 조건식을 확인한다. 참이면 코드 블럭을 실행하고, 거짓이면 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 조건을 통해 iendNum이 될 때 까지 코드 블럭을 실행한다.
  • iendNum보다 크면 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문

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

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를 출력하지 않고 바로 조건식으로 넘어간다.

노트
breakcontinue는 사용할 때 if문을 같이 쓴다.

for문

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()를 활용하면 된다는 점을 알게되어서 좋았다.


출처 https://www.youtube.com/watch?v=JEzBDk0E9Rw

profile
안녕하세요

0개의 댓글