22. for 반복문
1. 키워드
for
반복문- 루프(Loop), 루프 선언문(Loop Statement), 루프 본체(Loop Body)
2. for
반복문으로 "Hello, world!"
출력하기
- 대부분의 프로그래밍 언어에서는 반복되는 작업을 간단하게 처리하기 위해 반복문이라는 기능을 제공해 주는데, 반복 횟수, 반복 및 정지 조건을 자유자재로 제어할 수 있다.
- C의
for
반복문은 다음과 같이()
(괄호) 안에 초기식, 조건식, 변화식을 지정하며 이 부분을 루프 선언문이라고 부른다. - 그리고
{}
(중괄호) 안에 반복할 코드를 작성하는데 이 부분을 루프 본체라고 부른다.
- 다음은
for
반복문의 실행 과정이다. - 먼저 초기식부터 시작하여 조건식을 판별하는데, 여기서 조건식이 참이면 반복할 코드(루프 본체)를 실행하고, 변화식을 수행한다.
- 그리고 다시 조건식을 판별하여 참이면 코드를 계속 반복하고, 거짓이면 반복문을 끝낸 뒤 다음 코드를 실행한다.
- 조건식 → 루프 본체 → 변화식 → 조건식으로 순환하는 부분을 루프라고 부른다.
3. for
반복문 사용하기
for
반복문으로"Hello, world!"
를100
번 출력해 보자.
#include <stdio.h>
int main()
{
for (int i = 0; i < 100; i++) // 0부터 99까지 증가하면서 100번 반복
{
printf("Hello, world!\n");
}
return 0;
}
// ... (생략)
// Hello, world!
// Hello, world!
// Hello, world!
for
반복문의()
에 초기식, 조건식, 변화식을 지정했고,{}
안에 반복할 코드를 넣었다.
- 초기식, 조건식, 변화식에 대한 내용은 다음과 같다.
1] 초기식
- 반복문을 시작할 때의 초기식이다.
- 보통 정수형 변수를 선언한 뒤
0
을 할당하며, 이 변수를 루프 인덱스(Loop Index)라고도 부르며i
를 주로 사용한다. - 반복에 사용할 변수는 초기식 부분에서 선언해도 되고,
for
반복문 바깥에서 선언해도 된다.
2] 조건식
- 반복될 조건이다.
- 조건식이 참이면 계속 반복하며, 거짓이 되면 반복문을 끝낸다.
3] 변화식
- 반복문이 한 번 실행될 때마다 수행할 식이다.
- 보통 증가 연산자
++
를 사용하여 변수의 값을1
씩 증가시킨다.
- 먼저 초기식에는
int i = 0;
과 같이 반복에 사용할 변수를 선언하고0
으로 초기화했다. - 그리고
i
가100
보다 작을 때까지만 반복을 하겠다고 조건식을 지정하고, 한 번 반복할 때마다i
를1
씩 증가시키겠다는 변화식을 지정했다.
// ↓ 반복에 사용할 변수 i를 선언하고 0으로 초기화
for (int i = 0; i < 100; i++)
{ // ↑ ↖ 한 번 반복할 때마다 i를 1씩 증가시킴
// i가 100보다 작을 때까지만 반복
printf("Hello, world!\n");
}
- 반복문이 처음 시작되면
i
에0
이 들어가고,i
가100
보다 작은지 검사한다. 0
은100
보다 작으므로{}
안의 코드를 실행한다.- 그리고
i++
를 실행하여i
를1
증가시킨다. - 다시
i
가100
보다 작은지 검사한 뒤i
가100
보다 작으면{}
안의 코드를 실행한다. - 이 과정을 반복하다가
i
가100
이 되면i < 100
조건식이 거짓이 되므로 반복문을 끝낸다. - 이처럼
for
반복문은 반복 횟수가 정해져 있을 때 유용하다.
초기식에서 변수 선언
- 초기식에서 변수를 선언(Loop Initial Declaration)하는 것은 C99 방식이다.
for (int i = 0; i < 100; i++) // for 반복문 초기식에서 변수를 선언. C99 방식
{
printf("Hello, world!\n");
}
printf("%d\n", i); // 컴파일 에러: i는 for 반복문 바깥에서 사용할 수 없음
- C99 방식은 코드를 간결하게 만드는 장점이 있다.
- 단, 변수를 루프 본체 안에서만 사용할 수 있고, 바깥에서는 사용할 수 없다.
- C99 이전의 방식은
for
반복문 바깥에 변수를 선언한다.
int i; // for 반복문 바깥에 변수 선언
for (i = 0; i < 100; i++)
{
printf("Hello, world!\n");
}
printf("%d\n", i); // for 반복문 바깥에서 사용할 수 있음
- C99 이전의 방식은
for
반복문 바깥에 변수를 선언하므로 루프 본체 안과 밖에서 모두 사용할 수 있다.
4. 초깃값의 변화 알아보기
for
반복문이 끝나면 반복에 사용한 변수i
의 값은 어떻게 되는지 확인해 보자.
#include <stdio.h>
int main()
{
int i;
for (i = 0; i < 10; i++) // 0부터 9까지 증가하면서 10번 반복
{
printf("Hello, world!\n");
}
printf("%d\n", i); // 반복문이 끝난 뒤 i의 값 출력
return 0;
}
// Hello, world!
// Hello, world!
// Hello, world!
// Hello, world!
// Hello, world!
// Hello, world!
// Hello, world!
// Hello, world!
// Hello, world!
// Hello, world!
// 10
- 여기서는 조건식을
i < 10
과 같이 지정했으므로"Hello, world!"
는10
번만 출력되었다. - 그리고
for
반복문이 끝난 뒤에 변수i
의 값을 출력해 보면10
이 나왔다. - 왜냐하면
i
가0
부터 시작해서9
까지 증가하면서printf
함수를 실행하지만i
가10
이 되면 조건식i < 10
은 거짓이 되므로 반복을 끝냈기 때문이다.
5. 초깃값을 1
부터 시작하기
- 다음은 초깃값을
0
이 아닌1
부터 시작하여100
번을 반복한다.
#include <stdio.h>
int main()
{
for (int i = 1; i <= 100; i++) // 1부터 100까지 증가하면서 100번 반복
{
printf("Hello, world! %d\n", i); // "Hello, world!"와 i의 값을 함께 출력
}
return 0;
}
// Hello, world! 1
// Hello, world! 2
// ... (생략)
// Hello, world! 98
// Hello, world! 99
// Hello, world! 100
- 여기서는 초기식이
int i = 1
이지만 조건식에서i
가100
보다 작거나 같을 때까지만 반복하므로100
번만 출력한다. - 즉,
i
를1
부터100
까지 증가시켜서100
번이 된다. - 만약
101
이 되면i <= 100
은 거짓이므로 반복문을 끝낸다.
6. 초깃값을 감소시키기
- 반대로 초깃값을 크게 주고, 변수를 감소시키면서 반복해 보자.
#include <stdio.h>
int main()
{
for (int i = 100; i > 0; i--) // 100부터 1까지 감소하면서 100번 반복
{
printf("Hello, world! %d\n", i); // "Hello, world!"와 i의 값을 함께 출력
}
return 0;
}
// Hello, world! 100
// Hello, world! 99
// ... (생략)
// Hello, world! 3
// Hello, world! 2
// Hello, world! 1
- 초깃값이
100
이고, 변화식에서i--
로 지정하여 반복을 할 때마다 변수를1
씩 감소시켰다. - 그리고 조건식이
i > 0
이므로100
에서1
까지 감소시켜서100
번이 된다. - 즉,
i
가0
이 되면 반복문을 끝낸다.
7. for
반복문과 세미콜론
for
반복문은if
조건문과 마찬가지로 끝에;
(세미콜론)을 붙이면 안 된다.
#include <stdio.h>
int main()
{
for (int i = 0; i < 100; i++); // for 루프 선언문 끝에 세미콜론을 붙이면 안됨
{
printf("Hello, world!\n");
}
return 0;
}
// Hello, world!
- 이렇게 되면
for
와printf
는 관계가 없이 떨어진 상태가 된다. - 따라서 반복이 되지 않고 한 번만 실행된다.
for
반복문 끝에 세미콜론을 붙이게 되면 실제로는 다음과 같은 코드가 된다.
8. for
반복문에서 중괄호 생략하기
for
반복문으로 반복할 코드가 한 줄이라면 다음과 같이{}
(중괄호)는 생략할 수 있다.
#include <stdio.h>
int main()
{
for (int i = 0; i < 100; i++)
printf("Hello, world!\n"); // 반복할 코드가 한 줄이라면 중괄호 생략
return 0;
}
// ... (생략)
// Hello, world!
// Hello, world!
// Hello, world!
// Hello, world!
{}
를 생략해도 결과는 똑같다.- 단,
for
에서 반복할 코드가 두 줄 이상일 때는{}
생략에 주의해야 한다.
#include <stdio.h>
int main()
{
for (int i = 0; i < 100; i++)
printf("for 반복문\n"); // 이 줄만 반복됨
printf("Hello, world!\n"); // 이 줄은 한 번만 실행됨
return 0;
}
// ... (생략)
// for 반복문
// for 반복문
// for 반복문
// for 반복문
// Hello, world!
for
로 반복할printf
가 두 개인데도{}
를 생략하면 첫 번째printf
만 반복된다.- 즉, 첫 번째
printf
가100
번 반복된 뒤에 두 번째printf
가 실행되어"Hello, world!"
는 한 번만 출력된다.
for
로 반복할 코드가 두 줄 이상이라면 반드시{}
로 묶어준다.
#include <stdio.h>
int main()
{
for (int i = 0; i < 100; i++)
printf("Hello, world!\n"); // 반복할 코드가 한 줄이라면 중괄호 생략
for (int i = 0; i < 100; i++)
{ // 반복할 코드가 두 줄 이상이라면 중괄호로 묶어줌
printf("for 반복문\n");
printf("Hello, world!\n");
}
return 0;
}
- 즉, 루프 본체가 한 줄이면
{}
를 생략할 수 있고, 두 줄 이상이라면 반드시{}
를 사용한다.
9. 입력한 횟수대로 반복하기
- 이번에는 입력한 횟수대로 반복을 해보자.
#define _CRT_SECURE_NO_WARNINGS // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
int main()
{
int count;
scanf("%d", &count); // 값을 입력받음
for (int i = 0; i < count; i++) // 0부터 입력받은 값보다 작을 때까지 반복
{
printf("Hello, world! %d\n", i);
}
return 0;
}
// 5 (입력)
// Hello, world! 0
// Hello, world! 1
// Hello, world! 2
// Hello, world! 3
// Hello, world! 4
scanf
함수로 입력 값을 받아서count
변수에 저장했다.- 그리고
for
반복문의 조건식에서i < count
와 같이 지정하여count
에 들어있는 값보다 작을 때까지 반복하다록 했다. - 여기서는
5
를 입력했으므로"Hello, world!"
는5
번만 출력된다.
- 이번에는 초깃값을 받은 뒤 초깃값만큼 출력해 보자.
#define _CRT_SECURE_NO_WARNINGS // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
int main()
{
int count;
scanf("%d", &count); // 값을 입력받음
for (int i = count; i > 0; i--) // 입력받은 값을 감소시키면서 반복
{
printf("Hello, world! %d\n", i);
}
return 0;
}
// 5 (입력)
// Hello, world! 5
// Hello, world! 4
// Hello, world! 3
// Hello, world! 2
// Hello, world! 1
scanf
함수로 입력 값을 받아서count
변수에 저장한 뒤for
반복문의 초깃값 부분에서count
를i
에 할당했다.- 그리고 조건식은
i > 0
, 변화식은i--
로 지정하여 반복문이 실행될 때마다i
를 감소시키고i
가0
이 되면 반복문을 끝내도록 만들었다.
i
를 따로 선언하지 않고,count
를 그대로 사용할 수도 있다.
#define _CRT_SECURE_NO_WARNINGS // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
int main()
{
int count;
scanf("%d", &count); // 값을 입력받음
for (; count > 0; count--) // 초깃값 없이 scanf에서 사용한 변수를 감소시켜서 반복
{
printf("Hello, world! %d\n", count);
}
return 0;
}
// 5 (입력)
// Hello, world! 5
// Hello, world! 4
// Hello, world! 3
// Hello, world! 2
// Hello, world! 1
for
의 초기식 부분이 비어있다.- 즉,
for
반복문에 사용할 변수와 초깃값이 준비되어 있으면 초깃값 부분을 생략할 수 있다. - 그리고 조건식과 변화식 모두
count > 0
,count--
처럼count
변수를 기준으로 만들면 된다.
- 또한 다음과 같이 초기식 부분에서
scanf
함수를 호출하는 방식으로도 작성할 수 있다.
#define _CRT_SECURE_NO_WARNINGS // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
int main()
{
int count;
for (scanf("%d", &count); count > 0; count--)
{
printf("Hello, world! %d\n", count);
}
return 0;
}
// 5 (입력)
// Hello, world! 5
// Hello, world! 4
// Hello, world! 3
// Hello, world! 2
// Hello, world! 1
10. for
반복문에서 변수 두 개 사용하기
- 이번에는
for
반복문에서 변수를 두 개 사용하고, 변수의 증가 폭을 다르게 만들어보자.
#include <stdio.h>
int main()
{
for (int i = 0, j = 0; i < 10; i++, j += 2) // i는 1씩 증가, j는 2씩 증가
{
printf("i: %d, j: %d\n", i, j);
}
return 0;
}
// i: 0, j: 0
// i: 1, j: 2
// i: 2, j: 4
// i: 3, j: 6
// i: 4, j: 8
// i: 5, j: 10
// i: 6, j: 12
// i: 7, j: 14
// i: 8, j: 16
// i: 9, j: 18
for
의 초기식에서 변수를 두 개 선언하고0
으로 초기화했다.- 그리고 변화식에서
i
는1
씩 증가시키고,j
는2
씩 증가시켰다. - 마지막으로 조건식에서는
i
가10
보다 작을 때까지 반복하도록 만들었다. - 변화식에서는
++
,--
뿐만 아니라+=
,-=
,/=
도 사용할 수 있다.
11. for 반복문으로 무한 루프 만들기
- 이번에는
for
반복문으로 무한 루프를 만들어보자.
#include <stdio.h>
int main()
{
for (;;) // 초깃값, 조건식, 변화식을 모두 생략하면 무한 루프
{
printf("Hello, world!\n");
}
return 0;
}
// ... (생략)
// Hello, world!
// Hello, world!
// Hello, world!
// Hello, world!
// ... (계속 반복)
for
에서 초깃값, 조건식, 변화식을 모두 생략하면 무한 루프가 만들어진다.
References
- https://dojang.io/mod/page/view.php?id=205
- https://dojang.io/mod/page/view.php?id=206
- https://dojang.io/mod/page/view.php?id=207
- https://dojang.io/mod/page/view.php?id=208
- https://dojang.io/mod/page/view.php?id=209
- https://dojang.io/mod/page/view.php?id=210
- https://dojang.io/mod/page/view.php?id=211
- https://dojang.io/mod/page/view.php?id=212
- https://dojang.io/mod/page/view.php?id=213
- https://dojang.io/mod/page/view.php?id=214