15 반복문(for 문)을 사용한 구간 반복

  • 25 minutes to read

반복문을 사용하면 반복적으로 처리해야할 일을 컴퓨터에게 빠르게 시킬 수 있습니다. 이번 강의는 반복문의 첫 번째인 for 문(for 루프)에 대해서 알아보겠습니다.

> // for 문(for 루프): 초기식부터 조건식을 만족하는 동안 실행문을 실행하고 증감식을 진행

15.1 for 문으로 반복하기

for 문은 특정 구문을 여러 번 반복(Iteration)해서 실행할 때 사용됩니다. for 문의 형식은 다음과 같습니다. 일반적으로, for 문을 말할 때 for 루프(Loop)라고도 말합니다.

for (초기식; 조건식; 증감식)
{
    실행문;
}

for 문은 초기식부터 조건식까지 증감식 크기만큼 증가 또는 감소를 시키면서 실행문을 반복하여 실행합니다. 말이 조금 어렵죠? 걱정하실 필요없이 실제 사용 가능한 코드를 여러 번 반복하다보면 금방 이해할 수 있습니다. 이 강의의 글이 어렵게 느껴지면 그냥 쭉 읽어보면서 넘어가도 전혀 문제가 되지 않습니다. 중요한 것은 소스는 반드시 타이핑 후 결과를 본 후 그리고 나서 내용을 이해하려고 노력해야한다는 점입니다.

참고로, for 문을 순서도로 표현해보면 다음과 같습니다. 3가지 스타일 모두 반복문을 표현합니다.

그림: for 문 순서도

for-statement-flowchart.png

for-loop-flowchart.png

for-loop-function-style-flowchart.png

15.2 for 문을 사용하여 "안녕하세요." 3번 출력하기

for 문을 사용하여 반복해서 출력하는 내용을 다루어 보겠습니다. 가장 간단한 예제로 화면에 "안녕하세요."를 3번 출력하는 예제입니다. 참고로 Visual Studio 편집기에서 for 입력 후 탭 키를 두 번 입력하면 자동으로 for 문에 대한 코드 조각을 생성해줍니다.

코드: for_description.c

//[?] for 문을 사용하여 "안녕하세요." 3번 출력하기
#include <stdio.h>

int main(void)
{
    int i = 0; // 반복 변수 선언

    //[!] for (초기식; 조건식; 증감식) { 실행문; }
    for (i = 0; i < 3; i++) // i가 0, 1, 2 순서로 3번 반복
    {
        printf("안녕하세요.\n");
    }

    return 0;
}
안녕하세요.
안녕하세요.
안녕하세요.

for (초기식;조건식;증감식) { 실행문; } 형태의 구문에 "안녕하세요."를 출력하는 코드를 넣어서 3번 출력하는 구문입니다.

실행 순서를 정리해보면 다음과 같습니다.

  1. i = 0; 초기식 할당
  2. 0 < 3; 비교하여 true가 되어 for 문 진입
  3. printf("안녕하세요."); 출력
  4. **i++;**를 실행하여 i 변수 1 증가
  5. 1 < 3; 비교하여 true가 되어 for 문 다시 진입
  6. printf("안녕하세요."); 다시 출력
  7. **i++;**를 실행하여 i 변수 1 증가
  8. 2 < 3; 비교하여 true가 되어 for 문 다시 진입
  9. printf("안녕하세요."); 다시 출력
  10. **i++;**를 실행하여 i 변수 1 증가
  11. 3 < 3; 비교하여 false가 되어 for 문 종료

참고로, 이 강의 부록의 "디버거 사용하기" 내용을 참고하여 F10번을 여러 번 눌러가면서 for 문의 진행 순서를 하나씩 살펴볼 수 있습니다.

for 문의 반복을 저장해 놓을 i와 같은 변수는 for 문 밖에서 미리 선언해 놓는 방식이 기본이지만, 다음 코드처럼 for 문에 int i = 0;과 같이 포함해서 관리하면 더 편리합니다.

코드: for_description_up.c

#include <stdio.h>

int main(void)
{
    // 초기식 영역에 int i = 0 형태로 직접 변수 선언 가능
    for (int i = 0; i < 3; i++)
    {
        printf("안녕하세요.\n");
    }

    return 0;
}
안녕하세요.
안녕하세요.
안녕하세요.

반복 변수인 i 변수를 for 문 안에서 선언하고 사용하는 것도 실행 결과는 동일합니다.

NOTE

