'do while'에 해당되는 글 1건

  1. 2007.07.24 제어문 (3)

3. while문
while 문 역시, 반복문의 일종으로 일정한 행위를 반복시키기 위한 구문 이다. 말로는 행위에 의해서 제어한다라고 하지만, 그렇게 말해봤자, 더 헷갈리고.. 아무튼... 예제를 살펴보자.
1//    import java.io.*;

2//    class Exam06_08 [
3//        public static void main(String[] args) {

4//           while(true) {
5//              System.out.print("Input a Character : ");
6//              char ch = (char)System.in.read();
7//              System.in.read();                        // Enter 키부분중 \r 부분 해제
8//              System.in.read();                        // Enter 키부분중 \n 부분 해제
9//              System.out.println(ch + " = " + (int)ch);

10//              System.out.print("One More?(Y/N)");

11//              char c = (char)System.in.read();
12//              System.in.read();
13//              System.in.read();

14//              if(c == 'N' || c == 'n') break;      // if 문을 제외한 가장 가까운 블록 탈출
15//           }
16//        }
17//    }
while 문은 처음 논리조건문을 확인을 한다. 그 논리 조건문이 true 라면, while 안에 있는 구문을 실행을 시키게 되는데, 만약, 구문이 false 라면, while 구문을 탈출하게 된다.

여기서 등장한 예제는, if 문을 함께 사용하고, 논리 조건문에 true 를 집어넣어, 반 무한루프를 돌리게 만든 프로그램이다.

4번째 라인에서, while 문의 논리조건문으로 true 가 직접적으로 사용되었으나, 이 외에도 다른 논리 조건문이 올수 있다. 논리 조건문이 true 니까, 일단 한번은 반드시 실행이 되어야 한다.

5 번째 라인에서 입력받은 값을, 6번째 라인에서 변수 ch에 char형으로 저장을 하고, 7번째와 8번째 라인에서는 5번째 라인에서 입력받았던 enter 키 값을 없애주는 작업을 해준후, 9번째 라인에서, 변수 ch와 ch를 int 형으로 변환시켜준 값을 출력한다.

10번째 라인에서는, 또다시 실행시킬것인가를 묻는데, 11번째 라인에서 변수 c에 char 형으로 저장된, 10번째 라인에서 입력한 문자는, 14번째 라인에서, N 이나 n 을 입력했는지를 판별해주는데, 만약 입력을 했다면, break; 문에 의해 if 문을 제외한 가장 가까운 블록인 while 문을 탈출하게 된다.

12번째 라인과 13번째 라인은, 7번째 라인과 8번째 라인이 해주었던 역할을 똑같이 해주는 역할을 해주고 있다.

이렇듯, 한번 실행후, 계속 실행을 원할경우, 이렇게 if문과 혼용되어 사용하기도 한다.

while 문에서는 변형된 형태가 하나 있는데, 그것이 바로 do~while 문이다. do~while 문은 번역을 해봐도 알수 있듯이, 일단은, 까고 보는 것이다. 즉, 일단 한번 실행해주고, 그다음, 반복할 것인지 마는 것인지를 결정한다고 할수 있다.

보통 while 문은 조건이 true 이면, 실행이 되면서 false 가 될때까지 반복이 되는데 반해, do~while 문은, 일단 무조건 적으로 한번은 실행시키고, 그다음, 반복실행시킬 것인지를 판단한다.

다음은, 그 예제이다.
1//    import java.io.*;

2//    class Exam06_09 {
3//        public static void main(String[] args) {
4//           BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

5//              int kor = 0, eng = 0, math = 0, sum = 0;
6//              float avg = 0.0f;

7//              do{
8//                  System.out.print("Korean Score : ");
9//                  kor = Integer.parseInt(in.readLine());
10//             } while(kor < 0 || kor > 100);

11//            do {
12//               System.out.print("English Score : ");
13//               eng = Integer.parseInt(in.readLine());
14//             } while(eng < 0 || eng > 100);

15//            do {
16//               System.out.print("Math Score : ");
17//               math = Integer.parseInt(in.readLine());
18//             } while(math < 0 || math > 100);

19//            sum = kor + eng + math;
20//            avg = sum / 3.0f;                  // 혹은 casting 변환

21//            System.out.println();
22//            System.out.println("Total Score : " + sum + "Point");
23//            System.out.println("Average Score : " + avg + "Point");
24//            // System.out.printf("Average Score : " + avg + "Point");
25//        }
26//    }
지금까지 사용된 제어문을 살펴보면, 조건식을 넣으면 그만이었지만, 이번 do~while 문에서는 while 이 끝난후, ; 으로서 마무리를 짓고 있다. 그러한 모습을 보여주는 게 10, 14, 18번째 라인이다. do~while 의 마지막 문장은 ; 으로서 끝나고 있다.

