profile image

L o a d i n g . . .

Unit 26. switch 분기문으로 다양한 조건 처리하기

switch 분기문은 형식이 균일하며 처리해야 할 조건이 많을 때 사용한다.

switch (변수)
{
case 숫자1:
    코드1
    break;
case 숫자2:
    코드2
    break;
default:
    코드3;
    break;
}

switch 분기문은 항상 case와 함께 사용하는데 변수의 값이 case에 지정한 값과 일치하면 해당 코드를 실행하게 된다. 그리고 아무 case에도 해당되지 않으면 default의 코드를 실행한다.

-> switch 분기문은 조건이 많아도 손쉽게 처리할 수 있다.

 

 

26.1 사용자가 입력한 값에 따라 문자열 출력하기

#define _CRT_SECURE_NO_WARNINGS    // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>

int main()
{
    int num1;

    scanf("%d", &num1);    // 값을 입력받음

    switch (num1)   // num1의 값에 따라 분기
    {
    case 1:         // 1일 때
        printf("1입니다.\n");
        break;
    case 2:         // 2일 때
        printf("2입니다.\n");
        break;
    default:        // 아무 case에도 해당되지 않을 때
        printf("default\n");
        break;
    }

    return 0;
}

switch의 괄호 안에는 먼저 값을 판단할 변수를 지정한다. 여기서는 scanf로 사용자의 입력을 받은 뒤 switch num1 변수를 지정했다. 그리고 case 1일 때, 2일 때 그리고 default로 아무 case에도 해당하지 않을 때 실행할 코드를 지정한다.

 

또 case 다음에는 반드시 값(리터럴)이 와야 하며 변수나 조건식은 올 수 없다. 그리고 case에 값을 지정했으면 : (콜론)을 붙여 준 뒤 다음 줄부터 실행할 코드를 입력한다. 또한, 코드의 마지막에는 break를 입력한다.

 

※ switch 문과 else if 문

조건식이 바뀌지 않고 값만 바뀔 때는 switch가 적합하며, 값과 조건식이 모두 바뀔 때는 else if가 적합하다.

 

 

26.2 case에서 break를 사용하지 않았을 때의 동작 알아보기

#define _CRT_SECURE_NO_WARNINGS    // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>

int main()
{
    int num1;

    scanf("%d", &num1);    // 값을 입력받음

    // switch의 case에서 break 삭제
    switch (num1)
    {
    case 1:    // 1일 때는 아래 case 2, default가 모두 실행됨
        printf("1입니다.\n");
    case 2:    // 2일 때는 아래 default까지 실행됨
        printf("2입니다.\n");
    default:
        printf("default\n");
    }

    return 0;
}

이것은 앞의 소스에서 break를 모두 삭제한 것으로, 실행 결과는 다음과 같다.

1 (입력)
1입니다.
2입니다.
default

case 1:만 실행될 줄 알았는데 case 2:, default:가 모두 실행되었다. 즉, case를 작성할 때는 마지막 부분에서 break로 중단해주어야 해당 case만 실행된다. 

 

 

26.3 case에서 break 생략 응용하기

#define _CRT_SECURE_NO_WARNINGS    // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>

int main()
{
    int num1;

    scanf("%d", &num1);    // 값을 입력받음

    switch (num1)
    {
    case 1:    // 1 또는
    case 2:    // 2일 때 코드 실행
        printf("1 또는 2입니다.\n");
        break;
    case 3:    // 3 또는
    case 4:    // 4일 때 코드 실행
        printf("3 또는 4입니다.\n");
        break;
    default:
        printf("default\n");
    }

    return 0;
}

실행 결과는 다음과 같다.

1 (입력)
1 또는 2입니다.

case에서 break를 생략하는 상황은 버그 같지만 실제로는 많이 사용되는 방식이다.

이렇게 case 1: case 2:를 연달아서 지정하면 num1의 값이 1일 때도 코드가 실행되고 2일 때도 코드가 실행된다. 즉, case에서 break를 생략하면 여러 가지 값으로 같은 코드를 실행할 수 있다.

 

 

26.4 case 안에서 변수 선언하기

#define _CRT_SECURE_NO_WARNINGS    // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>

int main()
{
    int num1;

    scanf("%d", &num1);    // 값을 입력받음

    switch (num1)    // num1의 값에 따라 분기
    {
    case 1:
    {   // case에서 변수를 선언하려면 중괄호로 묶어줌
        int num2 = num1;
        printf("%d입니다.\n", num2);
        break;
    }
    case 2:
        printf("2입니다.\n");
        break;
    default:
        printf("default\n");
        break;
    }

    return 0;
}

