The Pawn language - CompuPhase

반복문(while)

개요

while 반복문은 for 반복문과는 다르게 아주 단순한 구조입니다. 따라서 익히기도 쉽습니다.

다만 대부분 반복문이 '차등 증가' 상황에서 자주 쓰이기 때문에 for문이 많이 쓰이고, 상대적으로 while이 사용되는 경우는 적습니다. 대부분의 모드에서 while 반복문은 5% 미만으로 사용된다고 보시면 될 정도로 거의 사용되지 않습니다. 하지만 가끔 사용되는 상황이 발생하므로 일단은 익혀두시는 것이 좋습니다.

while 반복문

생김새는 아래와 같이 생겼습니다.

while(조건)
{
    // 코드
}

동작 원리도 단순합니다. 만약 '조건'이 참일 경우 '코드'가 실행됩니다. '조건'이 거짓이면 while 반복문이 멈춥니다.

동작 순서는 조건 -> 코드 -> 조건 -> 코드 -> ... 식으로 단순하게 반복됩니다.

예제 1 (순차 증가)

for문에서 할 수 있는 일이라면 while문에서도 할 수 있습니다. 그 반대도 마찬가지입니다.

여기서는 1부터 10까지를 출력하는 간단한 반복문을 while을 이용하여 작성해 보도록 하겠습니다.

new count = 1;
while(count <= 10)
{
    printf("%d",count);
    count++;
}

변수 count의 시작 값을 1로 주었습니다. 그리고 count가 10 이하일 경우 코드가 실행되도록 while문을 구성했습니다. 출력은 1,2,3,4,5,6,7,8,9,10 이 될 것입니다.

while 반복문은 for문보다 훨씬 단순한 구조로 동작하지만, 코드의 양이 조금 많아진 것을 알 수 있습니다. for문에서 담당하던 초기식, 조건식, 증감식을 전부 따로따로 구현해야 하기 때문입니다. 따라서 이처럼 순차 증가 알고리즘은 while문보다는 for문을 이용하는 것이 좋습니다.

예제 2 (랜덤 숫자 생성)

이번에는 조금 어려운 예제를 들어 보겠습니다. 랜덤한 3의 배수를 생성하는 코드를 작성하려고 합니다. 숫자 범위는 3~99로 하겠습니다.

