5장 - 같은 작업 반복하기: 반복문

2025. 2. 19. 03:32·Language/Java Language

프로그램을 작성하다 보면, 같은 명령을 여러 번 수행해야 할 때가 있다. 이럴 때 반복문을 사용하면 편하다. 반복문에는 for문, do - while문이 있다. 반복문을 어떻게 작성하고 사용하는지 알아보자.

 

5.1. 범위 안에서 반복할 때: for 문

5.1.1. 기본 형식 ★

for문은 대표적인 반복문의 형태로, 정해진 횟수나 범위만큼 반복할 때 사용한다. 형식은 다음과 같다.

for(초기값; 조건식; 증감식){
	[실행문]; //반복 실행할 명령문
}

 

for문은 다음과 같이 등장한다.

 

1. 초기값

: 초기값은 반복 범위의 시작 값이다. 변수에 값을 넣어 초기화하는 방식으로 작성한다. 초깃값은 반복문을 처음 실행할 때 한 번 수행한다.

 

2. 조건식

: 반복문을 실행할 조건을 넣는다.조건은 보통 반복할 횟수나 범위를 나타낸다. 

 

3. 실행문

: 조건식에서 변수의 값이 조건을 충족하는지 확인하고 나면 중괄호에 있는 실행문으로 들어간다. 여기가 반복문에서 실제로 반복되는 부분이다.

 

4. 증감식

: 반복할 문장을 실행한 후에는 증감식으로 간다. 증감식에서는 변수 값을 증가시키거나 감소시켜서 반복 횟수나 범위를 조절한다. 그리고 다시 조건식으로 간다.

 

 

예제 코드로 for문으 작동 방식을 이해해보자. 이전에는 10줄을 작성해야 했던 printf() 코드를 1줄만 작성하면 된다.

public class Main {
    public static void main(String[] args){
        for (int i=1; i<=10; i++){
            System.out.printf("%d,", i);
        }
    }
}
참고로 위의 코드에서 print()를 사용하면 오류가 발생한다. print()는 단순히 문자열을 출력하는 역할만 하므로, 형식 지정자를 사용할 수 없게 된다. 따라서 문자열 포멧팅 기능을 지원하는 printf()를 사용해야한다.

내 코드와 조금 다르다. 일단 설명은 사진의 코드로 설명한당

1. 변수명을 i로 하고, 0으로 변수 초기화를 진행한다.

2. 반복할 범위(조건)은 i가 10 미만일때이다. 현재 i의 값은 0이기 때문에 조건을 충족한다.

3. 조건을 충족했으니 중괄호 안에 있는 실행문으로 간다. i+1의 값인 1을 출력한다.

4. println()을 실행한 후에 증감식으로 간다. i++에 의해 i 값이 1증가한 1이 된다. 이후에는 다시 조건식으로 돌아가 i값을 비교한다.

 

반복문 횟수에 따른 실제 값을 정리하면 다음과 같다.

11번째 반복에서 i 변수의 값이 10이므로, 조건식인 i<10에 맞지 않는다. 따라서 11번째에서 반복문을 벗어난다.

반복 횟수 2(i<10)에서 i 변수의 값 3(i+1)의 출력 결과 4(i++)에서 i 변수의 값
1 0 1 1
2 1 2 2
3 2 3 3
4 3 4 4
5 4 5 5
6 5 6 6
7 6 7 7
8 7 8 8
9 8 9 9
10 9 10 10
11 10 x x

 

 

 

 

5.1.2. 증감 연산자 ★★★

증감 연산자는 반복문에서 자주 사용된다. 또한 증감 연산자는 연산자가 어디에 위치하느냐에 따라 작동 방식이 달라진다.

증감 연산자에는 아래와 같은 것들이 있다.

증감 연산자 설명
i++ i 값을 사용한 후에 i+1을 진행
i-- i 값을 사용한 후에 i-1을 진행
++i i+1 을 한 후에 i 값 사용
--i i-1 을 한 후에 i 값 사용

 

public class Main {
    public static void main(String[] args){
        int num1 = 5;
        int num2 = 5;
        int result1 = num1++; 
        int result2 = ++num2;

        System.out.println(result1);
        System.out.println(result2); 
        System.out.println(num1); 
        System.out.println(num2); 
    }
}

/*
5
6
6
6
*/

 

//println(result1)

