[Rookiss C++] 반복문

황교선·2023년 3월 17일
0

cpp

목록 보기
6/19
  • 조건문은 유용하지만 특정 조건까지 계속 반복해야하는 상황은 처리 못함
    • ex) 게임을 끌 때까지 계속 게임을 실행하라
    • ex) 목적지에 도달할때까지 계속 이동하라

반복문

똑같은 명령을 일정 횟수만큼 반복하여 수행하도록 제어하는 명령문

  • 조건식이 참일 동안 반복문 내의 문장들을 반복함
  • 프로그램이 정상적으로 동작하지 않는 무한루프에 걸릴 수 있음

종류

  • for
  • while
  • do while

무한루프

반복문의 조건식에 반영되는 값이 변경이 되지 않을 때, 혹은 변경이 되더라도 그 값이 반복문을 빠져나오지 못하는 값일 때, 반복문이 영원히 돌게 되는 현상

반복문을 사용할 때 주의해야하는 점이 무한루프에 빠지지 않게 만들어야한다는 것이다. 초기식, 증감식, 조건식이 한 곳에 있어 보기 편한 for 문과 달리, while 문 같은 경우에는 조건식만 while 키워드 옆에 있다. 그래서 좀 더 주의가 필요하다.

for

  • 초기식, 조건식, 증감식을 포함하고 있는 반복문
  • 초기식, 조건식, 증감식이 꼭 있을 필요는 없음
  • 초기식을 사용할 경우, for 문 내에서만 사용하는 지역변수를 선언하며 초기화할 수 있음
  • 정해진 반복 횟수가 있다면 쓰기 좋음

문법

for (초기식; 조건식; 증감식)
		문장1; // 하나의 문장만 실행할 경우 { }를 쓰지 않아도 됨

for (초기식; 조건식; 증감식)
{
		문장1;
		문장2;
		//... // 여러 개 일 수 있음
}

조건문에서도 적어두었지만, 하나의 문장만 있더라도 { }를 사용하지 않고 쓰는 것을 추천하지 않는다. { } 를 사용하여 모든 코드 블록이 보이도록하여 가독성도 높일 수 있을뿐더러, 코딩하다보면 하나의 문장만 사용할 거라 생각해도 나중가서 문장이 추가되는 경우가 많기 때문이다.

순서

for 문을 제외한 다른 문법들의 순서는 그저 위에서 아래로 흘러간다고 생각하면된다. 하지만 for 문은 연달아 있는 초기식, 조건식, 증감식이 왼쪽에 있는 초기식부터 오른쪽에 있는 증감식까지 쭉 차례대로 실행하지 않는다. 순서는 다음 사진의 번호와 같고, 증감식을 수행한 이후에는 다시 2 → 3 → 4를 반복한다. 만약 증감된 후 조건식을 검사했을 때 거짓이라면 반복문을 탈출한다.

예제

#include <iostream>
using namespace std;

int main()
{
    for (int i = 0; i < 3; i++)
    {
        cout << "Hello World" << endl;
    }
}
// 출력 결과
// Hello World
// Hello World
// Hello World

코드에 대해서 간단히 설명하자면, for문이 실행되면서 i라는 정수를 담을 수 있는 변수 그릇이 생기고 그 안에 0이 담긴다. 그리고 조건식을 검사하고 0이 3보다 작기 때문에 참이라 for문 내의 문장들을 실행한다. 문장은 하나 밖에 없고 이는 “Hello World”를 출력하는 것이다. 출력을 완료하면 다음 실행할 문장이 없으므로, i++라는 증감식을 수행하여 i를 1로 만든다. i가 1일 때 또한 3보다 작기 때문에 “Hello World”를 출력하고 i를 1 증가시켜 2로 만든다. i가 2일 때 또한 3보다 작기 때문에 “Hello World” 출력하고 i를 1을 증가시켜 3으로 만든다. 3은 3보다 작다는 거짓이므로 반복문을 종료한다.

이런 코드의 흐름을 파악하기에 쉬운 방법은 IDE에서 중단점(Breakpoint)을 찍어 디버깅 모드로 한 단계씩 실행을 하며, 변수에 담겨있는 실제 값이나, 현재 프로그램이 실행하고 있는 라인(문장)이 어디인지 시각적으로 확인해가며 직접 확인해보는 것이다.

