Unity_사전캠프

[사전캠프 5일차] switch case문, 그리고 if문(+반복문 맛보기)

전기연(Unity_9기) 2025. 3. 21. 18:38

1. 오늘 학습 키워드

switch case문을 익히고, 이걸 if문으로도 전환할 예정이다.

2. 오늘 학습 한 내용을 나만의 언어로 정리하기

step 1. Switch Case란 무엇인가?

 

switch case문은 사실, 3일 차에 한 번 맛보기를 했었다.

계산속도가 빠른 것이 장점이고, 특정 조건을 넣는 것보다는 숫자를 입력해서 그에 맞는 정보를 출력하는 일에 적합한 함수이다.

매번 변칙적인 상황에서 사용하기에는 부적합해 보이지만, '1번부터 4번까지 중에 선택하세요'를 처리할 때는 편해 보인다.

switch case문의 구조는 다음과 같다.

 

Switch case의 기본 구조 (코드 1)

더보기

string input = Console.ReadLine();

int x;
bool xB = int.TryParse(input, out x);
//위는 x에 정수값을 넣기 위한 사전 작업이다. 2일 차에 배운 이후에 꾸준히 나오고 있다.

// true/false 값을 구하고 있는 것이 아니므로 int x=int.Parse(input); 을 사용해도 된다. 상황에 따라 알맞은 형변환을 사용할 것.


switch (x)
{
    case 1: //입력값이 1일 때 출력된다.

        Console.WriteLine();
        break; //각 case마다 반드시 break;를 붙여 해당 케이스를 끝내주어야 한다.

    case 2: //입력값이 2일 때 출력된다.
        Console.WriteLine(); 
        break; 

    default:  //입력값이 1과 2 외의 다른 수, 혹은 다른 데이터일 때 출력된다.
        Console.WriteLine();
        break;

}

문자를 입력하면 default 값이 나온다.

 

 

step 2. Switch Case를 이용해 간단한 문제를 만들어보자.

조건 1. case문을 활용한 코드 작성

조건 2. 조건 1과 같은 기능을 하는 if문 작성

switch case가 무엇인지 가볍게 살펴봤으니, 이제 이걸 실제로 사용해서 문제를 만들어볼 것이다.

우선 문제를 최상단에 출력하고, 답을 누르면 정답과 오답을 처리할 수 있도록 만든다. 만약 선택지 외의 번호를 입력할 경우, '잘못된 입력입니다'를 출력하도록 만들 것이다.

 

코드 2-1.

더보기

Console.WriteLine("Q. 대한민국의 수도는 어디인가요?");
Console.WriteLine("1. 인천    2. 평창    3. 서울    4.부산");
Console.WriteLine("응답:");

//처음 출력되는 문장 입력.

string input = Console.ReadLine();
int x=int.Parse(input);

switch (x)
{
    case 1: 
        Console.WriteLine("오답입니다.");
        break;

    case 2: 
        Console.WriteLine("오답입니다."); 
        break;

    case 3:
        Console.WriteLine("정답입니다!");
        break;

    case 4:
        Console.WriteLine("오답입니다.");
        break;

    default: 
        Console.WriteLine("잘못된 입력입니다.  1~4까지의 숫자를 입력해주세요. ");
        break;

}

코드 2를 보면, 어라, 이거 꽤 길다.

사실 긴 것도 긴 것이지만, Console.WriteLine("오답입니다."); 문장이 세 번이나 반복된다. 

위와 같은 기능을 하도록 if문으로 만들어보겠다.

 

코드 2-2.

더보기

string input = Console.ReadLine();
int x;
bool xB=int.TryParse(input, out x); //입력값의 참거짓을 확인하는 조건을 넣을 것이므로 TryParse 사용

if (xB) //입력값이 숫자인지 1차 확인하는 조건
{
    if (x == 3)
    {
        Console.WriteLine("정답입니다!");
    }
    else if(x > 0 && x < 5) // 0<x<5 로 범위를 잡아 0이나 5의 값을 읽어내지 않도록.
    {
        Console.WriteLine("오답입니다!");

//x가 3일때도 이 조건에 부합하지만, x==3의 조건에서 먼저 출력되었으므로 작동하지 않음.
    }
    else //1, 2, 3, 4 의 수를 제외한 다른 수를 입력했을 때의 출력
    {
        Console.WriteLine("잘못된 입력입니다. 1~4까지의 숫자만 입력해주세요.");

    }
}
else //입력 데이터가 숫자가 아닌 경우 출력
{
    Console.WriteLine("숫자가 아닙니다.");
}

정답에 해당하는 값을 입력했을 때
문자를 입력했을 때

 

