08. 반복문
기본적인 반복문
일정한 코드를 반복해서 실행하고 싶을 때 반복문을 사용합니다.
만약 1부터 10까지 자연수를 출력하고 싶다면, 다음의 2가지 방법이 있습니다.
(while문)
#include <stdio.h>
int main(void)
{
int num = 1;
while(num <= 10)
{
printf("%d\n", num);
num = num + 1;
}
}
(for문)
#include <stdio.h>
int main(void)
{
int num = 1;
for(num = 1; num <= 10; num = num + 1)
{
printf("%d\n", num);
}
}
결과는 두 경우 모두 같습니다.
1
2
3
4
5
6
7
8
9
10
1) 증감연산자
증가와 감소 나타내기
어떤 변수
num
의 값을 a
만큼 증가시키려면 다음과 같이 작성하면 됩니다.num = num + a;
그러나 num에 a를 더해라와 같이 줄여서 표현할 수 있는 방법이 있습니다.
num += a;
이처럼 변수 자체의 값에 변화를 줄 때 줄여서 쓸 수 있는 연산자는 연산자와 등호를 함께 쓰면 됩니다.
연산자 | 기능 |
---|---|
+= | num = num + a |
-= | num = num - a |
*= | num = num * a |
/= | num = num / a |
%= | num = num % a |
증감연산자
반복문에서는 앞서 본 예시와 같이 1씩 증가하거나 감소하는 경우가 많은데 이런 경우 위와 같이 적는다면
num = num + 1;
이 됩니다. 그러나 이를 더 줄여서 표현할 수 있는 방법이 있습니다.
num++;
++의 의미는 num에 1을 더해준다는 뜻이며 마찬가지로 --는 num에 1을 빼준다는 의미입니다.
연산자 | 기능 |
---|---|
num++ | num = num + 1 |
num-- | num = num - 1 |
단, num//, num%%등은 사용할 수 없습니다.
num++과 ++num의 차이
++를 변수의 앞에 붙이든 뒤에 붙이든 변수의 값이 1 커지는 것은 같습니다.
그러나 ++의 위치는 변수가 사용됨과 동시에 증가할 때 차이가 나타나도록 합니다.
(뒤에 붙인 경우)
int num = 1;
printf("%d\n", num++);
printf("%d\n", num);
결과
1
2
(앞에 붙인 경우)
int num = 1;
printf("%d\n", ++num);
printf("%d\n", num);
결과
2
2
num++는 num값을 필요한 곳에 사용한 다음 num값을 증가시키지만
++num은 num값을 증가시킨 다음 증가된 num값을 필요한 곳에 사용한다는 점이 다릅니다.
반복문에서 헷갈리기 쉬운데 프로그램을 작성할 때 주로 num++와 같이 뒤에 적는 방법이 주로 사용됩니다.
++를 앞에 적는 것을 전위증감연산자, 뒤에 적는 것을 후위증감연산자라고 합니다.
2) while
while문의 구조
while문은 다음과 같은 구조를 갖습니다.
while (조건)
{
조건이 참일 때 실행 될 내용
}
조건이 참이라면 중괄호 안의 내용이 실행되고, 실행이 끝나면 다시 조건을 검사하여 조건이 참이라면 다시 실행합니다.
즉, 조건이 참인 동안 계속해서 내용을 실행하게 됩니다.
조건문을 사용하는 경우
그렇다면 어떤 경우에 조건문을 사용하는 것일까요?
예를 들어 1부터 10까지 자연수의 합을 while문으로 구해봅시다.
int num = 1;
int sum = 0;
while (num <= 10)
{
sum = sum + num;
num = num + 1;
}
printf("%d", sum);
결과
55
이를 약간 바꾸면 사용자가 입력한 수 까지의 합을 구하는 프로그램을 만들 수 있습니다.
int num = 1;
int sum = 0;
int max;
printf("1부터 몇까지 더할까요: ");
scanf("%d", &max);
while (num <= max)
{
sum = sum + num;
num = num + 1;
}
printf("%d", sum);
결과
1부터 몇까지 더할까요: 100
5050
이렇듯 일정한 규칙에 따라 행해지는 작업을 표현할 때 반복문을 사용합니다.
참고로 증감연산자를 사용하면 while문을 다음처럼 작성할 수 있습니다.
while (num <= 10)
{
sum += num++;
}
자주 발생하는 실수
반복문은 소스코드에서 한 번에 과정이 보이는 것이 아니라 추상적인 식으로 표현되기 때문에 실수하기 쉽습니다.
조건문 속 변수가 일정
조건문 내용이 계속 참이되기 때문에 무한루프가 되어버립니다.
int num = 1;
while (num <= 10)
{
sum += num;
}
처음부터 조건이 거짓
실제 상황에서는 사용자의 입력이나 어떠한 계산 결과로 나온 값을 사용하다가 while문을 그냥 지나가버리기도 합니다.
int num = 20;
while (num <= 10)
{
sum += num++;
}
초기화가 안된 변수 사용
초기화를 하지 않은 변수를 사용하면 조건을 검사할 때 문제가 생길 수 있습니다.
while (num =! 0)
{
scanf("%d", &num);
sum += num;
}
이 외에도 여러가지 오류가 발생하기 쉬운 부분이 반복문이므로 오류가 났을 때 주의깊게 보아야 합니다.
3) for
for문의 구조
for문은 다음과 같은 구조를 갖습니다.
for (초기화; 조건; 증감)
{
조건이 참일 때 실행 될 내용
}
while문보다 복잡한 구조를 사용하는 이유는 while문에서 주로 사용하는 부분들은 한 번에 묶고자 했기 때문입니다.
while문을 사용하기 전에 변수를 초기화하고, 조건문에 따라 증감연산자를 사용하는데 이들을 묶어 하나의 문법으로 만든 것입니다.
while문과 for문 비교
두 문법이 어떻게 다른지 비교해봅시다.
예를 들어 1부터 100까지 짝수의 합을 구해봅시다.
while문
int num = 1;
int sum = 0;
while (num <= 100)
{
if (num % 2 == 0)
{
sum += num;
}
num++;
}
또는
int num = 2;
int sum = 0;
while (num <= 100)
{
sum += num;
num += 2;
}
for문
int num;
int sum = 0;
for (num = 1; num <= 100; num++)
{
if (num % 2 == 0)
{
sum += num;
}
}
또는
int num;
int sum = 0;
for (num = 2; num <= 100; num += 2)
{
sum += 2;
}
댓글 없음:
댓글 쓰기