VS Code에서 중단점을 찍고 디버깅으로 실행한 모습

#include <iostream>
using namespace std;

int main()
{
    for (int i = 0; i < 4; i++) // 참일 때는 i = 0, 1, 2, 3
    {
        if (i == 0)
        {
            cout << "i : 0" << endl; // "i : 0"이라는 문자열을 출력
        }
        else if (i == 1)
        {
            cout << "i : " << i << endl; // 문자열 대신 i라는 변수의 값을 직접 출력
        }
        else if (i == 2)
        {
            cout << "i : 2" << endl; // "i : 2"이라는 문자열을 출력
            continue; // 맨 마지막 문장인 "Hello World"를 포함하여 현재 남은 문장들을 무시하고 다음 사이클로 넘어감
            cout << "after continue" << endl; // continue로 인해 출력이 안 되는 문장
        }
        else
        {
            break; // i가 0, 1, 2가 아닐 때 실행되는 break문. 즉 for문의 마지막 사이클 3일 때 여기에 들어가게 되어 마지막 사이클에는 "Hello World"가 출력되지 못함
        }
        cout << "Hello World" << endl; // i = 0, 1일 때 출력되는 문장
    }
}
// 출력 결과
// i : 0
// Hello World
// i : 1
// Hello World
// i : 2

continue, break는 이 글의 후반부에 설명해놓았다.

while

  • 루프에 진입하기 전에 먼저 조건식을 검사
  • 조건식이 참일 상태에서만 코드 블럭 내의 문장들을 반복 실행하고 거짓이 되는 순간 탈출

문법

while (조건식)
{
		문장1;
		문장2;
		//... // 여러 개 일 수 있음
}

예제

#include <iostream>
using namespace std;

int main()
{
    int a = 0; // for문의 초기식이라 볼 수 있음
    while (a < 5) // for문의 조건식이라 볼 수 있음
    {
        cout << a << endl; // 현재 a의 값을 출력
        a++; // for문의 증감식이라 볼 수 있음
    }
}
// 출력 결과
// 0
// 1
// 2
// 3
// 4

for문에 너무 빗대어 설명하긴 했지만, 결국 반복문을 조성하기 위해서는 조건식과 증감식이 필요한데, 조건식에서 사용하기 위한 변수가 이미 있고 그 값 자체를 사용해야한다면 굳이 초기식으로 변수를 생성하고 초기값을 설정할 필요는 없다. 이외에는 결국 반복문이라는 큰 틀이 for문과 동일하므로 큰 차이는 없다.

do while

  • 조건식이 참이 아니더라도 한 번은 반복문의 문장들을 실행
  • while ( ) 뒤에 세미콜론이 붙어야함

문법

do
{
		문장1;
		문장2;
		//... // 여러 개 일 수 있음
} while (조건식);

예제

#include <iostream>
using namespace std;

int main()
{
    int a = 0;
    do // 조건식을 검사하지 않고 바로 실행
    {
        cout << a << endl;
        a++; // 1, 2, 3, 4, 5까지 늘어남
    } while (a < 5); // a가 5가 되면 조건식이 거짓이므로 a가 5일 때 do while문을 빠져나옴

    do
    {
        cout << a << endl; // a가 5인 상태에서 들어왔으므로 5 출력
        a++; // a = 6
    } while (a < 5);

    cout << a << endl; // a는 6 출력
}
// 출력 결과
// 0
// 1
// 2
// 3
// 4
// 5
// 6

기타 제어문

  • 기타 제어문으로 break, continue, goto가 있음
  • break, continue, goto 문은 반복문의 흐름에 제어를 줄 수 있음

break

해당 반복문의 조건이 참이더라도 반복문을 종료시킴

  • 중첩 반복문이더라도 하나의 반복문만 종료시킴
  • switch 문의 case 탈출에서도 사용

continue

해당 사이클에서 남은 문장이 있더라도 그 즉시, 다음 사이클로 넘어감

goto

프로그램의 흐름을 지정된 레이블로 변경시키는 명령문

  • 현재 잘 사용하지 않는 키워드
  • 다른 제어문과 달리 아무론 조건 없이 프로그램의 흐름을 옮김
  • 잘 사용하는 것보다 스파게티 코드가 될 확률이 더 높음
  • 반복문 내 말고도 사용 가능

참고한 글

profile
성장과 성공, 그 사이 어딘가

0개의 댓글