result1 = num1++이고, num1 변수에는 현재 5라는 값이 저장되어있다.

i++는 후위 증감 연산자이므로, num1 변수의 값을 사용한 후에 num1 변수의 값을 1증가시킨다. 따라서 현재 num1 변수의 값을 result 변수에 저장하고 난 후 num1 변수의 값을 1 증가시키게 된다. 따라서 result1의 값은 5로, num1 값은 6으로 출력된다.

 

//println(result2)

result2 = ++num2이고, num2 변수에는 5라는 값이 저장되어있다.

++i는 전위 증감 연산자이므로, num2 변수의 값을 먼저 1 증가시킨 후에 num2 변수의 값을 result2 변수에 저장한다. 따라서 result2 변수와 num2 변수의 값이 모두 6으로 출력된다.

 

 

계속 헷갈려하는 나를 위한 예제 2.........

public class Main {
    public static void main(String[] args){
        int a1 = 5;
        System.out.println(a1); //5

        int a2 = a1++;
        System.out.println(a1); //5가 아니라 6
        System.out.println(a2); //5
        System.out.println(a1); //6
        System.out.println(a2); //6이 아니라 5
    }
}

 

 

 

5.1.3. for 문으로 연산하기

이번에는 1부터 100까지 합을 구해보겠다. 합산 결과를 저장하는 sum 변수를 사용해 코드를 작성해보자.

(전위, 후위 연산자를 공부한 뒤 바로 와서 for문의 조건 부분의 등호를 <=로 쓰는게 맞는지 헷갈렸다 -> 증가가 어떻게 되든 조건에서 i값을 막아주니 걱정하지 말고 연산자를 사용하자)

public class Main {
    public static void main(String[] args){
        //1부터 100까지 더하는 코드
        int sum = 0;
        for (int i=1; i<=100; i++){
            sum = sum + i;
        }
        System.out.print(sum);
    }
}
이때 int sum = 0;처럼 변수 초기화를 진행해야한다.
변수를 사용한다는 것은 변수에 저장한 값을 사용한다는 의미이다. 변수를 선언할 때 변수 초기화를 하지 않으면 메모리 공간이 할당되면서 알 수 없는 값이 들어간다. 이 상태로 변수를 사용하면 알 수 없는 값으로 연산이 진행되므로 예상하지 못한 결과가 발생할 수 있다. 이를 방지하기 위해 자바에서는 오류를 발생시켜 변수를 사용하기 전에 초기화하도록 강제한다.

 

 

 

5.1.4. 실습: for 문으로 구구단 프로그램 만들기

내 생각)

"[사용자로부터 입력 받은 단] x [1부터 9까지 증가하는 숫자] = [계산 결과]" 구조만 9번 반복될것이므로 for 문을 사용한다.

public class Main {
    public static void main(String[] args){
        System.out.print("출력할 단을 입력하세요:");
        Scanner scan = new Scanner(System.in);
        int dan = scan.nextInt();

        int sum;
        for (int i=1; i<=9; i++){
            sum = dan * i;
            System.out.printf("%d x %d = %d\n", dan, i, sum);
        }
    }
}

여기서의 sum 변수는 연산이 아닌(이전의 코드처럼) 곱한 값을 저장할 때 처음 사용하므로 초기화하지 않아도 된다.

 

 

 

5.1.5. 중첩 반복문 사용하기 ★

이번에는 구구단을 전부 출력하보자. 

구구단 전체를 놓고 비교해보면 아래와 같다. 그림에서는 '단'과 '곱하는 수'가 바뀐다. 즉 반복할 부분이 2부분 있다는 의미이다. 이럴 떄는 중첩 반복문을 사용한다.

이런 의미로 위의 구구단 코드를 생각해보면, 변하는 부분은 '곱하는 수' 1부분이니 반복할 부분이 1부분 있다는 것이 된다.

 

바깥 for문은 dan을, 안쪽 for문은 곱하는 수(i)로 하면 될 것 같다.

public class Main {
    public static void main(String[] args){
        //바깥 for문은 dan을, 안쪽 for문은 곱하는 수(i)로 하면 될 듯
        for (int dan=2 ; dan<=9; dan++){
            System.out.printf("\n===== %d단 =====\n", dan);
            for (int i=1; i<=9; i++){
                int sum;
                sum = dan * i;
                System.out.printf("%d x %d = %d\n", dan, i, sum);
            }
        }
    }
}

 

 

 

