Unity/문법

[Unity] if문과 switch case 문

turbulence93 2025. 4. 14. 21:16

if문과 switch case문에 대한 강의를 듣던 도중 아래 코드와 같이 사용하면 9와 10을 동시에 처리 할 수 있다고 배웠다.

 static void Main(string[] args)
 {
     int num = 10;

     switch (num) 
     {
         case 10:
         case 9:
             Console.Write("9이상");
             break;
         case 8:
             Console.Write("8");
             break;
         default:
             break;
     }
 }

 

case 10의 내용과 break를 써주지 않으면 num 9와 10은 같은 결과를 도출한다고 한다.

 

이 구조가 아래의 if문과 비슷해보여서 몇가지 의문점이 생겼다.

static void Main(string[] args)
{
    int num = 10;

    if(num == 10)
    {
        Console.Write("9이상");
    }
    if (num == 9)
    {
        Console.Write("9이상");
    }
}

물론 위 코드는 9 이상이라는 로그가 두번 찍히지만 else 처리를 하지 않는다면 다음 코드를 방문하게 되는점이 비슷해 보였다. 

 

다시 본론으로 돌아와서 case 10 의 내용을 추가하고 break를 넣지 않는다면 num 10은 위 if문처럼 case 10도 수행하고 자연스럽게 넘어가 case 9도 수행하는지 실험해 보았다.

 

위 상황에서 C++은 fall through 현상이 발생해 한번 실행된 코드로부터 break를 만날때까지 조건이 부합하지 않아도 다음 case들이 실행이 된다고 한다.

하지만 C#에서는 CS0163 : 다른 case 레이블로 제어를 이동할 수 없다는 컴파일 에러가 발생한다.

그렇다면 C#에서는 위 if문과 같은 결과값을 도출 하려면 어떻게 해야 될까?
바로 goto case 라는 코드를 이용하면 된다.

 static void Main(string[] args)
 {
     int num = 10;

     switch (num) 
     {
         case 10:
             Console.Write("10");
             goto case 9;
         case 9:
             Console.Write("9");
             break;
         case 8:
             Console.Write("8");
             break;
         default:
             break;
     }
 }

위와 같이 코드를 작성하게 되면 case 10에 도달하고 case 9까지 실행하여 위 if문과 같은 값을 도출 할 수 있다.

 

여기까지 오자 goto case 뒤에 상수를 변수로 제어할 수 있을까? 라는 생각을 해보았다.
case 10의 경우 next라는 int형 변수를 통해 이동할 case를 제어한다면 재밌을거 같다는 생각이 들었는데 아쉽게도 불가능했다.

왜냐면 switch 문은 상수만 사용이 가능하기 때문인데, default를 사용하여 예외처리가 가능함에도 변수 사용이 금지된 이유가 궁금해졌다.

 

그렇다면 왜 변수 사용이 안되는 걸까?

 

이유인 즉슨, switch문 같은 경우 컴파일시 점프 테이블을 생성한다고 한다. 점프 테이블은 switch 내부에 case들을 미리 테이블로 만들어 case를 바로 찾을수 있어 O(1)의 속도가 나온다고 한다. 그렇기 때문에 변수가 들어가면 테이블을 생성할 수 없어 변수는 사용할 수 없는 것이였다.

이유를 알고보니 같은 결과를 도출하여도 if문 보다는 switch문이 더 속도가 빠를거 같다는 생각이 들었다. if문의 경우 코드 첫줄부터 순서대로 실행되기 때문에 O(n)의 속도를 가지는데 switch문의 경우 점프 테이블로 인해 O(1)의 속도가 나오니 성능면에서 훨씬 좋을거 같단 생각이 든다. 대신 점프 테이블을 미리 생성해야되니 switch문은 로딩 시간이 좀 더 들지 않을까 싶다.
if문과 switch문의 차이점과 장단점을 알았으니 게임을 만들때 상황에 맞춰 사용하면 좀 더 최적화 된 게임이 될 것 같다.


추가 내용

 

점프 테이블 최적화는 case 값이 연속적인 정수일 경우에만 가능하다고 한다.
예를 들어 case 1, 2, 3처럼 연속된 정수는 점프 테이블 최적화 대상이지만,
case 10, 20, 30처럼 간격이 있는 값은 점프 테이블이 생성되지 않는다.

 

참고로, 2, 4, 6처럼 사람에게는 일정한 규칙(2의 배수)으로 보이는 값들도
컴파일러에게는 연속적인 값이 아니므로 점프 테이블 최적화 대상이 아니다.

즉, 수학적으로 규칙이 있어 보여도 컴파일러는 '연속'이 아니면 점프 테이블로 인식하지 않는다.

 

따라서 switch문이 항상 O(1)이라고 단정짓기보다는,

if-else 또는 이진 탐색 트리 방식으로 처리되어 O(log n) 이나 O(n) 이 될 수도 있다는 점을 명심하자.