C#의 switch문은 비교조건이 많은 경우와 같이 상황에 따라 복잡해질 수 있는 if...else if문의 완벽한 대안으로 사용될 수 있습니다.
이전에 우리는 if와 else문을 사용하여 Program의 실행흐름을 제어하는 방법에 대해 살펴보았는데 이때 살펴본 if...else if문은 비교조건이 적은 경우 구조적으로 아무런 문제 없이 동작할 수 있지만 그렇지 않다면 자칫 다루기 어려운 상황에 처해질 수 있습니다. C#에서는 C언어에서 파생된 switch문을 사용할 수 있으며 이를 사용해 복잡한 if...else if를 대체할 수 있습니다.
1. switch문이 필요한 상황
상술하였듯 비교조건의 값이 작은경우라면 if...else if문은 적절하게 사용될 수 있지만 분기되어야 하는 경우의 수가 셋 이상이 된다면 더 이상 쓰기도, 읽기도 어려운 code가 만들어질 수 있습니다. 아래 예제는 이러한 상황을 가정하여 만들어진 것으로 제품의 Code에 따라 보관되어야 하는 창고를 지정하고 있습니다.
string goodsCode = "A";
string wareHouse;
if ((string.Compare(goodsCode, "A") == 0) || (string.Compare(goodsCode, "B") == 0) || (string.Compare(goodsCode, "C") == 0))
wareHouse = "1번창고";
else if ((string.Compare(goodsCode, "D") == 0) || (string.Compare(goodsCode, "E") == 0))
wareHouse = "2번창고";
else if ((string.Compare(goodsCode, "F") == 0))
wareHouse = "3번창고";
else
wareHouse = "4번창고";
Console.WriteLine("Warehouse is " + wareHouse);
예제의 현재상태까지는 어느정도 봐줄 만 하지만 제품의 Code가 늘어날수록 if를 계속 추가하기가 어렵고 code자체를 읽기에도 어려워질 수 있습니다. 이런 상황에서 더욱 간결한 해결책이 필요하며 예제에서 그 대안으로 switch문을 적용해 볼 것입니다.
2. swicth문법
C#에서 switch문법은 아래와 같습니다.
switch([값]) {
case [비교값1]:
[실행문]
break/goto
case [비교값2]:
[실행문]
break/goto
default:
[실행문]
break/goto
}
switch문을 작성해 보기전 간단히 switch를 사용하는 방법을 간단히 짚어볼 필요가 있습니다. 문법예제에서 [값]은 말 그대로 비교할 값 또는 값을 반환하는 표현식이 올 수 있으며 switch문이 동작하는데 필요한 부분입니다. 상기 if문의 예제에서 [값]은 goodsCode에 해당합니다.
case문에서는 [값]과 일치하는 비교값이 올 수 있으며 if문의 예제에서 "A"나 "B"와 같은 실제 goodsCode가 나타내는 문자열에 해당합니다. 이때 각 case에 들어가는 값의 유형은 실제 값에 맞는 유형으로 모두 일치해야 합니다. [실행문]은 실제 실행될 C#구문에 해당하며 상기 case 비교값과 일치하는 경우에만 실행됩니다.
[실행문] 다음에는 break, goto와 같은 문이 올 수 있습니다. 이때 break의 경우 해당 문이 실행되면 switch문을 종료하게 되지만 goto문은 code의 실행시점을 다른 곳으로 이동시키는 역할을 수행합니다.
마지막으로 default부분은 값과 일치하는 case문이 없는 경우 실행되는 부분인데 필요없다면 생략할 수 있습니다.
3. switch문 작성하기
위에 사항들을 숙지했다면 이전에 제시한 그리고 약간 복잡해진 if...else if구조에서 개선에 필요한 일부 기능을 제공하는 switch문을 작성해 볼 수 있습니다.
string goodsCode = "A";
string wareHouse;
switch (goodsCode)
{
case "A":
case "B":
case "C":
wareHouse = "1번창고";
break;
case "D":
case "E":
wareHouse = "2번창고";
break;
case "F":
wareHouse = "3번창고";
break;
default:
wareHouse = "4번창고";
break;
}
Console.WriteLine("Warehouse is " + wareHouse);
예제에서는 우선 goodsCode변수에 "A"라는 문자열을 할당하고 있으며 이 변수는 아래 switch문에서 조건을 판단하는 데 사용됩니다. 또한 1번 창고의 case와 비슷하게 case문은 group 화하여 일련을 단일문 앞에 배치할 수 있습니다.
만약 경우에 따라 case와 일치하는 goodsCode가 없는 경우 default에 의해 wareHouse는 4번창고로 설정됩니다.
4. switch 표현식
상기 예제에서와 같이 switch문을 사용하면 일부 typing해야 하는 수고를 덜 수 있으며 읽기에도 쉬운 code를 작성할 수 있습니다. 하지만 C#은 여기에 그치지 않고 switch 표현식을 통해 code를 더 간소화할 수 있는 방법을 제공하고 있습니다. 해당 표현식에 대한 문법은 아래와 같습니다.
<입력변수> = <비교값> switch
{
조건1 => 실행문,
조건2 => 실행문,
조건3 or 조건4 or ... => 실행문
조건5 and 조건6 or 조건7 => 실행문
_ => default 실행문
}
위와 같은 방식으로 switch문을 사용하면 이전에 예제역시 더 간소화될 수 있습니다.
string goodsCode = "A";
string wareHouse;
wareHouse = goodsCode switch {
"A" or "B" or "C" => "1번 창고",
"D" or "E" => "2번창고",
"F" => "3번창고",
_ => "4번창고"
};
Console.WriteLine("Warehouse is " + wareHouse);
5. C# switch에서 goto문 사용하기
위 예제에서는 switch문을 나가기 위해(종료하기 위해) break문을 사용하였습니다. 그 결과 Program의 실행지점이 switch문 바로 다음문으로 이동하였습니다. 그런데 이러한 동작은 switch의 default에 있는 문을 실행해야 하는 경우라면 문제가 될 수 있습니다. 예제에서 이 문제를 해결하는 방법 중 하나는 break문대신 goto default문을 사용하는 것입니다.
string goodsCode = "E";
string wareHouse;
switch (goodsCode)
{
case "A":
case "B":
case "C":
wareHouse = "1번창고";
break;
case "D":
case "E":
wareHouse = "2번창고";
goto default;
case "F":
wareHouse = "3번창고";
goto default;
default:
wareHouse = "4번창고";
break;
}
Console.WriteLine("Warehouse is " + wareHouse);
goto는 또한 Code에서 명명된 위치로 이동하는데 사용될 수 있는데 이런 방식은 강력히 권장하지 않습니다. 위 예제에서의 사용방법은 C#과 같은 객체지향언어에서 그나마 용인될 수 있는 수준이지만 case를 벗어나는 jump문은 지향해야 합니다. goto문은 그냥 없다고 생각하십시오.
6. C# switch문에서 continue사용하기
break문의 다른 대안으로는 continue문이 있습니다. 만약 switch문이 loop의 일부분이라고 가정한다면 continue문은 loop가 즉각 다시 시작되도록 하는 동작을 반환하게 되며 현재 아직 실행되지 않은 loop문에서의 다음 code는 모두 우회하게 됩니다. loop문에서 contine를 사용하는 방법은 향후 loop문을 다룰 때 같이 알아볼 것입니다.
'.NET > C#' 카테고리의 다른 글
[C# 13과 .NET 9] C# 흐름제어개념과 if문 - 8 (0) | 2025.01.06 |
---|---|
[C# 13과 .NET 9] C# 연산자와 표현식 - 7 (2) | 2025.01.03 |
[C# 13과 .NET 9] C# 변수와 상수 - 6 (0) | 2024.12.05 |
[C# 13과 .NET 9] VSCode에서 App생성하기 - 5 (0) | 2024.12.05 |
[C# 13과 .NET 9] Visual Studio Code 둘러보기 - 4 (0) | 2024.11.27 |