switch case에 들어가는 코드가 길어지다 보면 변수를 선언하기도 한다.

case에서 변수를 선언하려면 다음과 같이 { } (중괄호)로 묶어주면 된다.

단, 중괄호 안에 선언된 변수는 해당 case 안에서만 사용할 수 있고 다른 case switch 바깥에서는 사용할 수 없다.

 

 

26.5 switch 문에서 판별할 수 있는 자료형 알아보기

#define _CRT_SECURE_NO_WARNINGS    // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>

int main()
{
    char c1;

    scanf("%c", &c1);     // 값을 입력받음

    switch (c1)  // c1의 값에 따라 분기
    {
    case 'a':    // 문자 a일 때
        printf("a입니다.\n");
        break;
    case 'b':    // 문자 b일 때
        printf("b입니다.\n");
        break;
    default:    // 아무 case에도 해당되지 않을 때
        printf("default\n");
        break;
    }

    return 0;
}

switch에서 판별할 변수는 정수 자료형만 사용할 수 있고, 실수 자료형(float, double)은 사용할 수 없다. 단, 문자 자료형(char)도 정수 자료형이므로 switch에서 사용할 수 있다.

 

※ 파이썬과의 차이점 : C와 달리 파이썬에는 switch 문이 존재하지 않아, 항상 if else로 조건문을 처리해야 한다.

 

 

 

Unit 27. for 반복문으로 Hello, world! 100번 출력하기

C 언어의 for 반복문은 다음과 같이 괄호 안에 초기식, 조건식, 변화식을 지정한다.

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

 

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

 

 

27.1 for 반복문 사용하기

#include <stdio.h>

int main()
{
    for (int i = 0; i < 100; i++)    // 0부터 99까지 증가하면서 100번 반복
    {
        printf("Hello, world!\n");
    }

    return 0;
}

간단하게 Hello, world!를 100번 출력하는 코드이다.

for 반복문의 괄호에 초기식, 조건식, 변화식을 지정하였고, 중괄호 안에 반복할 코드를 넣었다.

 - 초기식: 반복문을 시작할 때 초기식이다. 보통 정수형 변수를 선언한 뒤 0을 할당한다. 반복에 사용할 변수는 초기식 부분에서 선언해도 되고, for 반복문 바깥에서 선언해도 된다.

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

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

 

 

27.2 초깃값의 변화 알아보기

#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;
}

for 반복문이 끝난 뒤에 변수 i의 값을 출력해보면 10이 나온다. 왜냐하면 i가 10이 되었을 때 조건식 i < 10은 거짓이 되므로 그때 반복이 끝나기 때문이다.

 

 

27.3 초깃값을 1부터 시작하기

#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;
}

 

사실 결과적으로 100번만 출력할 수 있다면 어떤 초깃값으로 시작하더라도 상관이 없다. 따라서 여기서는 초기식이 int i = 1이지만 조건식에서 i가 100보다 작거나 같을 때까지만 반복하므로 100번 출력한다. 

 

 

27.4 초깃값을 감소시키기

#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;
}

위와 같이 초깃값을 크게 주고, 변수를 감소시키면서 반복할 수도 있다.

초깃값이 100이고, 변화식에서 i--로 지정하여 반복을 할 때마다 변수를 1씩 감소시켰다. 그리고 조건식이 i > 0이므로 100에서 1까지 감소시켜서 100번이 된다.

 

* for 반복문은 if 조건문과 마찬가지로 끝에 ;(세미콜론)을 붙이면 안된다.

* for 반복문으로 반복할 코드가 한 줄이라면 중괄호는 생략할 수 있다.

 

 

27.7 입력한 횟수대로 반복하기

#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;
}

위 코드는 입력한 횟수대로 반복을 한다. scanf함수로 입력 값을 받아서 count 변수에 저장했다. 그리고 for 반복문의 조건식에서 i < count와 같이 지정하여 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;
}

i를 따로 선언하지 않고, count를 그대로 사용할 수도 있다.

 

 

27.8 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;
}

다음은 for 반복문에서 변수를 두 개 사용하고, 변수의 증가 폭을 다르게 만들어본 것이다.

각 상황에 맞게 연산자를 사용하여 변수의 증가 폭을 조절하고, 변수 여러 개를 제어할 수 있다.

 

 

27.9 for 반복문으로 무한 루프 만들기

#include <stdio.h>