아니면 이런 방법도 있다. x의 범위문을 상위에 올리고, 그 안에 if문을 한 번 더 넣는 것이다.

 

if (xB)
{

    if (x >= 1 && x <= 4) //범위 설정. (x > 0 && x < 5)라고 작성해도 정수범위이므로 문제 없다.
    {
        if (x == 3) //두개의 조건을 거치고 x가 3이라면 먼저 작동.
        {
            Console.WriteLine("정답입니다!");
        }
        else //그 외의 1, 2, 4의 답
        {
            Console.WriteLine("오답입니다!");
        }
    }
    else // 1부터 4까지의 응답이 아닌 경우
    {
        Console.WriteLine("1~4 의 숫자를 입력해주세요.");
    }
}
else //숫자도 아닌 경우
{
    Console.WriteLine("숫자가 아닙니다.");
}

같은 명령어를 반복적으로 입력할 필요도 없고, 숫자가 아닐 때까지 걸러낼 수 있어서 if문이 더 편한 것 같다. 

심지어 case문의 출력은 1, 2, 3, 4 같은 숫자로만 이루어지기 때문에, if문에서 조건 설정도 그렇게 까다롭지 않다.

그렇다, switch case문은 if문으로 완벽하게 대체될 수 있는 것이다!

 

step 3. Switch Case의 활용법

조건 1. case 1부터 4까지 전부 다른 응답이 출력되도록 작성.

조건 2. default에서 조건을 재구분하여 또 다른 응답을 출력한다.

 

그럼 switch case는 왜 쓰는 걸까? 그냥 if문 쓰면 될 텐데.

if문이 조건이 늘어나면 늘어날 수록 좀 복잡하게 보이긴 하겠지만, 저정도면 못 쓸 것도 없어보인다.

하지만, 그렇다면, 1번부터 4번까지의 응답을 전부 '다르게' 뽑아야 한다면 어떨까?

각 번호에 다른 응답을 붙이고, 또한, case문에서도 문자가 들어올 경우 "숫자가 아닙니다."라는 응답을 띄우도록 만들어보자.

코드 3.

더보기

switch (x)
{
    case 1: 
        Console.WriteLine("인천은 대한민국의 수도가 아닙니다.");
        Console.WriteLine("인천은 대한민국의 광역시로, 수도인 서울과 가까운 곳이긴 하지만 수도는 아닙니다.");
        break;

    case 2: 
        Console.WriteLine("평창은 대한민국의 수도가 아닙니다.");
        Console.WriteLine("대한민국 강원특별자치도 중남부에 위치한 군입니다. 2018 동계 올림픽이 열린 곳이기도 합니다.");
        break;

    case 3:
        Console.WriteLine("정답입니다!");
        Console.WriteLine("서울은 서울특별시라는 이름의 대한민국의 수도입니다.");
        break;

    case 4:
        Console.WriteLine("부산은 대한민국의 수도가 아닙니다.");
        Console.WriteLine("부산은 대한민국의 광역시로, 한반도의 남동부에 위치하고 있습니다.");
        break;

    default:
        if (xB)
        {
            Console.WriteLine("1부터 4까지의 숫자를 넣어주세요.");
        }
        else
        {
            Console.WriteLine("입력값이 숫자가 아닙니다.");
        }
            break;

}

결과

 

 

 

 

출력이 잘 되는 걸 확인할 수 있다. 

전부 같은 내용이 출력되는 것이 아니니 불필요한 코드가 없어졌다.

오히려 케이스 1, 2, 3, 4로 나뉘니 보기 편하다.

저걸 if로 바꾼다면, if(x==1), else if(x==2), else if (x==3)……등 각자 다른 조건문을 달아야 하니 길어지고, 그 조건문들을 일일히 읽어봐야하니 시간도 걸리게 된다.

즉, switch case 문은 정확한 값에 따라 각자 다른 응답을 출력할 때 비로소 그 빛을 발하는 것이다!

 

코드 3-2. (if문으로 바꿔본 결과물이다.)

더보기

