C언어 기초 5일차 : 반복문과 분기문

bitterpotato·2020년 8월 30일
0

C언어 기초

목록 보기
5/7

반복문


영어로는 루프문이라고도 한다.

유사한 동작을 반복 실행하는 것이 필요할 때 주로 사용하는 구문이다.


C언어에서의 반복문


C언어에서 반복문은 for, while, 그리고 do-while문이 기본적으로 존재한다.


1) for


for문은 주로 정해진 횟수를 반복할 때 유용하다.

for (int i = 0; i < 5; i++) 
    반복할 구문();

여기에서 int i = 0; 부분을 초기식이라 부르고, i < 5; 부분을 조건식, i++ 부분을 변화식이라고 부른다.

초기식은 일반적으로 반복문의 조건과 관련한 변수를 생성 또는 초기화 할 때 사용되고 주로 int i = 0; 처럼 정수형 변수를 생성하는 식을 주로 사용한다. 물론 미리 선언한 변수를 사용할 때 i = 0; 처럼 초기화만 시켜주어도 된다.

조건식은 반복될 조건을 나타내며, 조건식이 참일 경우 반복하고, 거짓일 경우 반복문을 끝낸다.

변화식은 반복문이 한 번 실행될 때마다 수행할 식이다. 보통 증가 연산자 ++를 사용하여 변수의 값을 1씩 증가시키거나 감소 연산자 --를 이용해 변수의 값을 감소하는 형태로 사용한다.

반복할 문장이 여러개일 경우 if문처럼 중괄호로 묶어주면 된다.

for (초기식; 조건식; 변화식) {
    반복할 구문 1();
    반복할 구문 2();
    ...
}

이를 통해 무한정으로 반복하는 반복문도 만들 수 있는데, 아래와 같이 작성하면 된다. (권장하지는 않는다)

for (;;) {
    반복할 구문 1();
    반복할 구문 2();
    ...
}

더 나아가, for문은 초기식을 실행하고 반복할 구문을 실행하고 변화식을 실행한 후 조건이 참인지 거짓인지 판단한 후 참일 경우 또 다시 반복할 구문을 실행하고 변화식을 실행하는 과정으로 반복한다.

참고 : 실행되고 있는 프로그램을 강제 종료하는 단축키는 ctrl + c이다.


2) while


주로 for 문이 아닌 반복문을 쓸 때 사용한다.

기본 꼴은 아래와 같다.

while (조건) {
    반복할 구문 1();
    반복할 구문 2();
    ...
}

조건은 if 문에서 조건을 작성하는 것과 동일하다.

물론 반복할 구문이 한 문장일 경우 아래와 같이 간소화해서 작성할 수 있다.

while (조건)
    반복할 문장();

while 문의 실행 과정은 조건이 참인지 거짓인지 판단하고 참일경우 루프 내부의 문장을 실행한 후 또 다시 조건을 판단하는 과정으로 반복된다.


3) do-while


do-while문은 while문과 달리 문장을 실행한 후 조건을 판별한다. (따라서 애초에 조건을 충족하지 않더라도 적어도 1회는 실시한다는 것이 큰 차이점이다)

기본 꼴은 아래와 같다.

do {
    반복할 구문 1();
    반복할 구문 2();
    ...
} while (조건);

조건은 if 문에서 조건을 작성하는 것과 동일하며, 반복할 구문이 한 문장일 경우 아래와 같이 작성할 수 있다.

do
    반복할 문장();
while (조건);

do-while 문은 위에서 언급한 바와 마찬가지로 루프 내부의 문장을 먼저 실행한 후 조건을 판별하고 참일경우 루프 내부 문장을 실행하는 방식으로 반복한다.


4) break


하나의 루프를 탈출하는 구문이다.

예시를 참조해 보자.

for (;;)
    break;

위의 소스코드를 분석해 보면 break; 없이 for(;;)만 존재할 경우 무한 루프에 빠지게 된다.

하지만 break;가 존재함으로서 무한 루프에 빠지지 않고 바로 빠져나올 수 있게 할 수 있다.

일반적으로 if문과 엮여 어떤 조건을 만족했을 때 루프를 빠져나오게 하는 용도로 이용된다.


분기문


분기문이란 조건에 따라 굉장히 다양한 분기로 나뉘는 구문을 말한다.


사용법


switch-case문으로도 불리며, 아래와 같이 사용한다.

switch (조건) {
    case 첫번째 경우:
        실행할 구문1();
        실행할 구문2();
        실행할 구문3();
        실행할 구문4();
        ...
        break;
    case 두번째 경우:
        실행할 구문1();
        실행할 구문2();
        실행할 구문3();
        실행할 구문4();
        ...
        break;
    ...
    default: // 어떠한 경우도 만족하지 않았을 경우
        실행할 구문1();
        실행할 구문2();
        실행할 구문3();
        실행할 구문4();
        ...
        break;
}

실행할 구문의 마지막에 break;를 넣어주지 않을 경우 아래의 분기까지 참인지 거짓인지 모두 탐색하기 때문에 비효율적이고, 또 이로 인한 오류가 발생할 수 있다.

또한, 여기서 default는 생략 가능하다.


예제를 살펴보면서 더욱 더 정확히 이해해 보자.

#include <stdio.h>
int main() {
    char a = 'Y';
    switch (a) {
        case 'Y':
            printf("This is Y");
            break;
        case 'Z':
            printf("This is Z");
            break;
        default:
            printf("Nothing");
            break;
    }
}

참고


코딩 도장. (2016). https://dojang.io/mod/page/view.php?id=206.


Special Thanks


LJLee37 (Github : https://github.com/LJLee37, Twitch : https://www.twitch.tv/ljlee37)

profile
개발자 망생이

0개의 댓글