for 문의 증감식 영역에는 i++가 기본인데요. ++i를 써도 됩니다. 하지만, 추천 코드이면서 기본 코드는 i++입니다. 이에 대한 근거를 찾게되면 이 문서를 더 보충하겠습니다만, 확실한 것은 ++i를 쓰지 말고 i++ 형태를 쓰라는 것입니다. 한 가지 더 혼동되는 부분은 ++i를 써야되는 부분도 있습니다. 그래서 결론적으로 학습 입장에서는 둘 중 아무거나 사용하세요...

15.3 for 루프를 사용하여 1부터 5까지 출력하기

for 루프를 사용하여 1부터 5까지 증가되는 숫자를 출력해 보도록 하겠습니다.

코드: for.c

//[?] for 루프를 사용하여 1부터 5까지 출력하기
#include <stdio.h>

int main(void)
{
    int i = 0;

    // 1부터 5까지 1씩 증가 => 5번 반복
    for (i = 1; i <= 5; i++)
    {
        printf("Count: %d\n", i); // 1부터 5까지 출력
    }

    return 0;
}
Count: 1
Count: 2
Count: 3
Count: 4
Count: 5

for (i = 1; i <= 5; i++) 코드 형태에 의해서 1부터 5까지 1씩 증가하여 총 5번을 반복하여 출력문을 실행합니다. 이때 i의 값은 1부터 5까지 출력됩니다.

15.4 for 문으로 0부터 4까지 2씩 증가시켜 출력하기

for 문의 증감식 영역은 기본 값은 1씩 증가를 합니다. 만약, 2씩 증가를 시키려면 i = i + 2 형태로 지정하면 됩니다. 물론, 증감식 영역을 건드리지 않고 실행문 영역에서 다른 형태의 코드를 사용해도 되지만 지금은 for 문의 여러 가지 모양을 살펴보겠습니다.

코드: for_increment.c

//[?] for 문으로 0부터 4까지 2씩 증가시켜 출력하기 
#include <stdio.h>

int main(void)
{
    // 0부터 4까지 2씩 증가
    for (int i = 0; i < 5; i = i + 2)
    {
        printf("%d\n", i); // 0, 2, 4
    }

    return 0;
}
0
2
4

for 문의 증감식 영역에 i++ 대신에 i = i + 2 형태를 지정해서 i의 값을 2씩 증가시킬 수 있습니다.

15.5. 1부터 3까지의 합계 구하기

1부터 3까지의 합계 구하기

이번에는 for 문을 사용하여 변수 i를 1부터 3까지 반복하여 합계를 구하는 방법에 대해 알아봅니다.

다음은 1부터 3까지의 합계를 구하는 C 코드입니다:

코드: for_sum.c

//[?] 1부터 3까지의 합계 구하기
#include <stdio.h>

int main(void)
{
    int n = 3; // n까지 반복
    int sum = 0; // 합계 저장

    for (int i = 1; i <= n; i++)
    {
        sum = sum + i; // 반복하면서 i 값을 계속 합해서 합계(SUM) 기능 구현
    }

    printf("1부터 %d까지의 합: %d\n", n, sum); // 1부터 3까지의 합: 6
}
1부터 3까지의 합: 6

for 문을 사용하면 지정된 범위의 수의 합계를 쉽게 구할 수 있습니다. 이 예제에서는 1부터 3까지의 수를 sum 변수에 누적하여 합계를 구합니다. sum = sum + i; 라는 코드는 sum += i;로 간단히 줄여서 표현할 수 있습니다.

15.6 짝수의 합계 구하기

지정된 범위의 수 중에서 짝수의 합계만 구하는 예제를 for 문을 사용하여 만들겠습니다.

코드: for_sum_even.c

//[?] 1부터 n까지 정수 중 짝수의 합을 구하는 프로그램
#include <stdio.h>

int main(void)
{
    int n = 5;
    int sum = 0;

    for (int i = 1; i <= n; i++) // n == 5이므로 i가 0, 1, 2, 3, 4일 때
    {
        if (i % 2 == 0) // 모든 숫자를 2로 나누었을 때 0과 같으면 짝수 
        {
            sum += i; // 짝수만(2, 4) 더하기 
        }
    }

    printf("1부터 %d까지 짝수의 합: %d\n", n, sum); // 1부터 5까지 짝수의 합: 6

    return 0;
}
1부터 5까지 짝수의 합: 6

for 문으로 1부터 5까지 반복을 하면서 다시 if 문을 사용하여 짝수(2로 나누었을 때 0)일 때에만 i의 값을 합(누적)하여 합계를 구할 수 있습니다.

