Prosto

switch case문(조건문2) 이해, 예제 -C언어 본문

Programing/C Programing

switch case문(조건문2) 이해, 예제 -C언어

Prosto 2016. 9. 29. 14:36

 

'Switch 전환하라, Case 주어진 상태에따라.'

 

 

저번에 조건문으로 가장 대표적인 if문을 봤었죠?

 

 

이번 시간에는 그 if문과 비슷한 역할을 하는 switch문(switch case문)에 대하여 알아보도록 하겠습니다.

 

이 switch문은 경우에 따라 if문보다 더 적합한 때가 있습니다.

바로 몇 가지 선택지가 주어지고, 그에 대한 선택을 할 때죠.

("1. 프로그램 실행, 2. 대기, 3. 종료"처럼 선택지가 몇 가지 있다면 말이죠. )

 

게임으로 예를 들어볼까요?

시뮬레이션 게임에서 대화에 따라 몇 가지 대답을 선택해야 할 때가 있죠?

이렇게 여러가지의 선택지가 정해져 있고, 그 제한된 범위 내에서만 선택된다면,

switch case문에 적합한 겁니다. (if문보다 확실히 묶여있게 소스도 보기 좋고요.)

 

switch문의 기본적인 형태를 보면 아래와 같습니다.

switch( 판단할 값 ) {

    case 숫자:

        //실행내용

        break;

  default:

        //실행내용
}

이렇지만, case 숫자: 부분은 0, 1, 2, 3, ... 같은 숫자들을 쭉 열거할 수 있습니다.

 

    case 1:

        //실행내용

        break;

    case 2:

        //실행내용

        break;

이렇게 늘어나는 거죠.

 

 

그리고 case에 없다면, default 부분을 실행하게 됩니다.

 if/else문에서는 else역할인 거죠?

 

 

->아까 그 게임의 대화 선택은 이런 식으로 처리할 수 있겠네요.

switch( 대화 선택 번호 ) {

    case 1:

        //시나리오 4-1 진행

        break;

    case 2:

        //시나리오 4-2 진행

        break;

  default:

        //시나리오 4-3 진행
}

 

 

그리고 보면 아시겠지만,

  case 1:

    //그리고 내용.

    break;

 

이렇게 마지막에 break;가 위치하고 있는 게 보이실 겁니다.

이 break의 유무에는 무슨 차이가 있을까요?

예제에서 switch case문의 기본형태와 이 break에 대하여 확인해보도록 합시다.

 

 

그럼 예제입니다.

 

 1을 입력한다면 "안녕하세요.", 2를 입력한다면 "반갑습니다.",

 그 외의 숫자를 입력한다면 "감사합니다."를 출력하는 프로그램을 보도록 하겠습니다.

가장 중요한 부분은 체크된 switch case문 부분이죠?

num을 통하여 입력받은 숫자를 비교하고 있습니다.

그 숫자가 1이면 "안녕하세요."

그 숫자가 2이면 "반갑습니다."

그 외엔 "감사합니다."가 출력되도록 작성되어있습니다.

 

결과를 확인해볼까요?

 

 

1으로 입력했을 때의 출력 결과입니다.

"안녕하세요."만 출력되고 프로그램이 끝났죠?

 

2를 입력했을 때의 출력 결과입니다.

"반갑습니다."만 출력되고 프로그램이 끝났죠?

 

이번엔 3을 입력했을 때의 출력 결과입니다.

"감사합니다."만 출력되고 프로그램이 끝났죠?

 

(3뿐이 아니라 다른 숫자로 그런지 확인해볼까요? 5입력)

 

 

예상한 대로 결과가 잘 나왔나요?

1과 2는 case로 등록해줬기 때문에 각각의 문구가 출력되고,

3, 5는 case에 없는 값이기 때문에 default에 있는 문구가 출력됐죠?

 

 

그렇다면 여기서 추가적인 궁금증!

case 밑에 break;를 빼보면 어떤 결과가 나올까요?

 

먼저 case 1, case 2 모두 break;를 빼보겠습니다.

(주석 처리로 프로그램 실행 시 제외시켰죠?)

 

break;가 없을 때의 결과를 볼까요?

 

1을 입력했더니,

1,2,그 외의 숫자를 입력해야 나오는 결과가 모두 나왔네요.

 

그럼 2를 입력하면 어떻게 나올까요?

2를 입력했더니,

2와 그 외의 숫자를 입력하면 나오는 결과들이 나왔네요.

 

그럼 마지막으로 그 외의 숫자는요?

3을 입력해보니(그 외의 숫자 아무거나)

원래 의도했던 결과인 "감사합니다."만 출력되네요.

 

break;가 빠지니 의도와 다른 결과를 확인할 수 있습니다.