5.1.6. QUIZ ★

다음 코드에서 for문 안의 명령문은 몇 번 실행될까?

public class Main {
    public static void main(String[] args) {
        for (int i=0; i<=6; i++){
            for (int j=0; j<=4; j++){
                System.out.print("Hello");
            }
        }
    }
}

 

내 답)

6 x 4 = 24번...?

 

답)

7 x 5 = 35번

-> 0,1,2,3,4,5,6 7번/ 0,1,2,3,4 5번이잖어

-> 0도 포함해야지 멍청아(0 <= i <= 6일 때, i는 0+6+1이잖음)


5.2. 조건이 참일 동안 반복할 때: while 문 

5..1 while 문 ★

while문은 소괄호 안의 조건식을 만족하면(true이면) 중괄호 안에 있는 명령문을 반복 실행한다. 조건식에 맞춰 실행을 반복한다는 점은 for문과 같지만 사용 방식이 조금 다르다. while문의 기본 형식은 아래와 같다.

while ([조건식]){
	[실행문]; //반복 실행할 명령문
}

 

형식은 간단한데, 어떻게 작동하는지 for문가 비교해서 살펴보겠다.

//for문으로 작성한 1~10까지 출력하는 코드
public class Main {
    public static void main(String[] args){
        for (int i=0; i<10; i++){
            System.out.println(i+1);
        }
    }
}
//while문으로 작성한 1~10까지 출력하는 코드
public class Main {
    public static void main(String[] args) {
        int i = 0;
        while(i<10){
            System.out.println(i+1);
            i++;
        }
    }
}

-> for문의 초기값, 조건, 증감식을 작성하는 위치만 바뀌었다고 생각하면 편하다.

-> 초기값은 while문 위로 빠지고, 증감식은 반복 실행할 명령문 아래로 간다. 

-> while (i<10)에서 i값이 10보다 작으면 조건식이 참(true)이므로 while문 내부로 진입한다.

 

 

while문의 작동 방식을 순서도로 나타내면 다음과 같다.

if문과 달리 조건식의 값이 false이면 그냥 while문을 탈출한다.

 

 

 

5.2.2. QUIZ ★★

다음은 for문으로 작성한 구구단 출력 프로그램이다. 이 프로그램을 while문으로 바꿔라

for (int i=2; i<9; i++){
	System.out.println("====" + i + "단====");
    for (int j=1; j<=9; j++){
    	System.out.println(i + "x" + j + "=" (i*j));
    }
}

 

내가 짠 코드) - 정답

정답 코드와 다른 점은 dan의 증가 그리고 i 초기화 부분임. 나는 안쪽의 while문을 돌고 i가 9보다 커져서 바깥 while문으로 나오면 dan을 1 증가시키고 i의 값을 1로 초기화시켯음. 정답 코드는 바깥 while문에 진입하고 난 뒤(구구단 단 출력하는 부분 위에) i=1을 적었다. 즉 전체 while문을 한 바퀴 돌고 dan = 2가 true가 되며 바깥 while문에 재진입한 뒤 바로 i를 1로 초기화 시킨다.

public class Main {
    public static void main(String[] args) {
        int dan = 2;
        int i = 1;

        while(dan <= 9){
            System.out.printf("\n===== %d단 =====\n", dan);
            while (i <= 9){
                System.out.println(dan + "x" + i + "=" + (dan*i));
                i++;
            }
            dan++;
            i = 1;
        }
    }
}

 

이건 정답 코드이다.

public static void main(String[] args) {
        int dan = 2;
        int i = 1;

        while(dan <= 9){
            i = 1;
            System.out.printf("\n===== %d단 =====\n", dan);
            while (i <= 9){
                System.out.println(dan + "x" + i + "=" + (dan*i));
                i++;
            }
            dan++;
        }
    }
<피드백>
(1) i를 1로 초기화 해야 하는 부분을 생각하지 못해서 2단만 출력하고 나머지는 이상하게 출력되었다.
(2) 바깥 while문 -> 안쪽 while문 -> dan++, i=1 -> 바깥 while문에서 dan=2이므로 true값이 되며 통과 -> 안쪽 while문 -> ...

5.3. 무조건 한 번은 실행할 때: do-while 문

5.3.1. do-while 문

