본문 바로가기

Java

[JAVA] while 문에서 애초에 조건을 만족하지 않는다면? (ft. while문 do while문 차이)

- while문 조건을 만족하지 않으면? -

while문은 특정한 조건이 만족하는 동안에만 반복한다.
그렇다면 애초에 조건을 만족하지 않는 상태라면 어떻게 될까?
while문 안에 들어가기는 할까?
아니면 아예 들어가지를 않을까?
그러니까, 일단 한 번 돌고 나서 조건문으로 갈까, 
아니면 들어가기 전에 조건문을 체크하는 게 먼저일까?
막상 이렇게 질문을 받으니 확신이 서지 않지 않는가?
나도 갑자기 궁금해져서 바로 실험을 해 봤다.

 

    int idx = 5;
    while(idx < 5) {
        System.out.println(idx);
        idx++;
    }



예를 들어 위와 같은 while문이 있다고 하자.
이 경우에 5가 출력될까?

정답은 출력되지 않는다.
그러니까 while문은 들어가기 전에 조건문을 먼저 체크한다.
조건문을 충족할 경우에만 반복문 안으로 들어간다.

- for 반복문의 조건식 -

for문은 어떨까?
for문에는 여러 식이 들어간다.
보통 아래와 같은 꼴이다.

for (초기식; 조건식; 증감식) {
    //반복할 코드
}


그러면 처음부터 조건식을 만족하지 않는 상태라면
for문 안으로 아예 들어가질 않을까?
아니면 일단 for문 안으로 진입한 후에 조건문을 확인할까?
for문은 다음 중 어떤 순서로 식들에 접근할까?
1. 초기식 -> 반복문 -> 증감식 -> 조건식
2. 초기식 -> 조건식 -> 반복문 -> 증감식

    boolean flag = false;
    for(int i = 0; i > 0; i--) {
        flag = true;
    }
    System.out.println(flag);


예를 들어서 코드로 보자.
위와 같은 반복문이 있을 때 flag는 어떻게 출력될까?
'true'일까 'false'일까?


답은 false다.
즉, for문이 식에 접근하는 순서는 2번이다.
2. 초기식 -> 조건식 -> 반복문 -> 증감식

    int i = 0;
    boolean flag = false;
    for(flag = true; i >0; i-- ) {
        flag = false;
    }
    System.out.println(flag);


위 반복문에서는 flag가 마지막에 어떻게 출력될까?
flag는 true일까 false일까?


아까 식에 접근하는 순서가 아래와 같다고 했다.
초기식 -> 조건식 -> 반복문 -> 증감식
이 순서를 하나씩 따라가 보자.
for문에 들어가기 전에 flag는 flase로 정의되었다.
for문에 들어가면서 가장 먼저 초기식에 접근한다.
flag = true; 를 실행하여 flag는 true가 된다.
다음은 조건식에 접근한다.
i > 0; 를 만족하지 못하므로 반복문 안에 들어가지 않고 빠져나온다.
flag는 true인 상태로 print문이 실행된다.

- do while문 -

for문에는 초기식이 있다.
위에서 봤듯이, 조건문에 상관없이 일단 먼저 실행하는 초기식이 있다.
while 문에는 그런 기능을 덧붙일 수 없을까?
while (조건문) { 반복할 코드 } 
이 자리에는 초기 식이 들어갈 자리가 없어 보인다.

대신 java에는 do-while 문이 있다.
do-while문은 일단 do문을 먼저 실행한다.
그 뒤에 평소처럼 while문을 실행한다.
while문에 달려 있는 조건문에 상관없이 
do문은 먼저 실행부터 하고 본다.
코드를 예시로 살펴보자.

    boolean flag = false;
    int i = 0;
    do {
        flag = true;
        i++;
    } while (i < 0);
    System.out.println(flag);


위 코드에서 flag는 true일까 false일까?
i를 0으로 정의했고,
while 조건문은 i < 0 이므로 들어가지도 못하고 그대로 나올 것 같다.
실제로 그런지 순서대로 따라가면서 확인해 보자.
do블럭에 들어가기 전에 i가 0으로 정의된다.
다음으로 일단 do 블럭을 실행한다.
flag는 true가 되고,
i는 1이 된다.
while의 조건문에 접근한다.
조건문을 충족하지 못하므로 반복문을 빠져나온다.
결과는 flag가 true다.

반응형