break; 역할이 어떤 것인지 눈치채셨나요?

우리가 하나 더 확인해보면 확실하게 알 수 있을 것 같네요.

 case 1에 있는 break;만 주석으로 프로그램에서 빼볼까요?

어떤 결과가 예상되나요?

 

1을 입력했을 때 어떻게 나올까요?

1을 입력했더니

1일 떄의 출력 결과와, 2일 때의 출력 결과가 나왔습니다.

이를 토대로 확인해보니,

 

switch case문에서는 위에서부터 순차적으로 확인해가고,

그 대상과 맞는 case를 발견한다면 그 case를 실행시킨다는 점

break;가 없다면 그 아래까지 쭉 실행시킨다는 점이네요.

(그래서 default의 내용은 실행되지 않고 1->2(break)까지 실행된 거겠죠?)

 

 

(추가로 break는 해당 부분에서 중지시키는 기능이 있다는 점을 확인할 수 있죠?)

 

그리고 2를 입력했더니,

원래대로 예상했던 결과가 나오는 것을 확인할 수 있습니다.

 

 

이제 switch case문의 형태와

중간중간 위치한 break의 역할을 아시겠나요?

 

 

 

 그럼 이제 실제로 문제를 풀어보며 익혀보도록 합시다.

몇 가지 문제를 드릴테니 공부하시는 분들은 한번씩 해보시길 바라겠습니다.

(각각의 완성 소스는 밑에 있으니 비교해보세요.)

 

 

문제 1. 사용자에게 숫자를 선택하라고 하여, 1을 입력받으면 "축구", 2를 입력받으면 "농구", 3을 입력받으면 "야구", 4를 입력받으면 "배구", 그 외에는 "배드민턴"이 출력되도록 프로그램을 만드시오.

 

(출력 예1 : 1입력)

 

(출력 예2 : 3입력)

 

(출력 예3 : 5입력)

 

문제 2. 문자 비교도 숫자 비교처럼 하면 됩니다! (문자는 char, %c 아시죠?)

     사용자에게 문자 하나를 입력받아, 문자가 'A'이면 "안녕", 'B'이면 "잘가", 'C'이면 "고마워", 그 외에는 "ㅎㅎ"이 출력되도록 프로그램을 만드시오.

 

(출력 예1 : A입력)

(입력에 scanf_s를 사용한다면,

문자 혹은 문자열을 입력받는 경우 길이를 알려줘야합니다.

문자는 한 글자니 1이겠죠?)

scanf_s("%c", &ch, 1); 같은 식입니다.

 

(출력 예2 : C입력)

 

(출력 예3 : Z입력)

 

 

 

문제 3. 사용자에게 숫자를 입력받아, 숫자가 3이면 "안녕"이 세 줄, 2이면 "안녕"이 두 줄, 1이면 "안녕"이 한 줄, 그 외에는 "잘가"가 출력되도록 프로그램을 만드시오.(출력 예 참고, switch case문만 사용)

 

(출력 예1 : 3입력)

 

(출력 예2 : 2입력)

 

(출력 예3 : 9입력)

 

 

 

//완성 소스 + 약간의 설명

-1번 문제

10번 라인 - switch (num)을 통해서 입력받은 숫자를 대상으로 비교하려고 합니다.

비교하여 각 case 1, 2, 3, 4에 맞는 결과를 출력해주고,

나머지 값에 대해서는 default를 통하여 "배드민턴"을 출력해줍니다.

 

 

 

-2번 문제

위의 문제와 같은 문제죠?

 

다른 점이라고 하면 입력받을 때 문자 형태로 받았다는 점과(6번 라인)

 

switch case에서 case별로 비교할 때

문자이기에 'A', 'B'와 같이 입력하여 비교했다는 점이죠?

 

 

 

-3번 문제

이번 문제는 조금 어려울 수 있는 문제였습니다.

센스가 많이 필요했죠?

얼핏보면 for문이나 while문 반복문을 써야할 것 같았지만,

그렇다면 4 5 6 같은 숫자에도 마찬가지 반복을 해야하는데,

그 외의 숫자에서는 "잘가"를 출력하라는 문제였으니 고민이 좀 됐으리라 생각됩니다.

 

소스를 보면 case에 1 2 3 순서대로 쓸 필요도 없다는 것을 확인할 수 있죠?

break;를 만날 때까지 내용을 실행하니,

3은 총 3번, 2는 총 2번, 1은 1번, 그리고 나머지엔 다른 값이 출력되죠.

 

 

 

 

프로그래밍 작성 요령과 switch문 이해에 도움이 되었다면 좋겠네요.

 

 

질문은 댓글이나 메일로 따로 연락주시면 시간되는 때 답변드리겠습니다. ( 연락 <여기에 메일주소 있습니다.)

Comments