while문은 소괄호 안 조건식을 먼저 확인하고, 조건을 만족하면 중괄호 안에 있는 명령문을 반복 실행한다. 반면 do-while문은 명령문 다음에 while 키워드와 조건식이 온다.

-> 그래서 조건과 상관없이 무조건 한 번(do-while문의 첫 번째 실행에서)은 명령문을 실행한다. 이후 조건을 만족하지 않으면, 즉 참이 아니면 반복문을 빠져나간다.

 

기본 형식은 아래와 같다.

do{
    [실행문];
} while(조건식);

 

 

이제 while문과 do-while문의 차이점을 예제로 확인해보자.

먼저 while문이다. while문의 조건식은 i가 1보다 작은 경우 true이며 앞에서 i 변수를 1로 초기화했으므로 조건에 만족하지 않는다. 때문에 while문 안의 명령문은 실행되지 않고 바깥의 명령문만 실행된다.

public class Main {
    public static void main(String[] args) {
        int i=1;
        while(i<1){
            System.out.printf("while문 %d번째 실행\n", i);
            i++;
        }
        System.out.printf("현재 i변수의 값: %d", i);
    }
}

//현재 i변수의 값: 1

 

같은 명령어를 작성하면 다음과 같다.

do-while문 안의 명령어가 먼저 실행되어 결과를 출력하고 이후 조건식을 확인한다. 역시 조건을 만족하지 않으므로 반복하지 않고 종료한다. while문과 달리 do-while문 안의 명령문이 1번 실행되어 i 변수의 값이 증가했으므로 do-while문 바깥의 system.out 함수의 i는 2로 출력된다.

public class Main {
    public static void main(String[] args) {
        int i=1;
        do{
            System.out.printf("while문 %d번째 실행\n", i);
            i++;
        }
        while(i<1);
        System.out.printf("현재 i변수의 값: %d", i);
    }
}

/*
while문 1번째 실행
현재 i변수의 값: 2
*/
이처럼 do-while문은 조건을 만족하지 않더라고 중괄호 안 명령문을 무조건 한 번은 실행한다. 그래서 do-while 반복문은 어떤 명령을 한 번 수행한 후 반복 여부를 결정할 때 주로 사용된다.

 

do-while문의 순서도는 아래와 같다.

 

 

 

5.3.2. QUIZ

이 경우에는 숫자를 입력받는 부분이 do의 중괄호 안에 존재한다. 즉 0을 입력했을때가 이미 do 안에 있는 상태이기 때문에(직전에 num!=0을 만족하는 숫자를 입력했을 거임) '입력한 숫자는 0입니다'가 출력된다.

위에서 살펴봤던 do-while문이랑 햇갈리면 안된다(내가 그랬다)

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int num;

        do{
            System.out.print("숫자를 입력하세요(0을 입력하면 종료됩니다. ->");
            num = scan.nextInt();
            System.out.printf("입력한 숫자는 %d입니다.\n", num);
        } while(num != 0); //조건식은....?
        System.out.println("프로그램을 종료합니다.");
    }
}


5.4. 무한 반복문

반복문이 끝나지 않고 무한히 반복되는 경우가 있는데, 이를 무한 반복문(infinite loop) 또는 무한 루프라고 한다. 조건을 잘못 설정해서 발생하는 오류일 수도 있지만, 프로그램에서 의도적으로 무한 반복문을 작성하기도 한다. 예를 들어, 사용자 입력으로 프로그램을 진행하는 경우에 사용자 입력이 들어올 때까지 대기하는 경우가 그렇다.

 

 

5.4.1. for문을 이용한 무한 반복문: for(;;)

for문을 사용해 무한 반복문을 만들어보자. for문으로 무한 반복문을 만들 때는 소괄호 안에 초깃값, 조건식, 증감식을 모두 빼고 세미콜론만 남기면 된다.

예제에서는 사용자가 숫자를 입력하기 전까지 반복문이 끝나지 않고있다. 사용자가 숫자를 입력하기 전까지 계속해서 '숫자를 입력하세요->' 부분에 멈춰있을것이다.

public class Main {
    public static void main(String[] args) {
        int sum=0;
        
        for (;;){
            System.out.println("숫자를 무한 반복해서 더하는 중입니다.");
            System.out.print("숫자를 입력하세요 ->");
            Scanner num = new Scanner(System.in);
            int num1 = num.nextInt();
            sum = sum + num1;
            System.out.println("결과" + sum);
        }
    }
}

