C++ 쟁이가 C#을 배워보자 - 패턴매칭
C# 7부터 is 키워드가 패턴 매칭을 지원한다고 함이전에는 if문에서 타입을 검사한 후 형변환을 하여 멤버를 사용했었으나 C# 7부터는 이를 매우 간소화 할 수 있게 됨
C# 7에서는 아래와 같이 사용이 가능하다.
switch문의 경우에는 지금까지 상수형 패턴만 case에서 지원을 했으나 역시 C# 7으로 오면서 형식 패턴을 사용할 수 있게 되었다.
switch의 case에 when절을 넣으면 추가적인 조건 검사를 할 수 있는데, 이는 다음과 같이 사용할 수 있다.
1. if 문에선의 형식 패턴 사용
//C# 7 이전 방식 object val = 3; if (val is int) { //if문에서 object 타입 변수 val이 int형인지 검사 var valInt = (int) val; //변수 val을 int형으로 형변환 ... }
C# 7에서는 아래와 같이 사용이 가능하다.
object val = 3; if (val is int valInt) { // 변수 val이 int형이면 지역변수 valInt에 바로 값을 대입하여 사용할 수 있음 \ ... }
switch문의 경우에는 지금까지 상수형 패턴만 case에서 지원을 했으나 역시 C# 7으로 오면서 형식 패턴을 사용할 수 있게 되었다.
//C# 7 이전 방식 int val = 2; switch (val) { case 0: ... break; case 1: ... break; default: ... }
2. switch문에서의 형식 패턴
switch에서 형식 패턴은 다음과 같이 사용이 가능하다.object obj = 3.0; switch (obj) { case double valDbl: ... break; case int valInt: ... break; case decimal valDec: ... break; }if문에서 형식 패턴을 사용한 것과 동일하게 obj가 double이면 valDbl 변수에 값을 대입해주고 int형이면 valInt에 값을 대입해 준다.상수 패턴을 사용하는 switch와 다른점은 goto를 사용할 수 없다는 점이다. (상수패턴 switch에서는 goto 사용 가능 - 그러나 본인은 goto문을 좋아하지 않는다.)
switch의 case에 when절을 넣으면 추가적인 조건 검사를 할 수 있는데, 이는 다음과 같이 사용할 수 있다.
object obj = 3.0; switch (obj) { case double valDbl when valDbl < double.Epsilon: ... break; case int valInt when valInt == 0: ... break; case decimal valDec when valDec == 0.0M: ... break; }앞선 switch문의 형식 패턴 소스와 동일하지만 when 절에서 추가적인 조건을 검사 후 해당 조건도 만족하는 경우 이후 처리를 진행하게 된다.
댓글
댓글 쓰기