랜덤 숫자를 만들기 위해 random() 함수를 사용할 것입니다. 이 함수는 random(max) 로 사용할 수 있으며, 0~(max-1) 까지의 랜덤 숫자를 하나 반환합니다. 예를 들어 new a = random(10); 의 경우 0~9까지의 숫자 중 하나를 골라 변수 a에 저장합니다. 최대값이 (max-1) 이라는 점에 유의하시기 바랍니다. (위키: http://wiki.sa-mp.com/wiki/Random)

우선 random(100)을 사용하면 0~99까지의 숫자 중 하나를 얻을 수 있습니다. 그런데 3의 배수가 아닌 다른 숫자도 얻을 수 있겠죠. 따라서 일단 숫자를 랜덤하게 뽑고, 3의 배수인지를 검사한 다음, 아니라면 다시 뽑는 식으로 코드를 짜야 합니다.

조건문을 이용한다면 아래와 같습니다.

new num = random(100);
if(num % 3 != 0)
{
    // 다시 뽑기
}

3의 배수는 'num % 3 == 0' 의 조건으로 얻을 수 있습니다. 3으로 나눈 나머지가 0이면 3의 배수를 의미합니다. 여기서는 3의 배수가 '아닐 때'를 원하므로 !=를 사용하였습니다.

위에서 if문을 while문으로 바꾼다면 다음과 같이 됩니다.

new num = random(100); // 0~99 랜덤 숫자 뽑기
while(num % 3 != 0) // 3의 배수가 아닐 경우
{
    num = random(100); // 다시 뽑기
}
printf("%d",num);

동작 순서는 우선 while문에 걸린 조건을 확인하고, 조건이 true라면 while문 안의 코드를 실행합니다. 그 뒤 다시 while문의 조건을 보고... 계속 반복됩니다.

do-while 반복문

while문에서는 조건 -> 코드 실행 순서로 진행되었습니다. 즉 조건을 먼저 보고, 참일 경우 코드를 실행하는 식입니다. 그런데 그 반대의 순서로 진행하고 싶을 때가 있습니다. 코드를 일단 실행하고, 조건을 나중에 보고자 할 때, 즉 코드 -> 조건 실행 순서를 원할 때 do-while 문을 사용합니다.

do {
    // 코드
} while(조건식);

코드가 먼저 실행되고, 조건식을 나중에 봅니다. 그리고 조건식이 참이면 코드를 다시 실행합니다. while문과 무슨 차이가 있을까요? 예제를 통해 알아봅니다.

예제 3 (do-while문)

예제 1을 다시 생각해보면, 랜덤 숫자 생성 -> 3의 배수인지 확인 하는 순서로 진행이 됩니다. 다르게 얘기하면 코드 -> 조건 순서라는 것이지요. 그런데 while문을 사용하면 조건 -> 코드 순서이기 때문에, while문 위에 코드를 한 줄 추가적으로 적어줘야 합니다. 이해가 잘 안되시나요? 예제 1의 코드를 다시 보겠습니다.

new num = random(100); // 코드
while(num % 3 != 0) // 조건
    num = random(100); // 코드

코드->조건 순서를 위해서 while문 위에 코드를 한 줄 적어줄 수밖에 없었습니다. 이 코드는 while문 안에 있는 코드와 동일한 코드이므로 한 줄 낭비했다고 볼 수 있겠습니다. (중복 기입)

만약 이 코드를 do-while문으로 바꿔 작성한다면 다음과 같이 쓸 수 있습니다.

new num;
do {
    num = random(100); // 코드
} while(num % 3 != 0); // 조건

코드 -> 조건 순서를 만족하면서 while 반복문을 사용할 수 있게 되었습니다.

댓글

댓글 본문
  1. 네 random(100)은 0~99 범위입니다.
    대화보기
    • 리스트에 없는 함수는 위키 왼쪽 검색창에 random을 검색하시기 바랍니다.
      http://wiki.sa-mp.com......dom
      대화보기
      • 준영
        2번 읽었습니다.

        모두다 이해했다고 생각하지만 첫번째 부분에서 random() 함수 호출에 대해서는 아직 궁금증이 해결 되지 않았습니다.

        그 외에는 다 이해했습니다
      • 준영
        do-while 문

        해석

        do-while문은 while의 반대임을 뜻합니다
        즉 while문의 경우 조건 > 코드였다면
        do while문은 코드 > 조건입니다

        new num;
        do {
        num = random(100); // 코드
        } while(num % 3 != 0); // 조건

        위 반복문(do-while)을 보자면

        처음 new num; 이라는 변수를 선언하고

        do while문 안에 변수 num 호출과 동시에 random(100); 랜덤 함수를 호출합니다
        그러면 위와 같이 num = random(100); 이라는 코드가 완성됬네여

        그러면 나머지 하나 남은 건 조건입니다
        코드가 있어도 조건이 없으면 실행이 되지 않기에

        조건을 3의 배수가 아닌 수로 조건을 만들어주면 되는 것입니다
      • 준영
        예제 1 (랜덤 숫자 생성에 대한 본인이 해석한 것과 그에 대한 피드백을 요청합니다.)

        예제)
        new num = random(100);
        if(num % 3 != 0)
        {
        // 다시 뽑기
        }

        num의 변수에 넣어진 random함수 생성과 동시에 (100); 이라는 값을 선언

        즉 선언과 동시에 초기화가 이루어집니다.

        다음은 조건문.
        조건문에서

        num % 3 != 0 이 부분은
        num의 변수에 선언된 값에 3을 나누고 나누고 남은 값이 0과 다르면 트루값을
        0과 같다면 펄즈값을

        여기서 0값과 다르다면 트루값을 나타내는 이유는 본문에서는 3의 배수를 구하는 것이 아닌 3의 배수가 아닌 수를 구하는 것이기에 트루값을 나타냅니다.

        반대로 0과 같다면 펄즈값을 나타내는 이유는 조건문은 3의 배수가 아닌 수를 구하는 것이고 num값과 3값이 나누어지고 나머지 값이 0이라면 3의 배수로 끝나기에 펄즈값을 나타냅니다.

        근데 num % 3 != 0 이 부분이 왜 3의 배수를 가릴 수 있는지 궁금하네요 (<<<< 이 부분은 제가 어느정도 이해했는데 아래 해석글 작성할테니 보충 부탁드립니다.)

        new num = random(100); 이 변수를 선언하고
        조건문에 이 변수가 들어감과 동시에 랜덤으로 값을 호출합니다.

        호출된 값과 3이 나누어지고 남은 수가 0이라면 3의 배수 0이 아니라면 3의 배수가 아님을 나타내기에 저런 조건을 넣은거라고 생각합니다
      • 준영
        최대값이 (max-1) 이라는 점에 유의하시기 바랍니다.

        위 부분에도 질문이 있습니다.

        최대값이 (max-1)이라고 적혀있는데 이것은 random() function에 값인 100에서 -1을 말하는거라면
        [0] ~ [99]까지가 맞는건가요?

        new num = random(100);

        제가 이해한 게 맞나요?
      • 준영
        예제 1번 random() function에 대해 의문이 드는 것이 있습니다.

        아쿠님께서 수업하실 때 wi-ki를 많이 보라고 하셔서 wi-ki를 보면서 공부를 하고 있는데 아무리 찾아도 function 에 random()이라는 것은 없습니다.

        wi-ki에 나오지 않는 random() function의 경우에는 어떻게 만들어진 것인가요?

        임의적으로 정해준 것인지 만약에 그렇지 않다면 random(max)로 사용할 수 있다고 표기되어 있는데 이 부분은 무엇인지에 대해 알고 싶습니다.
      • 준영
        1번 읽음.