BE/JAVA

[JAVA/자바] while문, do~while문

veee2 2022. 4. 28. 13:15

while문

 위에 설명한 것처럼 조건식이 true이면 문장이 실행되고, false이면 종료된다. for문과는 다르게 초기값과 증감식을 적는 곳이 명시되어 있지 않다. 다르게 말하면 while문의 문장을 반복할 때 초기값과 증감식을 정의하는 것이 필수 조건은 아니라는 것이다. 이것에 대해서는 조금 후에 알아보기로 하자. 우선 for문에서 익숙해졌던 초기값과 증감식을 작성하는 방법을 알아보자. while문 밖에서 변수를 선언하고 초기값을 할당한 후 while문 내에서 증감식을 작성하면 된다. 예제를 통해서 알아보자. 

public class WhileEx01 { public static void main(String[] args) { int i=1; // 초기값 설정 while (i<=10) { // 조건식 System.out.println(i+". joker"); // 실행문 i++; // 증감식 } } }

 위의 설명처럼 초기값, 조건식 및 증감식을 정의하였고 결과는 10번 동안 문장이 반복되어 출력된다.

이번에는 for문에서 작성했었던 1~100까지 합계를 구하는 예제와 짝수 및 홀수의 합을 구하는 예제를 while문으로 구현해 보자.

public class WhileEx02 { public static void main(String[] args) { int sum = 0, odd = 0, even = 0; // 합계 계산을 위한 초기값 할당 int i = 1; // 반복문 초기값 할당 while (i <= 100) { // 반복문 조건식 sum += i; // sum = sum + i; 총합 if (i % 2 == 0) { // 짝수 조건식 even += i; // even = even + i; 짝수합 } else { odd += i; // odd = odd + i; 홀수 합 } i++; // 증감식 } System.out.println("1~100 합 = " + sum); // 결과 : 5050 System.out.println("1~100 짝수합 = " + even); // 결과 : 2550 System.out.println("1~100 홀수합 = " + odd); // 결과 : 2500 } }

 합계에 영향을 주지 않도록 변수(sum, odd, even)에 초기값을 0으로 할당하고, 반복문의 초기값을 할당하였다. 총합 계산을 위한 알고리즘을 작성하고 while문 내부에 if문을 정의하여 짝수와 홀수의 조건을 작성한다. 그리고 짝수합과 홀수합의 알고리즘을 작성한 후 반복문의 증감식을 작성하였다. 결과는 아래와 같다.

 이번에는 위에서 설명했던 초기값과 증감식이 while문의 필수 조건이 아니라고 했던 내용을 예제를 통해 알아보자. (Scanner라는 클래스를 이용하여 콘솔 창에 값을 입력받는 내용인데 이것이 왜 이렇게 동작하는지는 아직 모르는 게 좋고 이런 게 있구나 하고 넘어가면 된다. Scanner에 대해서는 나중에 다시 다룰 예정이다. 단, 작성하는 방법에 대해서는 알아두면 앞으로 클래스, 생성자, 메소드, 객체에 대해서 공부할 때 많은 도움이 될 것이다.)

import java.util.Scanner; public class WhileEx03 { public static void main(String[] args) { boolean stop = false; int num; while (!stop) { // true를 의미 System.out.println("2개의 정수 입력"); Scanner sc = new Scanner(System.in); // Scanner 객체 생성 int num1 = sc.nextInt(); // 콘솔창을 통해 값을 입력을 받음 int num2 = sc.nextInt(); // 콘솔창을 통해 값을 입력을 받음 num = num1 % num2; // 나머지 구하는 공식 System.out.println(num1 + " % " + num2 + " = " + num); System.out.println("계속 Y, 종료 N 입력"); String yn = sc.next(); // 콘솔창을 통해 값을 입력을 받음 if (yn.equals("Y") || yn.equals("y")) { // Y 또는 y 입력시 반복 System.out.println("---------------------"); continue; // 보조제어문(반복 계속) } if (yn.equals("N") || yn.equals("n")) { // N 또는 n 입력시 종료 break; // 보조제어문(반복 종료) } } System.out.println("시스템이 종료되었습니다."); } }

 위에서 설명하였듯이 콘솔창으로 값을 입력받을 때 저런 방법을 사용하는구나 하고 넘어가면 된다. 위 예제는 콘솔창에 2개의 값을 입력받아 나머지를 구하는 코드이다. 코드가 실행된 후 계속 진행할 것인지 종료할 것인지를 콘솔창에 입력하고 보조제어문을 이용하여 while문을 반복할지 종료할지를 결정한다. (보조제어문 별도 포스팅 예정) 여기서 주목할 내용은 초기값과 증감식을 작성하지 않아도 while문을 반복하고 종료할 수 있다는 것이다. 결과는 아래와 같다.

 
do ~ while문

 do ~ while문은 for문이나 while문과는 다르게 한가지 다른 점이 있다. 조건식이 true이든 false이든 상관없이 중괄호({ }) 안의 문장을 무조건 한번 실행시킨 후 조건을 검사하여 반복을 결정한다.(조건식이 문장의 다음에 나오기 때문이라고 이해하자.) 다른 내용들은 while문과 동일하게 동작한다. 예제를 통해서 알아보자.

public class DoWhileEx01 { public static void main(String[] args) { int i = 1; // 초기값 설정 do { System.out.println(i + ". joker"); // 실행문 i++; // 증감식 } while (i <= 10); // 조건식 } }

 먼저 초기값을 설정하고 do ~ while을 정의한 후 실행문과, 증감식, 조건식을 써주었다. 결과는 실행할 문장이 10번동안 반복되어 출력된다.

 위에서 조건식에 관계없이 무조건 한번 실행시킨다고 하였는데 그게 어떤 의미인지 예제를 통해서 알아보자.

public class DoWhileEx02 { public static void main(String[] args) { int i = 1; // 초기값 do { System.out.println(i+". do ~ while"); // 실행문 i++; // 증감식 } while (i<1); // 조건식 } }

 위 예제는 초기값이 조건식을 만족시키지 못한다. 즉 false이다. 하지만 무조건 한번 문장을 실행시킨 후 조건을 검사하기 때문에 아래와 같이 결과가 출력 된다.

 for문에서 작성했었던 구구단을 출력하는 예제를 do ~ while문을 이용해서 코딩해 보자.

public class DoWhileEx03 { public static void main(String[] args) { int i=2; // 단수 초기값 설정 // int j = 1; // j의 초기값을 여기에 할당하면 잘못된 값이 출력됨!(j값이 초기화가 안되기 때문) do { int j = 1; // 곱하기 초기값 설정 do { System.out.print(i+"*"+j+"="+i*j+"\t"); j++; // j 증감식 } while (j<=9); // j 조건식 i++; // i 증감식 System.out.println(); } while (i<=9); // i 조건식 } }

 여기에서 주의할 점은 int j의 초기값을 설정하는 위치이다. 처음 시작하는 do~while문 밖에다 j의 값을 설정하면 한번 반복된 후 값이 초기화가 되지 못하기 때문이다. 결과는 아래와 같다.