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 |
댓글