반복 범위나 횟수를 지정하는 조건이 없어서 명령문을 무한 반복해서 실행한다.

 

 

 

5.4.2. while문을 이용한 무한 반복문: while(true)

while문은 조건이 참(true)일 동안 명령문을 실행한다. while 문의 조건식에 true라는 boolean 값을 넣으면 항상 조건이 참이 되고, 이에 의해 반복문을 빠져나오지 못하고 무한 반복하게 된다.

public class Main {
    public static void main(String[] args) {
        int sum=0;

        while(true){
            System.out.println("숫자를 무한 반복해서 더하는 중입니다.");
            System.out.print("숫자를 입력하세요 ->");
            Scanner num = new Scanner(System.in);
            int num1 = num.nextInt();
            sum = sum + num1;
            System.out.println("결과" + sum);
        }
    }
}

 

 

 

5.4.3. 유의해야 할 점

무한 반복문을 잘못 만들면 프로그램이 종료되지 않고 영원히 실행될 수 있다. 그러면 CPU나 메모리 등이 계속 낭비되 컴퓨터에 문제가 생길 수 있다. 이외에도 여러 문제가 발생할 수 있으니, 무한 반복문을 사용할 때는 문제 발생 가능성을 염두에 두고 종료 조건을 명확히 넣어야 한다.


5.5. 프로그램 흐름 제어하기

무한 반복문에서 빠져나오려면 어떻게 해야 할까? Intelli J의 중지 버튼을 누르는 방법밖에 없을까?사실 중지 버튼을 누르는 방법은 프로그램 자체를 종료하는 방법이다. 

프로그램은 계속 실행하면서 while 문에서만 빠져나오고 싶을 수도 있을텐데, 이럴 경우에는 break문을 사용한다. break문은 프로그램의 흐름을 변경한다.

 

 

5.5.1. break로 반복문 탈출하기

반복문에서 break문을 만나면 조건과 상관 없이 반복문을 탈출한다.

while(true){
	[실행문];
	break;
}

 

위에서 작성한 숫자를 입력하여 더하는 while(true)문을 개조해서, 더한 값이 10,000을 넘으면 프로그램을 종료하는 코드로 바꿔보자.

public class Main {
    public static void main(String[] args) {
        int sum=0;

        while(true){
            System.out.println("숫자를 무한 반복해서 더하는 중입니다.");
            System.out.print("숫자를 입력하세요 ->");
            Scanner num = new Scanner(System.in);
            int num1 = num.nextInt();
            sum = sum + num1;
            System.out.println("결과" + sum);

            if (sum > 10000){
                break;
            }
        }
    }
}

 

if 같은 조건문 없이 while(true) 반복문 안에 그냥 break가 있으면, break 전까지 즉 첫 번째 연산 결과만 출력하고 바로 끝나버린다. 그래서 if 문으로 무한 반복문을 종료하는 조건을 줘서 break 문을 실행하였다.

 

그리고 만약 while문 밖에 '탈출했습니다'를 출력하는 코드가 있으면 이건 출력된다. 왜냐하면 berak문은 while문을 탈출하는거지 프로그램을 종료하는건 아니기 때문이다.

 

 

 

5.5.2. continue로 반복 구간 건너뛰기 ★

반복문을 탈출하지 않고, 특정 구간만 건너뛸 수도 있다. 이때는 continue 문을 사용한다. while문을 반복하다가 continue문을 만나면 현재 반복을 중단하고(만약 첫 번째 반복이라면 이 반복을 중단하고) 다음 반복으로 넘어간다(두 번째 반복으로 넘어간다). 이때 continue 문 뒤에 도는 코드는 수행하지 않는다.

 

continue 문이 어떻게 작동하는지 예제와 함께 살펴보자. 위와 동일한 코드를 사용하여 입력값이 짝수일 때만 값을 더하는 코드로 개조할것이다.

public class Main {
    public static void main(String[] args) {
        int sum=0;

        while(true){
            System.out.println("숫자를 무한 반복해서 더하는 중입니다.");
            System.out.print("숫자를 입력하세요 ->");
            Scanner num = new Scanner(System.in);
            int num1 = num.nextInt();
            //num1이 홀수인지 판단하려면 여기에 continue문을 작성해야 한다.
            if (num1 % 2 == 1){
                System.out.println("홀수입니다. 짝수를 입력해주세요");
                continue;
            }

            sum = sum + num1;
            System.out.println("결과" + sum);

            if (sum > 10000){
                break;
            }
        }
    }
}