15.7 1부터 100까지 정수의 합계 구하기

for 문을 사용하여 1부터 100까지 정수의 합을 구하는 방법을 알아보겠습니다.

코드: sum100.c

//[?] 1부터 100까지 정수의 합계 구하기
#include <stdio.h>

int main(void)
{
    //[1] Input(입력)
    int sum = 0;

    //[2] Process(처리)
    for (int i = 1; i <= 100; i++) // i가 1에서 100까지 100번 반복
    {
        sum += i; // sum = sum + i; // 누적(SUM)
    }

    //[3] Output(출력)
    printf("1부터 100까지 정수의 합: %d\n", sum); // 1부터 100까지 정수의 합: 5050

    return 0;
}
1부터 100까지 정수의 합: 5050

사람이 직접 수작업으로 1부터 100까지의 정수의 합계를 구하려면 시간이 많이 필요합니다. 하지만, 컴퓨터를 사용하여 프로그래밍을 하게 되면 아주 빠른 시간에 구할 수 있습니다. 1부터 1,000까지 또는 1부터 10,000까지도 for 문의 조건식만 바꾸면 바로 구할 수 있습니다.

15.8 숫자를 증가시키거나 감소시켜 출력하기

for 문에 대한 일반적인 코드 모양은 0번째 인덱스부터 특정 값까지 증가하는 모양인데, 다음 코드처럼 그 반대로 값을 감소시켜가면서 반복을 진행할 수 있습니다. for 문에 대한 모양은 이처럼 다양하게 사용될 수 있습니다. 자, 그러면 for 문을 사용하여 숫자를 증가시키거나 감소시키는 방법을 알아보겠습니다.

코드: for_demo_countdown.c