int main()
{
    for (;;)    // 초깃값, 조건식, 변화식을 모두 생략하면 무한 루프
    {
        printf("Hello, world!\n");
    }

    return 0;
}

for에서 초깃값, 조건식, 변화식을 모두 생략하면 무한히 반복하는 무한 루프가 만들어진다.

 

※ 파이썬과의 차이점 : for문에서 파이썬과 c의 문법적인 차이점이 존재한다. 파이썬의 경우 보통 for문과 iterator(반복 가능한 객체)를 같이 써서 반복 가능한 객체만큼 반복한다. 그리고 c의 경우 for 문에 초기값, 조건식, 변화식을 적어주므로써 반복 횟수를 지정할 수 있다.

 

 

Unit 28. while 반복문으로 Hello, world! 100번 출력하기

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

while 반복문은 괄호 안에 조건식만 들어가고, 초기식은 반복문 바깥에 있다. 그리고 중괄호 안에 반복할 코드와 변화식이 함께 들어간다.

 

 

28.1 while 반복문 사용하기

#include <stdio.h>

int main()
{
    int i = 0;
    while (i < 100)    // i가 100보다 작을 때 반복. 0에서 99까지 증가하면서 100번 반복
    {
        printf("Hello, world!\n");
        i++;           // i를 1씩 증가시킴
    }

    return 0;
}

먼저 반복문에 사용할 변수 i를 선언한 뒤 0으로 초기화 한다. 그리고 while에는 조건식만 지정하면 된다.

이때 while 반복문은 반드시 { } (중괄호) 안에 변화식을 지정해야 한다. 만약 조건식만 지정하고 중괄호 안에서 변화식을 생략하면 반복이 끝나지 않고 계속 실행(무한 루프)되기 때문이다.

 

* 반대로 초깃값을 크게 주고, 변수를 감소시키면서 반복할 수도 있다.

 

 

28.5 입력한 횟수대로 반복하기

#define _CRT_SECURE_NO_WARNINGS    // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>

int main()
{
    int count;

    scanf("%d", &count);    // 값을 입력받음

    while (count > 0)    // count가 0보다 클 때 반복
    {
        printf("Hello, world! %d\n", count);
        count--;         // count를 1씩 감소시킴
    }

    return 0;
}

scanf 함수로 입력 값을 받아서 count 변수에 저장한 뒤 조건식에서 count > 0와 같이 지정하여 count에 들어있는 값만큼 반복하도록 하였다. (물론 i를 선언해서 써도 된다.)

 

 

28.6 반복 횟수가 정해지지 않은 경우

다음은 while 반복문 안에서 무작위로 정수를 생성한 뒤 3이 나오면 반복을 끝낸다.

#include <stdio.h>
#include <stdlib.h>    // srand, rand 함수가 선언된 헤더 파일
#include <time.h>      // time 함수가 선언된 헤더 파일

int main()
{
    srand(time(NULL));    // 현재 시간값으로 시드 설정

    int i = 0;
    while (i != 3)         // 3이 아닐 때 계속 반복
    {
        i = rand() % 10;   // rand 함수를 사용하여 무작위로 정수를 생성한 뒤 10 미만의 숫자로 만듦
        printf("%d\n", i);
    }

    return 0;
}

실행 결과는 다음과 같다.

2
9
9
4
0
3
↑ 무작위 생성이므로 실행할 때마다 달라짐

먼저 무작위로 정수를 생성하려면 srand, rand, time 함수가 필요하다(무작위로 정수를 생성하는 행동을 난수 생성 또는 랜덤이라고도 함).

 - srand: 난수를 발생시킬 초깃값인 시드(seed)를 설정한다. 보통 현재 시간값을 사용한다.

 - rand: 난수를 발생시킨다.

 - time: 정수 형태로 된 현재 시간값을 반환한다.

 

실행 결과를 보면 정수가 무작위로 생성되므로 실행을 할 때마다 반복 횟수가 달라지는 것을 볼 수 있다.

이처럼 while 반복문은 반복 횟수가 정해져 있지 않을 때 유용하다.

 

 

28.7 while 반복문으로 무한 루프 만들기

#include <stdio.h>

int main()
{
    while (1)    // while에 1을 지정하면 무한 루프
    {
        printf("Hello, world!\n");
    }

    return 0;
}

while에서 조건식 대신 1을 지정하면 무한히 반복하는 무한 루프가 만들어진다.

무한 루프를 만들 때 다음과 같이 1대신 불값인 true를 넣을 수도 있다.

복사했습니다!