-> 추가한 if 문의 조건식에서 i가 홀수일때는(true) if 문 안의 continue가 실행되 이후 코드를 실행하지 않고 while 문의 조건식으로 다시 돌아간다.

 

 

 

5.5.3. 실습: 구구단 프로그램 개선하기

5.1.4 실습에서 작성한 구구단은 단 하나를 입력받아 출력한 뒤에 프로그램을 종료했었다. 이번에는 종료 조건을 만나기 전까지 반복 실행하도록 코드를 수정해볼것이다.

 

while문으로 무한 반복문을 작성하고 for문으로 작성한 구구단 코드를 while문 안에 넣는다. for문 위에 if문으로 반복문의 종료 조건을 설정한다. 여기서는 0을 입력받으면 반복문을 탈출하게 할것이다. if 문으로 입력받은 값이 0인지 판단하고 0이면 프로그램을 종료한다는 문구를 출력한 후 break문으로 반복문을 탈출한다. 

public class Main {
    public static void main(String[] args) {
        System.out.println("**** 구구단 프로그램을 시작합니다 ****");
        System.out.println("(종료하려면 '0'을 입력하세요)");

        while (true){
            System.out.print("출력할 단을 입력하세요:");
            Scanner scan = new Scanner(System.in);
            int dan = scan.nextInt();
            int sum;

            if (dan == 0){
                break;
            }

            for (int i=1; i<=9; i++){
                sum = dan * i;
                System.out.printf("%d x %d = %d\n", dan, i, sum);
            }
        }
        System.out.println("**** 구구단 프로그램을 종료합니다 ****");
    }
}

 

코드를 실행하면 프로그램 시작 문구를 출력하고 입력을 기다린다.

출력할 단을 입력받은 후에 이 값이 0인지 판단해야 하므로, 사용자로부터 dan을 입력받은 후 if문으로 0인지 판단하고, 그 아래에 

 

 

 

5.5.4. QUIZ

다음 코드를 실행하면 어떤 결과가 나올지 고르세요

for (int i=0; i<20; i++){
	if (i%2 == 0){
    	System.out.println("짝수");
    }
    else{
    	System.out.println("홀수");
    }
    berak;
}

 

내가 생각한 답) - 아님

'짝수'와 '홀수'가 번갈아 10번씩 출력되고 프로그램이 종료된다.

 

답)

'짝수'가 한 번 출력되고 프로그램이 종료된다

-> break문을 못 봄........................................................................................코드를 끝까지 읽짜........................


마무리

1. 반복문

반복문은 같은 명령을 반복해서 실행할 때 사용한다.

 

 

2. for 문

(1) 대표적인 반복문으로, 정해진 횟수나 범위만큼 반복할 때 사용한다.

for (초기값, 조건식, 증감식){
	실행문;
}

(2) 초기값은 반복 범위의 시작값이다. 변수에 값을 넣어 초기화하는 방식으로 작성하고, 반복문을 처음 실행할 때 한 번 수행한다. 

(3) 조건식에는 반복 범위 또는 횟수를 넣는다.

(3) 증감식에서는 변수 값을 증가시키거나 감소시켜서 반복 횟수를 조절한다.

 

 

3. 증감 연산자 ?????

(1) ++, --가 있으며 증감 연산자가 어디에 위치하느냐에 따라 전위 증감 연산자와 후위 증감 연산자로 나뉜다.

증감 연산자 설명
i++ i값을 먼저 사용한 후 i+1을 수행
i-- i값을 먼저 사용한 후 i-1을 수행
++i i+1을 한 후에 i값을 사용
--i i-1을 한 후에 i값을 사용

 

 

4. 중첩 반복문

중첩 반복문이란 반복문 안에 다른 반복문이 있는 형태를 말한다.

 

 

5. while 문

while문은 조건식이 참인 동안 while 문 안의 명령문을 반복해서 실행한다.

while (조건식){
	실행문;
}

 

 

6. do-while 문

do-while 문은 조건식과 상관없이 무조건 한 번은 명령문을 실행한 후, 조건이 참일 동안 반복한다. 조건이 참이 아니라면 반복문을 빠져나간다.

do{
	실행문;
} while(조건식);

 

 

7. 무한 반복문

