Skip to content

22. for 반복문


1. 키워드

  • for 반복문
  • 루프(Loop), 루프 선언문(Loop Statement), 루프 본체(Loop Body)


2. for 반복문으로 "Hello, world!" 출력하기

  • 대부분의 프로그래밍 언어에서는 반복되는 작업을 간단하게 처리하기 위해 반복문이라는 기능을 제공해 주는데, 반복 횟수, 반복 및 정지 조건을 자유자재로 제어할 수 있다.


  • C의 for 반복문은 다음과 같이 ()(괄호) 안에 초기식, 조건식, 변화식을 지정하며 이 부분을 루프 선언문이라고 부른다.
  • 그리고 {}(중괄호) 안에 반복할 코드를 작성하는데 이 부분을 루프 본체라고 부른다.


for (초기식; 조건식; 변화식) // ← 루프 선언문(loop statement)
{
    반복할코드
}
// ↑ 루프 본체(loop body)


  • 다음은 for 반복문의 실행 과정이다.
  • 먼저 초기식부터 시작하여 조건식을 판별하는데, 여기서 조건식이 참이면 반복할 코드(루프 본체)를 실행하고, 변화식을 수행한다.
  • 그리고 다시 조건식을 판별하여 참이면 코드를 계속 반복하고, 거짓이면 반복문을 끝낸 뒤 다음 코드를 실행한다.


001


  • 조건식 → 루프 본체 → 변화식 → 조건식으로 순환하는 부분을 루프라고 부른다.


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 반복문의 ()에 초기식, 조건식, 변화식을 지정했고, {} 안에 반복할 코드를 넣었다.


002


  • 초기식, 조건식, 변화식에 대한 내용은 다음과 같다.


1] 초기식

  • 반복문을 시작할 때의 초기식이다.
  • 보통 정수형 변수를 선언한 뒤 0을 할당하며, 이 변수를 루프 인덱스(Loop Index)라고도 부르며 i를 주로 사용한다.
  • 반복에 사용할 변수는 초기식 부분에서 선언해도 되고, for 반복문 바깥에서 선언해도 된다.

2] 조건식

  • 반복될 조건이다.
  • 조건식이 참이면 계속 반복하며, 거짓이 되면 반복문을 끝낸다.

3] 변화식

  • 반복문이 한 번 실행될 때마다 수행할 식이다.
  • 보통 증가 연산자 ++를 사용하여 변수의 값을 1씩 증가시킨다.


  • 먼저 초기식에는 int i = 0;과 같이 반복에 사용할 변수를 선언하고 0으로 초기화했다.
  • 그리고 i100보다 작을 때까지만 반복을 하겠다고 조건식을 지정하고, 한 번 반복할 때마다 i1씩 증가시키겠다는 변화식을 지정했다.


//       ↓ 반복에 사용할 변수 i를 선언하고 0으로 초기화
for (int i = 0; i < 100; i++)
{ //              ↑         ↖  한 번 반복할 때마다 i를 1씩 증가시킴
    // i가 100보다 작을 때까지만 반복
    printf("Hello, world!\n");
}


  • 반복문이 처음 시작되면 i0이 들어가고, i100보다 작은지 검사한다.
  • 0100보다 작으므로 {} 안의 코드를 실행한다.
  • 그리고 i++를 실행하여 i1 증가시킨다.
  • 다시 i100보다 작은지 검사한 뒤 i100보다 작으면 {} 안의 코드를 실행한다.
  • 이 과정을 반복하다가 i100이 되면 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이 나왔다.
  • 왜냐하면 i0부터 시작해서 9까지 증가하면서 printf 함수를 실행하지만 i10이 되면 조건식 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이지만 조건식에서 i100보다 작거나 같을 때까지만 반복하므로 100번만 출력한다.
  • 즉, i1부터 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번이 된다.
  • 즉, i0이 되면 반복문을 끝낸다.


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!


  • 이렇게 되면 forprintf는 관계가 없이 떨어진 상태가 된다.
  • 따라서 반복이 되지 않고 한 번만 실행된다.


  • for 반복문 끝에 세미콜론을 붙이게 되면 실제로는 다음과 같은 코드가 된다.


for (int i = 0; i < 100; i++);

printf("Hello, world!\n");


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만 반복된다.
  • 즉, 첫 번째 printf100번 반복된 뒤에 두 번째 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 반복문의 초깃값 부분에서 counti에 할당했다.
  • 그리고 조건식은 i > 0, 변화식은 i--로 지정하여 반복문이 실행될 때마다 i를 감소시키고 i0이 되면 반복문을 끝내도록 만들었다.


  • 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으로 초기화했다.
  • 그리고 변화식에서 i1씩 증가시키고, j2씩 증가시켰다.
  • 마지막으로 조건식에서는 i10보다 작을 때까지 반복하도록 만들었다.
  • 변화식에서는 ++, --뿐만 아니라 +=, -=, /=도 사용할 수 있다.


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