[C#] switch 문과 when 절, 그리고 switch 식

2022. 3. 13. 15:27Languages/C#

*이 글은 <이것이 C#이다> 책을 바탕으로 공부한 글입니다.

 

 

조건문은 논리적인 프로그램을 작성하는 데 필요한 부분이다. if, else if, else 문과 함께 switch 문이라는 것도 배우게 된다. switch 문에 사용되는 조건식은 정수 형식문자열 형식만 지원을 한다.

 

C# 7.0부터는 데이터 형식을 조건으로 사용할 수도 있게 된 것 같다.

 

 

데이터 형식 사용 예

object obj = 123;   // Boxing

switch (obj)
{
   case int i:     // obj에 담겨 있는 데이터 형식에 따라 case절 분기
       ...
       break;
   case float f:
       ...
       break;
   default:
       ...
       break;
}

 

데이터 형식에 따라 분기할 때는 case 절에서 데이터 형식 옆에 반드시 식별자를 붙여줘야 한다.

하지만 switch 문을 사용하면서 불편한 점이 있었는데, if 문처럼 검사 과정에서 조건을 체크할 수 없다는 점이었다.

하지만, C#에서는 when이라는 키워드를 지원하여 이러한 부분을 해결할 수 있다.

 

 

when을 사용하여 추가적인 조건 검사 사용 예

object obj = 123;   // Boxing

switch (obj)
{
   case float f when f >= 0:    // obj가 float 형식이며, 0보다 크거나 같은 경우
       ...
       break;
}

 

테스트를 해봤는데, 일반적인 경우에도 사용이 가능한 것 같다.

int a = 5;

switch (a)
{
    case 5 when a < 0:
        Console.WriteLine(a);       // 조건이 맞지 않아 출력되지 않음
        break;
}

 

 

switch 식

 

switch 문을 좀 더 축약해서 간략하게 쓸 수도 있다. 식이기 때문에 계산 결과를 내놓는다.

그렇기 때문에 분기를 거쳐 값을 내야 하는 경우에는 switch 문보다는 switch 식이 낫다.

 

원래라면 다음과 같이 분기문을 작성했을 것이다.

int input = Convert.ToInt32(Console.ReadLine());

int score = (int)(Math.Truncate(input/10.0) * 10);
// 1의 자리 버림 eX) 92 -> 90

string grade = "";

switch (score)
{
    case 90:
       grade = "A";
       break;
       
    case 80:
       grade = "B";
       break;
       
    case 70:
       grade = "C";
       break;
       
    case 60:
       grade = "D";
       break;
       
    default:
       grade = "F";
       break;
}

 

 

그런데, 이걸 좀 더 축약해서 switch 식으로 간략하게 표현할 수 있다.

  • case ":"  👉🏻  "=>"로 변경
  • switch 문의 조건식은 switch 키워드 앞으로
  • break 절은 작성하지 않으며, 각 케이스는 콤마(,)로 구분
  • default 키워드는 '_'
int input = Convert.ToInt32(Console.ReadLine());

int score = (int)(Math.Truncate(input/10.0) * 10);

string grade = score switch
{
    90 => "A",
    80 => "B",
    70 => "C",
    60 => "D",
    _ => "F"
};

 

switch 식에서도 when 절을 이용하여 추가적인 분기 처리가 가능하다.

int score = (int)(Math.Truncate(input/10.0) * 10);
bool repeated = true;


string grade = score switch
{
    90 when (repeated) => "B+",  // score가 90이어도 repeated가 true이면 B+
    80 => "B",
    70 => "C",
    60 => "D",
    _ => "F"
};

 

 

728x90
반응형