```C 
//[?] 숫자를 증가시키거나 감소시켜 출력하기
#include <stdio.h>

int main(void)
{
    //[1] i 변수의 값이 0, 1, 2, 3, 4로 증가
    for (int i = 0; i < 5; i++)
    {
        printf("%d\t", (i + 1)); // 탭(\t)으로 간격 띄우기 
    }
    printf("\n");

    //[2] i 변수의 값이 5, 4, 3, 2, 1로 감소
    for (int i = 5; i > 0; i--)
    {
        printf("%d\t", i); // 탭(\t)으로 간격 띄우기 
    }
    printf("\n");

    return 0;
}
1       2       3       4       5
5       4       3       2       1

일반적인 경우에는 0부터 인덱스 변수가 시작합니다. 초기식에서 i의 값을 5로 설정한 후 조건 판별 후 증감식에서 i--형태로 지정하면 5부터 하나씩 감소하면서 반복을 진행합니다.

15.9 1부터 100까지 짝수의 합 구하기

1부터 100까지 짝수의 합을 구하는 방법을 알아보겠습니다.

코드: for_even.c

//[?] 1부터 100까지 짝수의 합을 구하는 프로그램
#include <stdio.h>

int main(void)
{
    //[1] Input(입력)
    int sum = 0;

    //[2] Process(처리) : 주어진 범위(`for` 문)에 주어진 조건(if 문)
    for (int i = 1; i <= 100; i++) // 1부터 100까지 범위 지정
    {
        if (i % 2 == 0) // 짝수만 필터링(조회)
        {
            sum += i; // 짝수일 때만 합 구하기 
        }
    }

    //[3] Output(출력)
    printf("1부터 100까지 짝수의 합: %d\n", sum);

    return 0;
}
1부터 100까지 짝수의 합: 2550

프로그래밍에서 알고리즘은 주어진 문제를 해결하는 절차를 의미합니다. 일반적인 알고리즘은 입력(Input), 처리(Process), 출력(Output)의 절차를 가집니다. 1부터 100까지 짝수의 합을 구하려면 1부터 100까지의 범위와 짝수라는 조건이 필요한데 이를 각각 for 문과 if 문을 사용하여 처리할 수 있습니다.

15.10 반복문과 연산자 함께 사용하기

반복문과 연산자와 함께 사용하면 여러 형태로 값을 출력할 수 있습니다.

코드: for_demo.c

//[?] 반복문과 연산자 함께 사용하기
#include <stdio.h>

int main(void)
{
    //[1] 1부터 5까지 3개씩 출력하는 프로그램
    for (int i = 1; i <= 5; i++)
    {
        printf("%d\t", i);
        if (i % 3 == 0)
        {
            printf("\n");
        }
    }
    printf("\n");

    //[2] 1~100까지 정수의 합을 구하는 프로그램
    int sum = 0; // 합을 저장할 변수
    for (int i = 1; i <= 100; i++)
    {
        sum += i; // 누적
    }
    printf("1부터 100까지의 합: %d\n", sum);

    //[3] 1~100까지 정수 중 짝수의 합을 구하는 프로그램
    int even = 0;
    for (int i = 1; i <= 100; ++i)
    {
        if (i % 2 == 0)
        {
            even += i; // 짝수만...
        }
    }
    printf("1부터 100까지의 짝수의 합: %d\n", even);

    return 0;
}
1       2       3
4       5
1부터 100까지의 합: 5050
1부터 100까지의 짝수의 합: 2550

for 문과 같은 반복문은 if 문에 지정한 여러 연산자와 함께 쓰여 필요한 데이터만 필터링해서 가져오는 여러 가지 모양을 구현할 수 있습니다.

15.11 for 문을 사용하여 별표 기호로 삼각형 만들기

2개의 for 문을 사용하여 특정 문자열을 반복해서 출력하는 내용을 다루어 보겠습니다.

코드: for_triangle.c

//[?] for 문을 사용하여 별표 기호로 삼각형 만들기
#include <stdio.h>

int main(void)
{
    int i, j;

    for (i = 1; i <= 5; i++)
    {
        for (j = 1; j <= i; j++) // 행 번호에 맞게 별표 출력(1부터 5까지) 
        {
            printf("*");
        }
        printf("\n");
    }

    return 0;
}
*
**
***
****
*****

바깥 쪽 for 문은 일반적으로 행을 반복하는데 사용됩니다. 그리고 안 쪽 for 문은 열을 반복할 때 사용됩니다.

15.12 프로그램이 계속 실행되는 무한 루프 만들기

프로그래밍에서 무한 루프(Infinite Loop)는 루프(반복문)가 멈추지 않고 계속 실행하여 프로그램이 종료하지 않음을 말합니다. 잘못 작성된 코드에 의해서 무한 루프가 발생하면 프로그램에 심각한 문제가 발생합니다. 이번에 작성하는 프로그램은 실행하면 무한 루프가 발생하여 "무한 루프" 문자열을 계속해서 출력됩니다. 명령 프롬프트에서 무한 루프를 종료하려면 닫기 버튼을 클릭하거나 단축키로 [Ctrl + C]를 눌러 종료할 수 있습니다.

코드: infinite_loop.c

//[?] 무한 루프 만들기 
#include <stdio.h>

int main(void)
{
    // 무한 루프
    for ( ; ; ) // for 문에 아무런 코드를 표현하지 않으면 무한 루프 코드로 실행
    {
        printf("무한 루프\n");
    }

    return 0;
}
무한 루프
무한 루프
무한 루프
무한 루프
^C

위 실행 결과는 4개만 실행된 모양으로 보여지지만 실제로는 강제로 종료하기 전까지는 무한 루프 문자열이 계속 출력됩니다.

15.13 for 문을 사용하여 1부터 4까지의 팩토리얼 값을 출력하는 프로그램

for 문으로 약간 복잡한 수학의 팩토리얼 값을 구하는 예제를 다루어 보겠습니다. 팩토리얼이란 1부터 양의 정수 n까지의 정수를 모두 곱한 것을 말합니다. 1~4의 팩토리얼 값이라면 1 * 2 * 3 * 4의 결괏값인 24가 나옵니다.

코드: for_factorial.c

//[?] for 문을 사용하여 1부터 4까지의 팩토리얼 값을 출력하는 프로그램
#include <stdio.h>

int main(void)
{
    int fact = 0;

    for (int i = 1; i <= 4; i++) // 1부터 4까지 팩토리얼 구하기 
    {
        printf("%d! -> ", i);
        fact = 1; // 1로 초기화
        for (int j = 1; j <= i; j++) // 1부터 i까지 반복해서 곱해서 누적하기 
        {
            fact = fact * j; // (((1 * 1) * 2) * 3) * 4
        }
        printf("%2d\n", fact);
    }

    return 0;
}
1! ->  1
2! ->  2
3! ->  6
4! -> 24

팩토리얼을 구하는 방법은 굉장히 많이 있는데요. 가장 단순한 형태로 fact 변수에 1부터 n까지의 정수의 값을 곱해서 누적하는 방법이 있습니다. %2d 형태를 사용하여 2자릿수를 잡고 숫자를 출력하고 있습니다.

15.14 구구단을 가로로 출력하기

for 문을 2개 사용하는 예제를 소개하고자 합니다. 프로그래밍을 학습할 때 가장 많이 사용되는 구구단 프로그램을 세로로 출력하는게 아닌 가로로 출력하는 프로그램을 다음과 같이 작성해 볼 수 있습니다.

구구단

구구단을 가로로 출력하는 프로그램을 만들어보겠습니다.

코드: timestable.c

// 구구단 출력하기 
#include <stdio.h>

int main(void)
{
    for (int i = 2; i <= 9; i++)
    {
        printf("%4d단  ", i);
    }
    printf("\n");

    for (int i = 1; i <= 9; i++)        // 행 반복: 구구단 세로 출력
    {
        for (int j = 2; j <= 9; j++)    // 열 반복: 구구단 가로 출력
        {
            printf("%d*%d=%2d  ", j, i, j * i); // i와 j의 위치를 바꿔서 출력
        }
        printf("\n");                   // 1줄 출력 후 줄바꿈
    }

    return 0;
}
2단     3단     4단     5단     6단     7단     8단     9단
2*1= 2  3*1= 3  4*1= 4  5*1= 5  6*1= 6  7*1= 7  8*1= 8  9*1= 9
2*2= 4  3*2= 6  4*2= 8  5*2=10  6*2=12  7*2=14  8*2=16  9*2=18
2*3= 6  3*3= 9  4*3=12  5*3=15  6*3=18  7*3=21  8*3=24  9*3=27
2*4= 8  3*4=12  4*4=16  5*4=20  6*4=24  7*4=28  8*4=32  9*4=36
2*5=10  3*5=15  4*5=20  5*5=25  6*5=30  7*5=35  8*5=40  9*5=45
2*6=12  3*6=18  4*6=24  5*6=30  6*6=36  7*6=42  8*6=48  9*6=54
2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49  8*7=56  9*7=63
2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64  9*8=72
2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81

안쪽 for 문을 반복하면서 열을 반복하여 2부터 9까지를 먼저 반복하면서 i의 값인 1을 곱해서 2*1부터 9*1을 먼저 출력한 후 그 다음 행에서 3*2부터 9*2가 출력되는 형태로 구구단을 만들어 볼 수 있습니다.

15.15 장 요약

모든 프로그래밍 언어는 for 문과 같은 반복문을 가지고 있습니다. 컴퓨터는 사람과 달리 연산 처리가 굉장히 빠르기에 반복 사용되어야 하는 부분은 for 문을 사용하여 컴퓨터에게 프로그래밍을 시키면 효율적으로 빠르게 작업을 완료할 수 있습니다. 이러한 for 문과 비슷한 기능을 하는 추가적인 반복문들을 계속해서 학습해 나가도록 하겠습니다.

for 반복문으로 알파벳 순서대로 출력하기

코드: for_alphabet.c

//[?] for 반복문으로 알파벳 순서대로 출력하기 
#include <stdio.h>

int main(void)
{
    for (int i = 65; i <= 90; i++) // A(65)부터 Z(90)까지 반복
    {
        printf("%c", i); // ABCDEFGHIJKLMNOPQRSTUVWXYZ 
    }
    printf("\n");
    for (int i = 97; i <= 122; i++) // a(97)부터 z(122)까지 반복
    {
        printf("%c", i); // abcdefghijklmnopqrstuvwxyz 
    }
    printf("\n");
    for (char c = 'A'; c <= 'Z'; c++) // 'A'부터 'Z'까지 반복
    {
        printf("%c", c); // ABCDEFGHIJKLMNOPQRSTUVWXYZ 
    }
    printf("\n");

    return 0;
}
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ

C 언어 for 문 2씩 증가

for 반복문에서 2씩 증가할 때에는 i++ 대신에 i = i + 2 또는 i += 2를 사용할 수 있습니다.

코드: for_alphabet_2.c

//[?] for 반복문으로 알파벳 2씩 증가해서 출력하기 
#include <stdio.h>

int main(void)
{
    for (int i = 65; i <= 90; i = i + 2) // i++ 대신에 i = i + 2를 사용 2씩 증가 
    {
        printf("%c", i); // ACEGIKMOQSUWY 
    }
    printf("\n");
    for (int i = 97; i <= 122; i = i + 2)
    {
        printf("%c", i); // acegikmoqsuwy 
    }
    printf("\n");
    for (char c = 'A'; c <= 'Z'; c = c + 2)
    {
        printf("%c", c); // ACEGIKMOQSUWY 
    }
    printf("\n");

    return 0;
}
ACEGIKMOQSUWY
acegikmoqsuwy
ACEGIKMOQSUWY
VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com