🌟C# 패턴 매칭 😋 🌟
안녕하세요. 박민성입니다. 🤗
오늘은 C#에 패턴 매칭 문법에 관하여 글을 쓰고자 합니다. 🤔
최근 C# 기초나 문법에 관해서 공부를 하면 기본기가 탄탄해지고
기본기가 탄탄해지면 나중에 도움이 많이 될 것 같아서 찾아보다가
Unity에 조건문을 사용할 때 패턴 매칭 사용하면 깔끔 싹싹띠하게 만들 수 있다는 걸 알고
제가 배운 것을 토대로 글을 작성하고자 합니다.
1. 패턴 매칭이란?
식에 특정한 특징이 있는지를 테스트하는 기법입니다. (공식문서)
특정한 특징은 해당 값이 특정 값인가? 특정 범위에 속하는가? 등을 말합니다.
그것을 조건문처럼 사용할 수 있게끔하는 기법입니다.
예제처럼 특정한 값에 대한 패턴(특정한 특징)을 매칭시키는 것입니다.
int health = 20;
if (health is 20) {} // 특정 값인가? (health가 20이면)
if (health is >= 1 and <= 30) {} // 특정 범위 값인가? (health가 1보다 크거나 같으며 30보다 작거나 같으면)
2. 기존 조건문과 비교
기존에 조건문은
if (health >= 1 && health <= 30)
{
Debug.Log("피가 위험");
}
이런 식으로 (health가 1보다 크거나 같으며 30보다 작거나 같으면)을
health에 각각 수를 비교연산 하고 &&으로 연결합니다.
패턴 매칭은
if (health is >= 1 and <= 30)
{
Debug.Log("피가 적음");
}
이런 식으로 health라는 값에 대해서 값이 가지고 있는 특징을 비교하는 것입니다.
and는 그 특징에 대해서 투가로 제한하는 느낌입니다.
and는 독립적으로 사용할 수 없으며 is와 함께 사용해야 합니다.
&&은 완성된 두 조건식을 연결하는 느낌이라면 and는 조건을 추가하는 느낌으로
서로 비슷한 역할을 수행하지만 다른 방식으로 사용됩니다.
또한
is와 ==의 가장 큰 차이점은 ==은 타입 비교가 안되지만 is는 타입 비교가 된다는 점입니다.
if (target is Enemy) { }
if (target is IDamageable) { }
이런 식으로 target이 Enemy 타입을 가지고 있는지, IDamageble이라는 인터페이스를 구현하고 있는지
타입 자체를 비교할 수 있습니다.
==은 타입을 비교하려면
if (target.GetType() == typeof(Enemy)) { }
이런 식으로 GetType()과 typeof를 사용하여 비교를 해야 합니다.
그리고
if (target is IDamageable damageable)
{
damageable.TakeDamage(10);
}
이런 식으로 타입 검사와 동시에 변수 생성도 할 수 있습니다.
3. is, and, or, not
패턴 매칭에는 is, and, or, not이 있는데요.
is는 검사하려는 값이 특정한 패턴에 맞는지 확인할 때 사용합니다.
if (health is <= 30) { Debug.Log("피가 적습니다."); }
단순한 숫자 비교에서는 <=와 다를 것 없지만 뒤에서 설명할 and, or, not과 함께 조건을 패턴 형식으로 작성할 수 있게 합니다.
and는 하나의 값이 여러 조건을 모두 만족하는지 검사할 때 사용합니다.
if (health is >= 1 and <= 30) { Debug.Log("위험 위험"); }
&&는 완성된 조건식을 연결하고, and는 하나의 값에 적용되는 패턴들을 연결합니다.
or는 하나의 값이 여러 조건 중 하나라도 만족하는지 검사할 때 사용합니다.
if (state is PlayerState.Idle or PlayerState.Move) { Debug.Log("이동 가능한 상태"); }
같은 값을 여러 값과 비교할 때 or를 사용하면 검사 대상인 state를 반복해서 작성하지 않을 수 있습니다.
||와 비슷한 역할을 수행합니다.
not은 값이 특정한 패턴에 해당하지 않는지 검사할 때 사용합니다.
if (state is not PlayerState.Dead) { Debug.Log("플레이어가 살아 있습니다."); }
! 와 비슷한 역할을 합니다.
4. switch와 패턴 매칭의 관계
패턴 매칭은 is뿐만 아니라 switch문에서도 사용할 수 있습니다.
string healthState = health switch
{
<= 0 => "사망",
<= 30 => "위험",
<= 70 => "보통",
_ => "안전"
};
switch는 하나의 값을 여러 패턴과 차례대로 비교하고, 그중 어디에 해당하는지 구분할 때 사용합니다.
여기서 _는 디폴값을 의미합니다.
is는 값이 조건에 맞는가? 이면
switch는 값이 여러 조건 중 어디에 해당하는가? 인 느낌입니다.
이상으로 C# 패턴 매칭에 대해서 알아보았는데요.
제가 이해한 것을 토대로 막 휘갈겨서 정리해둔 느낌이라 설명이 부족하고 이해가 어려울 수 있습니다...... 😭
그래도 이렇게 정리해서 작성해보며 여러 가지로 좋은 경험을 한 것 같습니다.
내일은 더욱 알차게 보내고 작성해보도록 하겠습니다.
봐주셔서 감사합니다. ☺️