반복문 - for

Date:     Updated:

카테고리:

이건 또 무슨 반복문일까

  • while문을 사용해 봤다면 알 법한 문제이지만, while은 분명 조건식을 기반으로 제어할 수 있지만, 지정 횟수만큼 반복하기 위해선 추가적인 변수가 필요하다는 단점이 있었다. for문은 이 경우 요긴하게 사용할 수 있는 문법이며, for문 자체적으로 내부에서 사용 될 변수를 선언할 수 있기 때문에 자료의 순회 등 요긴하게 사용될 수 있다. 먼저 아래는 while문을 사용해 지정 횟수만큼 방복하는 코드이다.
int main()
{
    int count = 0; // 반복문을 끝내기 위해 필요한 카운팅용 변수
    int repeat = 20;

    while (count < repeat)
    {
        std::cout << "반복문 실행" << std::endl;
        ++count;
    }
}
  • 분명 동작은 하지만 while만을 위해서 존재하기엔 애매한 변수인 것이 맞다. 이제부터 for문을 어떻게 사용할 수 있는지 살펴보며, while과 차이점을 숙지하고 각 문법이 어떤 상황에 사용하면 좋을 지 생각해보자.

어떻게 사용할까

  • for문은 처음 접하는 사용자의 입장에서는 다소 난해한 문법으로 다가올 수 있다. 그도 그럴 것이 조건문, while 반복문과는 달리 선언하는 과정에서 (처음 볼 때는)복잡한 수식이 들어가기 때문이다. 다만 어디까지나 처음 볼 때의 기준이고, 익숙해지면 자신도 모르게 for문을 사용하고 있는 것을 발견할 수 있을것이다.
    핵심적인 요소는 for(초기값 설정; 조건식; 증감식) 으로 이뤄진다. 내부적으로 반복문 제어에 사용 될 데이터를 초기값 설정에서 선언하고, 조건식에 따라 종료해야 할 지 판단하며, 증감식을 통해 데이터를 변화시킨다. 바로 코드를 한번 살펴보자.
int main()
{
    int repeat = 10;

    // 초기값을 0으로 초기화
    // 선언된 변수의 데이터가 'repeat'변수보다 작아야 실행된다.
    // 증감식을 사용해 데이터에 1씩 더한다.
    for (int i = 0; i < repeat; ++i)
    {
        std::cout << i << "번째 출력" << std::endl;
    }
}
  • 결과 :
    • forStatement_01
  • 심플하고 정확하게 10번 반복 후 종료되었다. 위 코드가 동작한 순서를 나열하면
    1. for문이 실행되며 내부에 int타입의 변수가 선언되고, 데이터는 0으로 지정되었다
    2. 조건식의 결과가 true라면(for문 내부의 변수가 repeat 변수의 값보다 작다면) 내부의 로직을 수행한다. false라면 종료한다.
    3. 내부 로직 수행 후 증감식을 적용(for문 내부의 변수에 1을 더한다)
    4. 2, 3번을 반복한다
  • 위와 같은 과정이 반복되었다. 그렇기 때문에 ‘0번째 출력’부터 ‘9번째 출력’까지 정상적으로 출력이 된 것이다. 위에서 언급했듯이 처음 볼 때 복잡해 보이는 것 뿐, while문 제어를 위해 필요했던 추가적인 변수와 증감식을 선언과 동시에 함께 선언한 것만 다를 뿐 내부적으로 동작하는 과정은 아주 심플하다.

continue, break

  • for도 while과 마찬가지로 반복문이기 때문에 continuebreak키워드를 통해 내부에서 제어할 수도 있다. while 포스팅에서와 마찬가지로 홀수만 출력하는 코드를 구성해 보겠다. 추가적으로 for문의 조건식이 만족이 다 되지 않았더라도 break를 통해서 반복문을 종료해 보겠다.
int main()
{
    for (int i = 0; i < 100; ++i)
    {
        // 'i % 2'가 0이라면 (i가 짝수라면)
        if (i % 2 == 0)
        {
            // 이번 루틴은 스킵
            continue;
        }

        // i가 11 이상이라면
        if (i >= 11)
        {
            // 반복문 중지
            break;
        }

        std::cout << i << std::endl;
    }
}
  • 결과 :
    • forStatement_02

또 다른 사용 방법은 없는가

  • 위에서 작성된 예시 코드는 for문을 선언하며 내부적으로 사용될 변수를 같이 선언했다. 하지만 이런 것도 가능하다.
int main()
{
    int num = 5;

    for (num; num < 10; num++)
    {
        // 이게 됩니다
    }

    std::cout << num;
}
  • 결과 :
    • forStatement_03
  • …이런것도 된다. for문 자체적으로 변수를 선언하지 않고 외부에서 선언된 변수를 사용하고, 반복문 종료에는 변수 원본 데이터에 증감식이 적용되어 있는 것까지 확인 가능하다. 이 외에도 for문에서 사용되는 변수는 int 타입이 아니어도 되므로, 여러가지 테스트를 병행해보기 바란다.

주의할 점은 없는가

  • 당연히 있다. for문 자체가 (초심자 입장에서는)가독성이 좋은 문법은 절대로 아니다, 때문에 아래와 같은 실수도 종종 하게 될것이다.
int main()
{
    for (int i = 100; i <= 100; --i)
    {
        // i가 100 이하라면 로직 실행 및 반복.
        // 초기값은 100이며 증감식은 1씩 뺀다.
        // 즉, (컴퓨터가 살아있는 한)영원히 실행된다.
    }
}
  • 때문에 for문을 사용할댄 초기값과 증감식, 그리고 조건식이 어떻게 설정되어 있는지 확인하고, 내부적으로 어떻게 구동될 지 미리 예측해보는 습관이 들면 좋다.

이 외에도

  • while문 포스팅에서와 마찬가지로 반복문은 분명 편리한 프로그래밍 문법이지만, 잘 못 사용하거나 필요 이상으로 사용하게 될 경우 프로그램의 성능에 큰 영향을 끼칠 수 있는 요소이다. 따라서 반복문이 꼭 사용되어야 하는지, 그리고 이상하리만큼 반복문의 단계가 깊어지지는 않는 지 반드시 고려해보길 바란다.

댓글 남기기