C#

코드의 흐름 제어하기

Barbarian developer 2024. 10. 30.

switch 문과 패턴 매칭

using System;

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

            string s = Console.ReadLine();
            
           // TryParse: 입력값을 int 형식으로 변환 가능한지 확인
            // TryParse는 변환이 가능하면 true를 반환하고, out 변수에 변환된 값을 넣습니다.
            // 변환이 불가능하면 false를 반환하여 예외 없이 실패를 처리합니다.
            if (int.TryParse(s, out int out_i))  
                obj = out_i; // int로 변환에 성공하면 obj에 저장합니다.
            
            // TryParse: 입력값을 float 형식으로 변환 가능한지 확인
            // TryParse는 float로 변환이 가능한지 검사하며, 변환이 가능하면 true를 반환하고
            // 변환된 값을 out 변수(out_f)에 저장합니다.
            else if (float.TryParse(s, out float out_f)) 
                obj = out_f; // float로 변환에 성공하면 obj에 저장합니다.
            
            // 변환이 불가능한 경우
            // TryParse가 모두 실패하면 obj에 입력값을 그대로 문자열로 저장합니다.

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

 

<실행결과>

 

 

TryPase() vs Parse()

 

 

  •  

    TryParse와 Parse는 .NET에서 문자열을 숫자 또는 다른 데이터 타입으로 변환할 때 사용하는 두 가지 주요 메서드입니다.

    이 두 메서드는 유사한 목적을 가지지만, 작동 방식과 에러 처리가 다릅니다.

  • Parse는 문자열이 잘못된 형식일 때 예외를 발생시킵니다.
  • TryParse는 예외 없이 실패를 처리하고, 성공 여부를 bool로 반환하여 변환된 값을 out 매개변수로 제공합니다.

//Parse()

int result = int.Parse("123"); // result는 123
int result = int.Parse("abc"); // 예외 발생: FormatException

 

 

//TryParse()

int result;
bool success = int.TryParse("123", out result); // success는 true, result는 123
success = int.TryParse("abc", out result); // success는 false, result는 기본값 0

 

케이스 가드

switch문의 case절의 패턴을 더 구체적으로 만들어주는 추가적인 조건 검사. 

case 뒤에 when절을 붙여 사용함.

when절은 if문 처럼 ture/false로 결과가 나옴.

 

using System;

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

            string s = Console.ReadLine();

            // TryParse: 입력값을 int 형식으로 변환 가능한지 확인
            // TryParse는 변환이 가능하면 true를 반환하고, out 변수에 변환된 값을 넣습니다.
            // 변환이 불가능하면 false를 반환하여 예외 없이 실패를 처리합니다.
            if (int.TryParse(s, out int out_i))
                obj = out_i; // int로 변환에 성공하면 obj에 저장합니다.

            // TryParse: 입력값을 float 형식으로 변환 가능한지 확인
            // TryParse는 float로 변환이 가능한지 검사하며, 변환이 가능하면 true를 반환하고
            // 변환된 값을 out 변수(out_f)에 저장합니다.
            else if (float.TryParse(s, out float out_f))
                obj = out_f; // float로 변환에 성공하면 obj에 저장합니다.

            // 변환이 불가능한 경우
            // TryParse가 모두 실패하면 obj에 입력값을 그대로 문자열로 저장합니다.

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

 

switch 식

using System;
using System.Runtime.InteropServices;

namespace SwitchExp
{
    class MainApp
    {
        static void Main(string[] args)
        {
            Console.WriteLine("점수를 입력하세요.");
            int score = Convert.ToInt32(Console.ReadLine());

            Console.WriteLine("재수강인가요? (y/n)");
            string line = Console.ReadLine();
            bool repeated = line == "y" ? true : false;

            string grade = (int)(Math.Truncate(score / 10.0) * 10) switch
            {
                90 when repeated == true => "B+", //케이스 가드 식을 통해 90 이상이더라도, repeated가 true라면 B+.
                90 => "A",  //case :을 =>로 변환한다.
                80 => "B",
                70 => "C",
                60 => "D",  
                _ => "F"    //default는 _로 대체.
            };

            Console.WriteLine($"학점 : {grade}");
        }
    }
}

 

 string grade = (int)(Math.Truncate(score / 10.0) * 10) switch

 

(데이터 타입)Math. Truncate(값)은 소수점 이하는 버린다는 System에서 제공하는 메서드 함수이다.

 

switch는 switch식을 사용한다는 의미.

 

switch식에서는 case :을 =>으로 대체한다.

 

default 는 _로 대체 한다.

 

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

 

Console.ReadLine() 메서드는 항상 문자열(string)로 값을 입력받기 때문에, 입력값을 숫자와 같은 다른 형식으로 변환할 필요가 있을 때 변환 메서드가 필요합니다.

'C#' 카테고리의 다른 글

클래스  (0) 2024.10.30
메소드로 코드 간추리기  (0) 2024.10.30
데이터를 가공하는 연산자  (2) 2024.10.29
#데이터 보관하기  (0) 2024.10.29
C# 프로그램 만들기  (0) 2024.10.29

댓글