if (xB)
{
    if (x == 1)

//case 를 만들어두면, 숫자가 입력될 경우 자동으로 해당 번호의 case로 들어가는 case문과는 달리, 조건마다 1, 2, 3, 4를 입력해줘야 한다.
    {
        Console.WriteLine("인천은 대한민국의 수도가 아닙니다.");
        Console.WriteLine("인천은 대한민국의 광역시로, 수도인 서울과 가까운 곳이긴 하지만 수도는 아닙니다.");
    }
    else if(x == 2)
    {
        Console.WriteLine("평창은 대한민국의 수도가 아닙니다.");
        Console.WriteLine("대한민국 강원특별자치도 중남부에 위치한 군입니다. 2018 동계 올림픽이 열린 곳이기도 합니다.");
    }
    else if (x == 3)
    {
        Console.WriteLine("정답입니다!");
        Console.WriteLine("서울은 서울특별시라는 이름의 대한민국의 수도입니다.");
    }
    else if (x == 4)
    {
        Console.WriteLine("부산은 대한민국의 수도가 아닙니다.");
        Console.WriteLine("부산은 대한민국의 광역시로, 한반도의 남동부에 위치하고 있습니다.");
    }
    else
    {
        Console.WriteLine("1부터 4까지의 숫자를 넣어주세요.");
    }
}
else
{
    Console.WriteLine("입력값이 숫자가 아닙니다.");
}

결과

기능은 문제없이 잘 작동한다.

작동은 잘 하지만, 중괄호와 중괄호와 중괄호의 연속이다.

어느쪽이든 편한 쪽을 쓰면 좋겠지만, 능숙해지면 적재적소에 쓸 줄 아는 것도 능력이 될 것이다.

번외 코드 (여행을 떠나요!)

더보기

위까지는 걷기반 2-5의 내용이다.

그런데 2-6의 내용도 여기서 바로 작성가능 할 것 같으므로, 바로 아래에 코드로 풀어본다. 조건은 이미지와 같다.

위의 조건에 맞춰서, 내용이 출력되도록 작성해보도록 하겠다.

코드 3의 구조를 그대로 사용하면 된다!

 

//여기서부터 코드 시작 

 

Console.WriteLine("어디로 여행을 가고 싶나요?");
Console.WriteLine("1.제주도   2.코타키나발루   3.싱가포르   4.태국");
Console.WriteLine("응답:");
string input = Console.ReadLine();

 

int x;
bool xB;
xB=int.TryParse(input, out x);

switch (x)
{
    case 1:
        Console.WriteLine("〈제주도〉");
        Console.WriteLine(""제주도는 한국의 섬으로 비교적 방문이 쉽고 다양한 놀거리 / 먹거리가 준비되어 있습니다."");
        break;

    case 2:
        Console.WriteLine("〈코타키나발루〉");
        Console.WriteLine(""코타키나발루는 말레이시아 사바주의 주도로, 말레이시아 동부 보르네오섬 최대의 도시입니다."");
        break;

    case 3:
        Console.WriteLine("〈싱가포르〉");
        Console.WriteLine(""싱가포르는 동남아시아, 말레이 반도의 끝에 위치한 섬나라이자 항구 도시로 이루어진 도시 국가입니다."");
        break;

    case 4:
        Console.WriteLine("〈태국〉");
        Console.WriteLine(""태국은 중국문화, 말레이문화, 불교문화, 힌두문화, 이슬람 문화가 혼재되어 있습니다. 불교적인 모습을 많이 띄지만, 문화 자체는 색다르고 스펙트럼이 넓은 형태를 띄고 있어요."");
        break;

    default:
        if (xB)
        {
            Console.WriteLine("1부터 4까지의 숫자를 넣어주세요.");
        }
        else
        {
            Console.WriteLine("입력값이 숫자가 아닙니다.");
        }
            break;
}

 

 

 

step 4. Bonus Time! Do-While 문을 써봅시다

조건 1: Do-while은 무엇인가?

조건 2: .Length는 또 무엇인가?

 

사실 case문만 하고 끝내려고 했는데, 시간이 남아서 가볍게 맛보기를 하려고 한다.

Do-while. 영어의 의미만 보고 유추하자면 '해라. ~동안.' 이라고 말하는 것 같다. 그렇다, 반복문이다.

while의 조건에 맞아떨어질 때까지 실행을 반복하는 조건 반복문이다.

그럼 .Length는 무엇인가? 길이? (정답)

길이 측정하는 놈이다. 다만 1cm, 2cm가 아니라 문자가 몇 글자인지 보는 역할이다.

익숙한 예시를 들자면, 비밀번호 생성할 때 마주하는 '암호를 8자~16자로 작성해주세요' 같은 곳에서 쓰는 명령어이다.

 

그럼 이번엔 일정 글자수 내에 이름(닉네임)을 적으면 출력해주고, 그렇지 않으면 범위 내에서 다시 작성해달라고 요청하도록 만들어볼 것이다.

 

코드 4-1. 우선 이름 길이를 판단하고, 조건에 맞춰 다른 응답을 처리하도록 만들자

더보기

Console.WriteLine("이름을 입력해주세요. (3~10글자)");
string name = Console.ReadLine(); //입력하는 것이 이름이므로 name 으로 명명
int nameL = name.Length; //글자 수 측정 코드

