자바의 정석

SUADI·2022년 6월 5일

2.2 while 문

while(true) 문은 for(;;)과 같은 의미라고 볼 수 있다. 반복 횟수가 정해져 있지 않은 경우 while 문을 쓰는 것이 좋다.

  • 수를 입력받아 while 문으로 수의 각자리 숫자의 합을 구하는 프로그램을 짜보자.
import java.util.Scanner;

public class Sample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.printf("숫자 입력 : ");
        String tmp = scanner.nextLine();
        int number = Integer.parseInt(tmp);
        int sum = 0;
        while (number != 0) {
            sum += number%10;
            number /= 10;
        }
        System.out.println(sum);
    }
}
  • 수를 입력 받은 다음 while문의 조건으로 입력받은 수가 0이 아닐 때까지 반복하도록 하고, sum 변수에 입력받은 수를 10으로 나눈 나머지를 계속 더하도록 한다. 그리고 입력받은 수를 10으로 나누다보면 0이 되어 각자리수를 다 더한 상태에서 while문을 빠져나오게 된다.

2.3 do-while문

do-while문도 자바의 정석을 통해 새로 알게된 지식이다. while문과 거의 유사하지만 do-while문은 조건문과 상관없이 적어도 1번은 do문을 통해 실행을 한다.

  • 예를 들어 술자리에서 자주 하는 업앤다운 게임을 만들어 보겠다.
import java.util.Scanner;

public class Sample {
    public static void main(String[] args) {
        int answer = (int) ((Math.random() * 100) + 1);
        int input;
        do {
            Scanner scanner = new Scanner(System.in);
            System.out.printf("1~100 사이 숫자를 맞춰봐 >> ");
            input = scanner.nextInt();
            if (answer > input) {
                System.out.println("큰 수를 입력하세요");
            } else if (answer < input) {
                System.out.println("작은 수를 입력하세요");
            } else {
                System.out.println("정답!");
                break;
            }
        } while (input != answer);
    }
}
  • while문의 조건으로 input과 answer이 다를 동안만 반복하도록 해놓았다. 하지만 적어도 한번 이상은 반복문을 실행하도록 do문에 코드를 적어놓았다. Math.random메소드를 활용하여 0~1사이의 소수를 무작위로 하나 받는다. 그다음 100을 곱하고 1을 더하면 1~100사이의 수가 된다. do 문 안에는 Scanner 클래스의 객체를 생성해서 인풋값을 받고, 두 수를 비교하여 정답을 맞춰나가도록 코드를 짰다.
  • 이 프로그램을 짜면서 발견한 사실은 do 문 안에 변수를 선언했더니 while문의 조건문을 작성할 때 그 변수를 인식하지 못했다. 왜인지는 잘 모르겠지만 바깥에다가 변수를 선언해야 하는 것 같다.
    do {
    	int n; //  컴파일 에러!
    } while (n ....)
    int n; 
    do {
    	
    } while (n ....)
  • 다음으로는 술자리에서 역시 많이 하는 게임인 369게임을 프로그램으로 만들어 보겠다.
 public class Sample {
    public static void main(String[] args) {
        for (int i = 1; i <= 100; i++) {
            System.out.printf("i = %d ",i);
            int tmp = i;
            do {
                if (tmp % 10 % 3 == 0 && tmp % 10 != 0) {
                    System.out.printf("짝");
                }
            } while ((tmp /= 10) !=0);
            System.out.println();
        }
    }
}
  • for문으로 1~100까지만 369게임을 진행하도록 하였다. i를 활용해서 조건문을 작성해야 하는데 i변수를 바꿔버리면 순서에 문제가 생기기 때문에 일시적으로 i와 같은 변수 tmp를 하나 더 생성한다. if 문을 활용해서 tmp를 10으로 나눈 나머지 즉, 1의 자리 숫자가 3의 배수인 것만 골라낸다. 여기서 예외가 발생하는데 tmp의 10으로 나눈 나머지의 3으로 나눈 나머지가 0이 되는 수는 3,6,9 뿐만 아니라 10,20..도 포함되므로 tmp%10이 0이 안되도록 코드를 작성한다. if문 내에는 박수를 출력한다. while 문에 (tmp / 10) != 0의 의미는 10의 자리 숫자가 3,6,9일때 박수를 한번 더쳐야하기때문에 do문을 반복하기 위해서 조건문을 저렇게 설정한 것이다. 예를 들어 31이 do문에 들어갔을 때 if문에서는 1의 자리 숫자가 1이기 때문에 박수를 치지 않을 것이다.
    그다음 while문의 조건문으로 가는데 조건문에서 tmp는 3이 저장되고 0이 아니기 때문에 do문을 다시 진행한다. 그러면 if문에서 박수를 치게 되므로 31은 박수를 총 1번 치게 된다.

2.4~6 break, continue 문

break문은 자신이 포함된 가장 가까운! 반복문을 탈출하게 해주는 문구이다. 반면 continue 문은 반복문의 가장 끝으로 보내져서 다음 반복을 실행하게 해준다.

  • 구구단을 통해 break문과 continue문의 차이를 알아보려고 한다. 여기서 한가지 또 새로운 사실은 반복문에도 변수처럼 이름을 붙일 수가 있는데 break문과 continue문에 반복문의 이름을 지정해 주게 되면 총 4가지 경우의 수가 생긴다. 4가지 경우의 수를 다 알아보려고 한다.
public class Sample {
    public static void main(String[] args) {
        Loop1 :
        for (int i=2; i<10; i++) {
            for (int j=1; j<10; j++) {
                if (j == 5) break; // 4가지 경우의 수
                System.out.printf("%d * %d = %d\n",i,j,i*j);
            }
        }
    }
}
  • break; - break문은 가장 가까운 반복문을 탈출하게 되므로 변수가 j인 안쪽 for문을 탈출한다. 그럼 2단을 1~4까지 진행하고 3단으로 넘어가 1~4까지 진행하는 식으로 모든 단을 4까지만 한다.

  • break Loop1; - Loop1자체를 탈출하는 구문이므로 2단을 4까지만 하고 전체 반복문을 탈출한다.

  • continue; - 가장 가까운 반복문의 끝으로 가게 되므로 안쪽for문의 변수 j가 5만 건너뛰고 6부터 정상적으로 실행된다. 즉, 모든 단을 5만 빼고 다 실행한다.

  • continue Loop1; - break;과 마찬가지로 모든 단을 4까지만 실행한다.

  • 어떤 경우인지에 따라 적절히 사용하면 좋을 것이다.

0개의 댓글