개요
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 반복문을 사용할 수 있게 되었습니다.