C#

[C#] Switch, 반복문, 점프문

sunlight-dby 2025. 4. 10. 23:20

 

'이것이 C#이다 개정판'의 chapter 5를 정리한 글입니다.

 


 

Switch문(Statement)

C#에서의 'Switch 문'은 오로지 정수 형식 하나만 지원하는 C와 C++과 다르게 문자열 형식과 데이터 형식 또한 지원합니다.

 

[예시]

using System;
using static System.Console;

namespace Switch
{
    class MainApp
    {
        static void Main(string[] args)
        {
            object obj = null;

            string s = ReadLine();

            if (int.TryParse(s, out int out_i))
                obj = out_i;
            else if (float.TryParse(s, out float out_f))
                obj = out_f;
            else
                obj = s;

            switch (obj)
            {
                case int i:
                    WriteLine($"{i}는 int 형식입니다.\n");
                    break;
                case float f:
                    WriteLine($"{f}는 float 형식입니다.\n");
                    break;
                default:
                    WriteLine($"{obj}(은)는 모르는 형식입니다.\n");
                    break;
            }
        }
    }
}

예시 코드의 결과

 

[ TryParse( ) ]

TryParse( ) 메서드는 문자열을 특정 데이터 타입으로 변환하려고 시도합니다.
변환이 성공하면 true를 반환하고, 실패하면 false를 반환합니다.

데이터_타입.TryParse(변수명, out 데이터_타입 변수명)

 

 

메서드의 원형에서 'out 데이터_타입 변수명' out 매개변수로 불립니다.

out 매개변수는 변환된 값을 저장하기 위해 사용되며, 변환이 실패하면 이 값은 해당 타입의 기본 값이 됩니다.

 

※ 기본값은 out 매개변수의 데이터 타입마다 다릅니다.

     정수형 : 0  /  실수형 : 0.0  /  문자형 : '₩0' (널 문자)  /  논리형 : false  /  참조형 : null

 

TryParse( ) 메서드는 변환이 실패해도 예외를 발생시키지 않으므로, 안전하게 사용이 가능합니다.

그렇기에 사용자 입력 등 불확실한 데이터 변환에 사용 하는 것이 적합한 메소드입니다.

 

[ Parse( ) ]

Parse( )메서드는 문자열을 특정 데이터 타입으로 변환합니다.

데이터_타입.Parse(변수명)

 

Parse( )메서드는 변환이 실패할 경우, 'FormatException' 예외를 발생시킵니다.

반환이 실패할 경우 예외가 발생되기 때문에, 신뢰할 수 있는 데이터 변환에 사용하는 것이 적합한 메소드입니다.

 

[ when절 ]

when절은 switch 문과 catch 문 등에서 조건부 로직을 추가하는데 사용되는 기능입니다.

when절을 사용하여, 특정 조건을 만족할 때만 해당 케이스를 실행하거나 특정 예외를 처리할 수 있습니다.

 

[예시 : switch문에서 when절 활용]

switch (obj)
{
    case int i:
        WriteLine($"{i}는 int 형식입니다.\n");
        break;
    case float f when f >= 0 :   // obj가 float 형식이며, 0보다 크거나 같은 경우
    	WriteLine($"{f}는 양의 float 형식입니다.\n");
    case float f:                // obj가 float 형식이며 0보다 작은 경우
        WriteLine($"{f}는 음의 float 형식입니다.\n");
        break;
    default:
        WriteLine($"{obj}(은)는 모르는 형식입니다.\n");
        break;
}

 

위의 'case float f :'는 obj에 대해 0보다 작은 경우라는 조건은 없지만, 위의 'when 절'을 통해 조건을 추가하였기 때문에 아래에서는 자연스럽게 조건이 추가됐다고 생각하시면 됩니다.

 

[기본구조 : case문에서 when절 활용]

try
{
    // 예외가 발생할만한 코드
}
catch (ExceptionType ex) when (조건)
{
    // 조건이 참일 때 실행할 코드
}

Switch식(Expression)

'switch 식'은 switch 문을 더욱 간단하게 표현할 수 있습니다. switch식 또한 C와 C++에서 사용할 수 없습니다.

  • case :  →  =>
  • break;  →  ,
    • break; 사용이 불필요해지며, 각 케이스는 ,(컴마)로 구분합니다.
  • default  →  _
int input = Convert.ToInt32(Console.ReadLine());

// 1의 자리를 버립니다.  예) 92 -> 90, 87 -> 80
int score = (int)(Math.Truncate(input/10.0) * 10);

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

 


반복문

  • while
  • do while
do
{
    반복실행할_코드_블록    // 이 코드 블록은 최초 한 번은 무조건 실행됩니다.
}
while ( 조건식 );           // do while문은 while 문과 다르게 세미콜론(;)을 반드시 붙여줘야 합니다.
  • for
  • foreach
foreach(데이터형식 변수명 in 배열_또는_컬렉션)
{
    코드블록
}

 

[무한 루프]

[ for문의 무한 루프 ]

for( ; ; )

 

[ while문의 문한 루프 ]

while( true )
// while ( 1 )과 동일

 


점프문

  • break
    • 실행 중인 반복문이나 switch 문을 중단하고자 할 때 사용합니다.
    • 조건이 충족되는 순간 break 문이 속한 블럭으로부터 빠져나옵니다.
  • continue
    • 현재 실행되고 있는 반복문의 반복을 건너뛰고자 할 때 사용합니다.
    • 조건이 충족되는 순간 continue 문이 속한 블럭으로부터 빠져나옵니다.
for ( int i = 0; i < 5; ++i)
{
    if ( i == 3)
    	continue;    // i가 3인 경우 현재 실행 중인 반복을 건너뜁니다.
    
    WriteLine(i);
} 

// 출력 결과
// 0, 1, 2, 4
  • goto
    • 코드 내에 레이블을 정의하여, goto 문을 통해 해당 레이블로 이동할 수 있습니다.
    • goto 문을 사용하면 코드의 흐름이 비직관적이 될 수 있어, 가독성이 저하될 수 있습니다. 이는 코드의 유지보수를 어렵게 할 수 있습니다.
    • 일반적으로 goto 문을 사용하는 것은 주의를 요하며, 권장되지 않습니다.
      하지만, 중첩된 구조에서 에러 처리를 간소하는 상황에서는 유용할 수 있습니다.
using System;

namespace Goto
{
    class MainApp
    {
        static void Main(string[] args)
        {
            Console.Write("종료 조건(숫자)을 입력하세요. : ");
            
            String input = Console.ReadLine();
            
            int input_number = Convert.ToInt32(input);
            
            int exit_number = 0;
            
            for (int i = 0; i < 2; i++)
            {
                for (int j = 0; j < 2; j++)
                {
                    for (int k = 0; k < 3; k++)
                    {
                        if (exit_number++ == input_number)
                            goto EXIT_FOR;    // 조건이 참이면 EXIT_FOR 레이블로 이동합니다.
                            
                        Console.WriteLine(exit_number);
                    }
                }
            }
            
            goto EXIT_PROGRAM;    // 위의 goto문이 실행되지 않으면, 해당 goto문에 따라 EXIT_PROGRAM 레이블로 이동합니다.
            
        EXIT_FOR:
            Console.WriteLine("\nExit nested for...");
        
        EXIT_PROGRAM:
            Console.WriteLine("Exit program...");
        }
    }
}

  • return
  • throw