(1) 반복문이 끝나지 않고 무한히 반복되면 이를 무한 반복문 또는 무한 루프라고 한다.

(2) 프로그램에서 의도적으로 무한 반복문을 작성하기도 한다.

(3) for (;;) / while(true)로 무한 반복문을 구현할 수 있다.

 

 

8. 프로그램 흐름 제어

(1) 반복문에서 break 문을 만나면 반복문을 탈출한다. 프로그램을 종료하는 것이 아니라 반복문을 중단하고 다음 코드로 넘어간다. 무한 반복에서 빠져나올 때 주로 break 문을 사용한다.

(2) 반복문에서 continue 문을 만나면, 현재 반복을 중단하고 다음 반복으로 넘어간다. 반복문을 중단하는 것이 아니라 현재 반복을 건너뛰는 역할이다.


셀프 체크 ★★★

조건)

1. while 문을 사용한 무한 반복문으로 작성한다.

2. 초기 실행화면은 다음과 같다.

3. 음료 번호를 입력하면 음료 가격과 현재 투입된 금액을 비교한다. 현재 투입된 금액이 더 크면 금액에서 음료 가격을 뺀 후 음료 선택 화면으로 돌아간다. 현재 투입된 금액이 더 적으면 금액이 부족하니 돈을 더 투입하라고 안내한다.

4. 금액을 입력받아 현재 투입된 금액과 합친다.

5. 4를 입력하면 프로그램을 종료한다. 프로그램을 종료할 때는 마지막에 return; 명령어를 추가해라

6. 그 외 번호를 입력하면 다시 선택하도록 안내한다.

 

구상)

1. while문으로 전체 코드 감싸기 + while문 밖에 return; 작성

2. '돈을 넣어주세요:' -> 돈 입력받기

3. 초기 실행화면 작성

4. '음료를 고르세요: ' -> 번호 입력받기

5. if 문으로 1-4 입력 경우 나누고, 안에 또 if를 사용해 현재 금액과 음료 가격 비교하기 -> true면 '00을 구매하셨습니다', false면 '돈 더 넣어' + continue를 사용해 돈 입력받는 부분으로 돌아가기

7. 참고로 if 4에서는 break하기

8. else에서는 그 외의 번호를 입력하면 다시 선택하도록 안내하기 

 

문제)

1. 돈이 부족하면 돈을 더 투입하지만, Money값이 초기화되어 추가로 투입된 돈만이 Money가 됨(기존의 Money를 유지해야함)

2. 음료를 산 뒤에 '돈을 투입하세요' 부분으로 감...(근데 이건 그냥 건들지 않는게 나을듯? 조건에도 이거에 대한 이야기는 없었음)

3. -금액이 되어도 조건문에 걸리지 않고 음료 구매가 가능하다...?

 

내 코드)

오류가 많다

public class Main {
    public static void main(String[] args) {
        //saveMoney 변수 초기화
        int saveMoney = 0;
        while(true){
            //Money 변수 값 입력받기
            System.out.print("돈을 넣어주세요: ");
            Scanner scanMoney = new Scanner(System.in);
            int Money = scanMoney.nextInt();
            saveMoney = saveMoney + Money;

            System.out.println("**** 자판기 프로그램을 시작합니다. ****\n");
            System.out.printf("현재 투입된 금액:%d원\n", saveMoney);
            System.out.println("1. 콜라 (1,500원)");
            System.out.println("2. 오렌지주스 (2,000원)");
            System.out.println("3. 생수 (1,000원)");
            System.out.println("4. 종료");
            System.out.print("음료를 고르세요. (번호 입력):");

            Scanner scanNum = new Scanner(System.in);
            int Num = scanNum.nextInt();

            if (Num ==1){
                if (saveMoney >= 1500){
                    System.out.println("콜라를 구매하셨습니다.");
                    saveMoney = saveMoney-1500;
                }
                else{

                    System.out.println("금액이 부족하니 돈을 더 투입해주세요.");
                    continue;
                }
            }
            else if (Num ==2){
                if (saveMoney >= 1500){
                    System.out.println("오랜지주스를 구매하셨습니다.");
                    saveMoney = saveMoney-2000;
                }
                else{
                    System.out.println("금액이 부족하니 돈을 더 투입해주세요.");
                    continue;
                }
            }
            else if (Num ==3){
                if (saveMoney >= 1500){
                    System.out.println("생수를 구매하셨습니다.");
                    saveMoney = saveMoney-1000;
                }
                else{
                    System.out.println("금액이 부족하니 돈을 더 투입해주세요.");
                    continue;
                }
            }
            else if (Num ==4){
                System.out.println("**** 자판기 프로그램을 종료합니다. ****");
                break;
            }
            else {
                System.out.println("번호가 올바르지 않습니다. 다시 선택해주세요.");
                continue;
            }

        }
    }
}

 

 