if(nameL>=3 && nameL <= 10)
{
    Console.WriteLine("안녕하세요! 제 이름은"+name+"입니다");
}
else
{
    Console.WriteLine("이름을 확인해주세요.");
}

 

적정 범위가 아니면 이름확인을 요청한다.

코드 4-1. 을 진행하면, 재입력은 불가능하다. 아직 반복문을 만들지 않은 탓에, 다시 키를 입력하면 창이 닫히게 될 뿐이다.

 

그럼, 이제 제대로 이름을 적을 때까지 반복해서 재입력이 가능하도록 만들어볼 것이다.

 

코드 4-2.

 

더보기

bool nameB; // true와 false 값을 이용해 반복문을 중지할 것이다.

do
{

//계속 반복할 부분들을 넣어준다. 어차피 데이터 입력은 첫 1회는 반드시 할 것이다.
    Console.WriteLine("이름을 입력해주세요. (3~10글자)");

    string name = Console.ReadLine();
    int nameL = name.Length;

    if (nameL >= 3 && nameL <= 10) //글자수는 3자 이상 10자 이하이다.
    {
        Console.WriteLine("안녕하세요! 제 이름은" + name + "입니다");
    }
    else //조건에 맞지 않을 때
    {
        Console.WriteLine("이름을 확인해주세요.");
    }
    nameB = nameL >= 3 && nameL <= 10;

    //우리가 원하는 조건과 동일하게 맞춰주자. 해당 조건을 충족할 때, nameB로 명명한 불리언이 true가 된다.
}
while (!nameB);

//nameB에 값이 적용 되어 true가 되면 멈춘다. !nameB의 의미는, nameB 가 false인 동안은 계속 해당 구간을 실행 시킨다는 뜻이다.

 

 

작성 결과, 조건에 맞는 이름이 나올 때까지 반복해서 입력할 수 있도록 만들어준다.

문제는, 계속해서 밑으로 길어진다는 것이다. 처음 한 두번이면 몰라도, 다섯 번 여섯 번 반복하면 끝없이 길어질 것이다.

그럼, 잘못된 값을 쓰면, 콘솔에 썼던 내용이 지워지도록 만들어 보자.

Console.Clear();  를 쓰면 화면에 떠있던 글이 사라진다!

 

코드 4-3.

더보기

bool nameB;


do
{
    Console.WriteLine("이름을 입력해주세요. (3~10글자)");

    string name = Console.ReadLine();
    int nameL = name.Length;

    if (nameL >= 3 && nameL <= 10)
    {
        Console.WriteLine("안녕하세요! 제 이름은" + name + "입니다");
    }
    else
    {
        Console.Clear(); //코드 4-2에서 추가된 코드.
        Console.WriteLine("이름을 확인해주세요.");
        //Console. Clear();가 여기 들어갈 경우, "이름을 확인해주세요"가 출력되자마자 다시 지워진다.

    }
    nameB = nameL >= 3 && nameL <= 10;
}
while (!nameB);

'1회'라고 작성하자 조건에 맞지 않아서 '이름을 확인해주세요'를 출력하고, 다시 입력창이 뜬다.

 

이렇게하면 글들이 계속 반복해서 출력되지 않고, 원하는 데이터를 넣을 때 멈출 수 있게 된다.

3. 학습하며 겪었던 문제점 & 에러

특별한 문제점은 없었다. do-while부분에서 살짝 헤매긴 했지만, 큰 오류 없이 해냈다.

그러니 오늘 학습한 내용들을 요약정리하고, 특히 헷갈릴 수 있는 부분을 강조해보도록 하겠다.

 

1. case 1개당 break; 는 필수이다.

2. switch case문은 모두 if 문으로 교체가 가능하다.

3. switch case문은 정해진 버튼에 각자 다른 내용이 출력될 때 유용하다.

4. switch 문 안에도 if문이 들어갈 수 있다.

5. .Length 를 이용하면 string 문자열에 들어간 글자수를 셀 수 있다.

6. do while문에서, while() 의 괄호 안에 들어갈 내용은 '완료 조건'이 아니라 '반복시키는 조건'이다. 

    (예시: while(x<10); 일 경우, x가 10 미만인 한 계속 do-while문을 반복한다.)

4. 내일 다음 주에 학습할 것은 무엇인지

오늘 가볍게 맛본 do-while은 반복문이다.

하지만 반복문은 하나가 아니다.

반복문에는 for문, while문, do while문 의 세 종류의 반복문이 있다.

다음 주에는 반복문을 더 살피고 활용해볼 것이다.