2023. 11. 18. 18:33ㆍC#
또 오랜만에 글 한편 쓴다
오늘은 간단하게 C# 7.0 부터 도입된 is not 패턴 매칭에 대해 알아보도록 하자
1. is not이 무엇인가?
자, 시작은 이렇다. 우리가 코딩하다 보면 객체의 타입 체크가 필요할 때가 많을거다. 특히 UI 작업하면서 많이 보게 될텐데 element가 TextBlock인지 아닌지 확인해야 한다고 치자. 옛날엔 그냥 if (element is TextBlock) 이렇게 썼겠지만, 이젠 element is not TextBlock textBlock이라고 쓸 수 있다.
이거 존나 편한게 이거 없던 시절엔 아래처럼 써야 된다.
element는 임의의 변수고 TextBlock은 임의의 타입이다.
var textBlock = element as TextBlock;
if(textBlock is not null)
{
// 니 하고 싶은거
}
또는 이렇게 써야 한다
if(element is TextBlock)
{
var textBlock = element as TextBlock;
// 이제 니 하고 싶은거
}
즉 as 로 변수 받고 그걸 토대로 다시 is 체크 하고 혹은 반대로 하거나 하여간 해야 할 작업이 많았고, 그만큼 귀찮았다.
그런데 is not 패턴 매칭을 사용하면 아래처럼 한방에 해결된다.
if(element is TextBlock textBlock)
{
// 이제 여기서 그냥 textBlock을 써서 니 할거 하면 된다.
// 즉 자동으로 textBlock = element as TextBlock 이 되었다 보면 된다.
}
또는 아래처럼도 가능하다.
참고로 필자는 코드가 안으로 들어가는걸 별로 안좋아해서 특수한 상황 아니면 왠만하면 아래를 더 선호한다.
if(element is not TextBlock textBlock) return;
// 이제 여기서 textBlock 써서 니 하고 싶은거 하면 된다.
즉 element is TextBlock textBlock의 경우는 element is TextBlock 조건문이 참일때 textBlock에 element값이 할당되는거고 (그러므로 거짓일 때는 textBlock이 null이거나 이전 값을 유지한다.)
element is not TextBlock textBlock의 경우는 element is not TextBlock 조건문이 거짓일때 textBlock에 element값이 할당되는거다. (그러므로 참일때는 textBlock이 null 이거나 이전 값을 유지한다.)
그냥 쉽게 말해 조건문이 is 이든 is not 이든 상관없이 textBlock에 값을 할당하는 로직은 element가 TextBlock타입일때에만 textBlock에 element가 할당된다 생각하면 된다.
즉 is 랑 is not은 그냥 조건문일 뿐이고 조건문과 별개로 그 이후에 element가 TextBlock 타입일 경우에만 textBlock 변수에 element가 할당되는거다.
그렇기 때문에 is 일 경우는 조건문이 참일 경우에 element가 TextBlock 타입이라는 거니까 textBlock에 element가 할당되는거고
is not의 경우는 조건문이 거짓일 경우에 element가 TextBlock 타입이라는 거니까 textBlock에 element가 할당되는거다.
생각해보면 당연한것이므로 외우지 말고 생각해보고 원리를 이해하도록 하자.
아래처럼 비교해보면 결국 is 패턴매칭, is not 패턴 매칭은 is, is not 조건문에 변수할당문이 추가된 것일 뿐이라는게 이해가 될 거다.
// 패턴 매칭 사용 안함
if(element is TextBlock)
{
// 이 구문이 아래에서 textBlock 하나로 대체
var textBlock = element as TextBlock;
// 니 하고 싶은거
}
// 패턴 매칭 사용
if(element is TextBlock textBlock)
{
// 니 하고 싶은거
}
// 패턴 매칭 사용 안함
if(element is not TextBlock) return;
// 이 구문이 아래에서 textBlock 하나로 대체
var textBlock = element as TextBlock;
// 이제 니 하고 싶은거
// 패턴 매칭 사용
if (element is not TextBlock textBlock) return;
// 이제 니 하고 싶은거
그럼 앞으로 코드를 간결히 하기 위해 패턴매칭 쓰도록 하자.
타이핑 치는것도 시간이고 읽는것도 시간이다.
'C#' 카테고리의 다른 글
[C#] 비동기 프로그래밍: Task.Run과 바로 호출의 차이점 (2) | 2023.10.24 |
---|---|
[C#] 비동기 프로그래밍(APM)에 대해 알아보자 (0) | 2023.03.21 |
[C#] 디버깅 시 데이터의 조사식 포맷을 변경해보자 (0) | 2022.12.30 |
[C#] 열거형 값을 문자열로 사용해보자 (0) | 2022.12.30 |
[C#] 외부함수를 멤버함수처럼 사용하기 (0) | 2022.12.26 |