정답 코드) ★

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int money = 0;
        System.out.println("**** 자판기 프로그램을 시작합니다 ****");

        while(true){
            System.out.println("\n현재 투입 금액" + money + "원");
            System.out.println("1. 콜라 (1,500원)\n2. 오렌지주스 (2,000원)");
            System.out.println("3. 생수 (1,000원)\n4. 종료");
            System.out.println("음료를 고르세요. (번호 입력): ");
            //음료 번호 입력받기
            int choice = scan.nextInt();

            switch (choice){
                case 1:
                if (money >= 1500){
                    money = money - 1500;
                    System.out.println("콜라를 선택했습니다. 남은 금액: " + money + "원\n");
                }
                else {
                    System.out.println("금액이 부족합니다. 돈을 더 투입하세요.");
                }
                break;

                case 2:
                    if (money >= 2000){
                        money = money - 2000;
                        System.out.println("오랜지주스를 선택했습니다. 남은 금액: " + money + "원\n");
                    }
                    else {
                        System.out.println("금액이 부족합니다. 돈을 더 투입하세요.");
                    }
                    break;

                case 3:
                    if (money >= 1000){
                        money = money - 1000;
                        System.out.println("생수를 선택했습니다. 남은 금액: " + money + "원\n");
                    }
                    else {
                        System.out.println("금액이 부족합니다. 돈을 더 투입하세요.");
                    }
                    break;

                case 4:
                    System.out.println("프로그램을 종료합니다.");
                    scan.close();
                    return;

                default:
                    System.out.println("잘못된 번호입니다. 다시 선택해주세요");
            }

            System.out.print("돈을 투입하세요.(0을 입력하면 메뉴로 돌아갑니다): ");
            int money2 = scan.nextInt();
            if (money2 > 0){
                money += money2;
            }
            else{
                System.out.println("메뉴로 돌아갑니다.\n");
            }
        }
    }
}

-> case문과 if문을 함께 쓰는 방법은 이렇구나

-> case문의 default를 까먹고 있었다.

-> 남은 금액을 money2로 해서 switch문 밖-while문 안의 마지막 부분에 작성한다!!

'Language > Java Language' 카테고리의 다른 글

6장 - 여러 값 한 번에 저장하기: 배열  (1) 2025.03.05
4장 - 조건에 따라 흐름 바꾸기: 조건문  (0) 2025.02.16
3장 - 기초 문법 배우기  (0) 2025.02.13
2장 - 입출력 다루기  (1) 2025.02.11
1장 - Hello, Java!  (1) 2025.02.11
'Language/Java Language' 카테고리의 다른 글
  • 6장 - 여러 값 한 번에 저장하기: 배열
  • 4장 - 조건에 따라 흐름 바꾸기: 조건문
  • 3장 - 기초 문법 배우기
  • 2장 - 입출력 다루기
sonotri._.
sonotri._.
@-@
  • sonotri._.
    SONOTRI
    sonotri._.
  • 전체
    오늘
    어제
    • 분류 전체보기 (102)
      • CTF (4)
      • Wargame (11)
      • Infomation_Sec (2)
      • Cyber_Sec (11)
        • Linux Kernel (2)
        • webhacking.kr (3)
        • bandit (4)
        • GoN Club Study (2)
      • Language (8)
        • C Language (2)
        • Java Language (6)
      • Dreamhack (43)
        • System Hacking (8)
        • Reverse Engineering (11)
        • Web Hacking (2)
        • Embedded Hacking (16)
        • Digital Forensics (0)
      • Basic_Theory (11)
      • elif (3)
  • 링크

    • Github
  • 인기 글

  • 최근 글

  • 공지사항

  • 태그

    초기화
    vmware 네트워크
  • 최근 댓글

  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • hELLO· Designed By정상우.v4.10.3
sonotri._.
5장 - 같은 작업 반복하기: 반복문
상단으로

티스토리툴바