본문 바로가기
[ Program ]/c#스터디

19.조건문(분기문) , bool형식 , 논리연산자3 - switch

by 관이119 2021. 9. 20.





조건문에는 if 문 외에 switch 문도 있다.

전체 형식은 다음과 같다.

 

변수

switch(변수)

{

       case 비교대상값(상수):

              실행할내용

              break;

       case 비교대상값(상수):

              실행할내용

              break;

       default:

              실행할내용

              break;

}

 

위 형식만으로는 이해가 잘가지 않을테니 예제를 한번 보자.

 

int a = 10;

switch( a )

{

        case 10:

            MessageBox.Show("a의 값은 10입니다.");

            break;

        case 20:

            MessageBox.Show("a의 값은 20입니다.");

            break;

        default:

            MessageBox.Show("a의 값은 10입니다.");

            break;

}

 

일단 위예제를 실행하면 10이 나오는데 하나씩 뜯어보자.

최초 a 라는 변수를 선언후 switch 에 지정해준다.

그후 case 에 switch 에 지정된 변수와 하나씩 일치하는지 비교하면서 같으면 실행하고 다르면 다음 체크할값으로 넘어가서 다시 비교하는 형식이다.

마지막 default 는 if 의 else 와 같은 형식인데 어떤 조건에도 걸리지 않으면 실행되는 내용이다.

마찬가지로 default 는 뺄수 있는값이며 , case 도 원하는 만큼 추가할 수 있다.

그리고 case 나 default 뒤에 내용을 넣은후에는 반드시 break를 써줘야한다.

 

그런데 위쪽 형식에서 case 뒤에는 상수가 와야된다고 써놨는데 상수란 이때까지 배운 변수의 반대되는 개념이다.

이제까지 우리는 int a = 10; 이라고 만들어두면 뒤에 a = 20; 이런식으로 값을 변경해줄수 있었다.

상수는 저런형태로 값을 변경해줄수 없는 정해진 수이다.

즉 위 예제에서 case 10: 이라고 코딩해놓으면 프로그램이 실행되는도중(런타임) 에는 저값을 변경할수 없다.

변경하려면 프로그램을 종료하고 코드를 바꾸고 다시 빌드해야한다.

(참고로 보통 프로그램 런타임중에 값을변경할수 없게 만든소스를 하드코딩했다고 한다.)

하지만 우리가 int a = 10; 이라고 해두고 텍스트박스에서 값을 받아와서 a 에 값을 넣어두는 식으로 소스를 만든다면 a의 값은 런타임중에도 얼마든지 변경될수 있는것이다.

 

상수는 "const 형식 상수명 = 값;" 과 같은형식으로 만드는데 아래 경로를 한번 읽어보자.

docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/classes-and-structs/how-to-define-constants

 

C#에서 상수 정의 방법

컴파일 시간에 값이 설정되는 필드인 C#에서 상수를 정의하는 방법에 대해 알아봅니다. 상수를 사용하여 특수 값에 의미 있는 이름을 제공합니다.

docs.microsoft.com

결국 변수는 일반적으로 프로그램할때 사용하는 무슨값이든 담을수 있게해놓은 공간을 말하는것이고,

상수는 특정값넣어놓은 공간을 말하는것이다.

 

즉 switch - case 에서 사용하는 비교대상 값은 고정된 값이어야한다.

아래 예제는 상수를 사용해서 switch 문을 사용한 예제이다.

const int num1 = 10;

int a = 10;

switch ( a )

{

        case num1:

              MessageBox.Show("10");

              break;

        case 20:

              MessageBox.Show("20");

              break;

}

 

상수를 정의해서 비교한것과 숫자를 하드코딩해서 비교한 case 를 두가지다 표시해놓은예제인데 이해가 될거라고 생각한다.

 

 

그래서 전체적으로 보면 switch 는 if 문에 비해 유연성이 상당히 떨어진다.

switch 문에서는 if (a > 10) 과 같은 형태의 식을 만들수가 없다.

만약 저런형태를 switch 에서 사용하려면 들어갈 값들을 예상해서 case 에서 모두 적어줘야한다.

 

그리고 위에서 case 마다 break를 붙여줘야 한다고 했는데 예외경우가 있다.

다음예제를 보자.

const int num1 = 10;

int a = 10;

switch ( a )

{

        case num1:

        case 20:

              MessageBox.Show("number");

              break;

        case 30:

              MessageBox.Show("number30");

              break;

}

이경우는  a 가 10 이거나 20일때 number이라는 메세지를 출력한다.

이렇게 여러가지조건을 하나의 행동을 할때 break 를 빼주면 바로밑에 있는 break 까지 실행한다.

 

 

만약코드가 아래와 같다면 어떤일이 벌어질까?

const int num1 = 10;

int a = 10;

switch ( a )

{

        case num1:

              MessageBox.Show("number10");

        case 20:

              MessageBox.Show("number");

              break;

        case 30:

              MessageBox.Show("number30");

              break;

}

위의 경우는 number10 과 number 가 두번연속으로 출력된다.

break 를 만약위와 같이 실수로 빼먹으면 의도 하지않게 이상동작을 하게 되버리는데 그런 실수한 경우를 여러곳에서 상당히 많이 봤다.

만약 switch 를 사용할경우는 꼭 break 를 신경써야한다.

 

 

개인적으로는 switch 보다 확실히 if 를 선호하는 편이다.

개인적으로 생각할때 오류가 생길확률이 적고 유연하기 때문이다.

하지만 프로그램은 혼자 하는것이 아니기 때문에 꼭 여러 방법들을 다 알아둬야한다.

특히 분기문 같은경우는 엄청 중요하기 때문에 누가 어떤방법으로 분기문을 써도 알아볼수 있도록 꼭 둘다 외워둬야한다.

 

 

***숙제 : 텍스트박스에 사람 이름을 넣고 버튼을 누르면 스터디에 속한 사람인지 팝업창에 출력해주는 프로그램을 만들어보자.(switch 문 사용)

댓글