do~while 문은 처음 한번은 무조건 실행을 하게 된다. 그렇게 실행된 문장은, 마지막 while 에서 조건을 한번 검색한후, 만약, 그 조건이 true 이면, 다시 do 부분으로 이동시켜, 계속 실행시키고, 그렇지 않으면, do~while 문을 탈출하는 루틴을 보여주고 있다.

20번째 라인에서는, 형 변환을 보여주고 있다. 변수 avg 는 float 형으로 선언이 되었으며, 변수 sum 은, 다른 int 형 변수, kor, eng, math 의 값의 합을 저장하기위해, int 형으로 선언이 되었었다. 만약, 20번째 라인에서, int 형 sum 과, 3 이라는 정수형으로 계산을 시도하면, 정수 / 정수 가 되어, 몫만 출력되고, 소수점 이하는 생략이 되버린다.

그렇기에, 3 대신에 3.0f 라는 float 형으로 사용해주어서, 실수영역으로 변환을 시켜주었다. 이러한 상황은 다음과 같은 식으로 바꿔써줄수가 있다.
avg = (float) sum / 3;
바로 casting 변환이다. 결과값은, 똑같다.

24번째 라인에서 사용된 방식은, 자바 1.5 에서부터 지원이 되는 내용으로, C언어를 사용하던 프로그래머들을 배려하여, 지원하게 된, 메소드이다. printf 문 형식으로, 사용방법은, c언어와 비슷하다.

다음은 간단한 사칙연산이 가능한 계산기 소스코드이다.
1//    import java.io.*;

2//    class Exam06_11 {
3//        public static void main(String[] args) {
4//           BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

5//              int su1 = 0, su2 = 0, sum = 0;
6//              char yon = 0;

7//              System.out.print("Input the first number : ");
8//              su1 = Integer.parseInt(in.readLine());

9//              do {
10//                  System.out.print("Input the operator(+, -, *, /) :" );
11//                  yon = (char) System.in.read();
12//                  System.in.read();
13//                  System.in.read();
14//              } while(yon != '+' && yon != '-' && yon != '*' && yon != '/');

15//             do {
16//                  System.out.print("Input the second number : ");
17//                  su2 = Integer.parseInt(in.readLine());
18//              } while(yon == '/' && su2 == 0)

19//             switch(yon) {
20//                  case '+' : sum = su1 + su2; break;
21//                  case '-' : sum = su1 - su2; break;
22//                  case '*' : sum = su1 * su2; break;
23//                  case '/' : sum = su1 / su2; break;
24//              }

25//               System.out.println();
26//               System.out.println(su1 + " " + yon + " " + su2 + " = " + sum);
27//        }
28//    }
만약, 위의 do~while 문에서 while 문 뒤에 있는 조건식을 적지 않는다면, 에러가 발생할 것이고, false 를 적어놓는다면, 에러대신, 몇가지 논리적 오류가 발생하게 된다.

연산자 부분에, 사칙 연산자를 제외한 다른 문자를 집어넣어도, 계산은 실행된다. 다만, 제대로 된 계산은 실행되지 않는다.

두 번째는, 나눗셈에서, 0을 집어넣으면 에러가 발생하게 되는데, 이는 su1과 su2 과 정수형인 int 형으로 선언되었고, 정수형 / 정수형 에서 0으로 나누는 행위는 일어날 수가 없기 때문에, 에러가 발생하게 되는 것이다. 그래서, 위의 방식대로 조건식으로 첨가시켜주어, 사칙연산을 제외한 다른 값을 넣으면, 다시 값을 넣으라는 문장이 출력되며, 나눗셈을 입력한 상태에서 0이 입력되면, 역시 다시 값을 넣으라는 문장이 출력되게 된다.

다음 이야기할 부분은 26번째 라인이다.

여 기서는 " " 부분이 고의적으로 삽입되었다. 물론, 빈칸을 주기위한 기본적인 의도가 있으나, 만약 "" 를 사용하지 않게 된다면 char 형으로 선언된 변수 yon 도 아스키 코드 값으로 인식, 계산이 가능해져 변수 su1 과 변수 su2와 값이 더해지게 된다. 그것을 방지하고자 " " 부분이 고의적으로 삽입된 것이다.


p.s 위의 글들은, 김승현 강사님열혈강의 Java Programming 의 Round 6-5, 6, 동영상 강좌에 기초한 내용입니다.
:

BLOG main image
아무거나 공부하자!!! by Young79

공지사항

카테고리

분류 전체보기 (79)
Programing (29)
English (31)
Graphic (4)
Saying on T"We"tter (15)

최근에 올라온 글

최근에 달린 댓글

글 보관함

달력

«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Total :
Today : Yesterday :