23. while 반복문
1. 키워드
while
반복문
2. while
반복문으로 "Hello, world!"
출력하기
while
반복문은()
(괄호) 안에 조건식만 들어가고, 초기식은 반복문 바깥에 있다.- 그리고
{}
(중괄호) 안에 반복할 코드와 변화식이 함께 들어간다.
- 다음은
while
반복문의 실행 과정이다. - 먼저 초기식부터 시작하여 조건식을 판별한다.
- 여기서 조건식이 참이면 반복할 코드와 변화식을 함께 수행한다.
- 그리고 다시 조건식을 판별하여 참이면 코드를 계속 반복하고, 거짓이면 반복문을 끝낸 뒤 다음 코드를 실행한다.
- 여기서는 조건식 → 루프 본체 및 변화식 → 조건식으로 순환하는 부분이 루프이다.
3. while
반복문 사용하기
- 이제
while
반복문으로"Hello, world!"
를100
번 출력해 보자.
#include <stdio.h>
int main()
{
int i = 0;
while (i < 100) // i가 100보다 작을 때 반복. 0에서 99까지 증가하면서 100번 반복
{
printf("Hello, world!\n");
i++; // i를 1씩 증가시킴
}
return 0;
}
// ... (생략)
// Hello, world!
// Hello, world!
// Hello, world!
// Hello, world!
- 먼저 반복문에 사용할 변수
i
를 선언한 뒤0
으로 초기화한다. - 그리고
while
에는 조건식만 지정하면 된다. - 여기서
while
반복문은 반드시{}
안에 변화식을 지정해야 한다. - 만약 조건식만 지정하고
{}
안에서 변화식을 생략하면 반복이 끝나지 않고 계속 실행되므로 주의해야 한다.
i < 100
과 같이 조건식을 지정하여i
가100
미만일 때만 반복하고,i
가100
이 되면 반복을 끝내도록 만들었다.- 그리고
{}
안에서는 반복할 코드를 작성한 뒤i++
로i
를1
씩 증가시켰으므로i
가0
부터99
까지 증가하면서100
번 반복하게 된다.
4. 초깃값을 1
부터 시작하기
- 이번에는
i
를0
이 아닌1
로 초기화하여"Hello, world!"
를100
번 출력해 보자.
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 100) // i가 100보다 작거나 같을 때 반복.
{ // 1에서 100까지 증가하면서 100번 반복
printf("Hello, world! %d\n", i); // "Hello, world!"와 i의 값을 함께 출력
i++; // i를 1씩 증가시킴
}
return 0;
}
// Hello, world! 1
// Hello, world! 2
// ... (생략)
// Hello, world! 98
// Hello, world! 99
// Hello, world! 100
i
를1
로 초기화했기 때문에while
의 조건식은i <= 100
과 같이 지정한다.- 따라서
i
가1
부터100
까지 증가하므로100
번만 반복하게 된다. - 만약
101
이 되면i <= 100
은 거짓이므로 반복문을 끝낸다.
5. 초깃값을 감소시키기
- 반대로 초깃값을 크게 주고, 변수를 감소시키면서 반복할 수도 있다.
#include <stdio.h>
int main()
{
int i = 100;
while (i > 0) // i가 0보다 클 때 반복. 100부터 1까지 감소하면서 100번 반복
{
printf("Hello, world! %d\n", i); // "Hello, world!"와 i의 값을 함께 출력
i--; // i를 1씩 감소시킴
}
return 0;
}
// Hello, world! 100
// Hello, world! 99
// ... (생략)
// Hello, world! 3
// Hello, world! 2
// Hello, world! 1
i
가100
이고, 변화식에서i--
로 지정하여 반복을 할 때마다 변수를1
씩 감소시켰다.- 그리고 조건식이
i > 0
이므로100
에서1
까지 감소시켜서100
번이 된다. - 즉,
i
가0
이 되면 반복문을 끝낸다.
6. while
반복문과 세미콜론
for
와 마찬가지로while
도 끝에;
(세미콜론)을 붙이면 안 된다.
#include <stdio.h>
int main()
{
int i = 0;
while (i < 100); // while 루프 선언문 끝에 세미콜론을 붙이면 안됨
{
printf("Hello, world!\n");
i++;
}
return 0;
}
- 이 코드를 컴파일하여 실행해 보면 아무것도 출력되지 않을 것이다.
- 왜냐하면
;
을 붙여서while
과 반복할 코드는 관계가 없이 떨어진 상태가 되고,{}
안에 있는 변화식은 전혀 실행되지 않기 때문이다. - 따라서
while
은 끝나지 않는 무한 루프 상태가 된다. - 이렇게 되면 뒤에 오는
printf
는 절대 실행되지 않는다.
- 즉,
while
반복문 끝에;
을 붙이게 되면 실제로는 다음과 같은 코드가 된다.
7. 입력한 횟수대로 반복하기
- 이번에는 입력한 횟수대로 반복을 해보자.
#define _CRT_SECURE_NO_WARNINGS // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
int main()
{
int count;
scanf("%d", &count); // 값을 입력받음
int i = 0;
while (i < count) // i가 count보다 작을 때 반복
{
printf("Hello, world! %d\n", i); // "Hello, world!"와 i의 값을 함께 출력
i++; // i를 1씩 증가시킴
}
return 0;
}
// 5 (입력)
// Hello, world! 0
// Hello, world! 1
// Hello, world! 2
// Hello, world! 3
// Hello, world! 4
scanf
함수로 입력 값을 받아서count
변수에 저장했다.- 그리고
while
반복문의 조건식에서i < count
와 같이 지정하여count
에 들어있는 값만큼 반복하도록 했다. - 여기서는
5
를 입력했으므로"Hello, world!"
는5
번만 출려된다.
- 이번에는 초깃값을 받은 뒤 초깃값만큼 출력해 보자.
#define _CRT_SECURE_NO_WARNINGS // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
int main()
{
int count;
scanf("%d", &count); // 값을 입력받음
while (count > 0) // count가 0보다 클 때 반복
{
printf("Hello, world! %d\n", count);
count--; // count를 1씩 감소시킴
}
return 0;
}
// 5 (입력)
// Hello, world! 5
// Hello, world! 4
// Hello, world! 3
// Hello, world! 2
// Hello, world! 1
scanf
함수로 입력 값을 받아서count
변수에 저장한 뒤 조건식에서count > 0
과 같이 지정하여count
에 들어있는 값만큼 반복하도록 했다.- 여기서는
i
를 선언하지 않고count
를 바로 사용하므로 변화식은count--
로 지정하여 반복문이 실행될 때마다count
를 감소시키고count
가0
이 되면 반복문을 끝내도록 만들었다.
8. 반복 횟수가 정해지지 않은 경우
- 지금까지 조건식에서 반복 횟수를 정한 뒤 변수
i
를 증가시키거나 감소시켜서while
반복문을 사용했지만while
반복문은 반복 횟수가 정해지지 않았을 때, 논리 조건에 따라 반복 여부를 결정할 때 주로 사용한다.
- 다음은
while
반복문 안에서 무작위로 정수를 생성한 뒤3
이 나오면 반복을 끝낸다.
#include <stdio.h>
#include <stdlib.h> // srand, rand 함수가 선언된 헤더 파일
#include <time.h> // time 함수가 선언된 헤더 파일
int main()
{
srand(time(NULL)); // 현재 시간값으로 시드 설정
int i = 0;
while (i != 3) // 3이 아닐 때 계속 반복
{
i = rand() % 10; // rand 함수를 사용하여 무작위로 정수를 생성한 뒤 10 미만의 숫자로 만듦
printf("%d\n", i);
}
return 0;
}
// 2
// 9
// 9
// 4
// 0
// 3
// ↑ 무작위 생성이므로 실행할 때마다 달라짐
- 먼저 무작위로 정수를 생성하려면
srand
,rand
,time
함수가 필요하다.
1] srand
- 난수를 발생시킬 초깃값인 시드(Seed)를 설정한다.
- 보통 현재 시간값을 사용한다.
2] rand
- 난수를 발생시킨다.
3] time
- 정수 형태로 된 현재 시간값을 반환한다.
- 현재 시간값으로 시드를 설정한다.
- 이제
while
반복문에서i != 3
과 같이 조건식을 지정하여3
이 아닐 때 계속 반복하도록 작성한다. - 그리고 루프 본체에서는
i = rand() % 10;
과 같이 무작위로 정수를 생성하여 변수i
에 저장한다. - 여기서
rand
함수에서 반환된 값의 자리수가 크기 때문에10
으로 나누었을 때 나머지를 구해서10
미만의 수로 만들어준다.
int i = 0;
while (i != 3) // 3이 아닐 때 계속 반복
{
i = rand() % 10; // rand 함수를 사용하여 무작위로 정수를 생성한 뒤 10 미만의 숫자로 만듦
printf("%d\n", i);
}
- 정수가 무작위로 생성되므로 실행을 할 때마다 반복 횟수가 달라지는 것을 볼 수 있다.
- 이처럼
while
반복문은 반복 횟수가 정해져 있지 않을 때 유용하다.
9. while
반복문으로 무한 루프 만들기
- 이번에는 무한 루프를 만들어보자.
#include <stdio.h>
int main()
{
while (1) // while에 1을 지정하면 무한 루프
{
printf("Hello, world!\n");
}
return 0;
}
// ... (생략)
// Hello, world!
// Hello, world!
// Hello, world!
// Hello, world!
// ... (계속 반복)
while
에서 조건식 대신1
을 지정하면 무한 루프가 만들어진다.- 따라서 조건식 자체가 없으므로 변화식도 필요없다.
- 무한 루프를 만들 때 다음과 같이
1
대신 불값인true
를 넣기도 한다.
#include <stdio.h>
#include <stdbool.h> // bool, true, false가 정의된 헤더 파일
int main()
{
while (true) // while에 true를 지정하면 무한 루프
{
printf("Hello, world!\n");
}
return 0;
}
- 여기서는
stdbool.h
헤더 파일을 사용하여while
에true
를 지정했다. 1
대신true
를 사용해도 동작은 달라지지 않지만 코드의 의도를 좀 더 명확하게 표현할 수 있어서 자주 사용되는 방식이다.
10. while
반복문에서 중괄호 생략하기
while
반복문으로 반복할 코드가 한 줄이라면 다음과 같이{}
는 생략할 수 있다.
#include <stdio.h>
int main()
{
while (1)
printf("Hello, world!\n"); // 반복할 코드가 한 줄이라면 중괄호 생략
return 0;
}
// ... (생략)
// Hello, world!
// Hello, world!
// Hello, world!
// ... (계속 반복)
while
반복문은 보통 루프 본체에 변화식이 함께 들어가므로{}
를 생략하는 경우는 많지 않다.
References
- https://dojang.io/mod/page/view.php?id=218
- https://dojang.io/mod/page/view.php?id=219
- https://dojang.io/mod/page/view.php?id=220
- https://dojang.io/mod/page/view.php?id=221
- https://dojang.io/mod/page/view.php?id=222
- https://dojang.io/mod/page/view.php?id=223
- https://dojang.io/mod/page/view.php?id=224
- https://dojang.io/mod/page/view.php?id=225
- https://dojang.io/mod/page/view.php?id=226