카테고리 없음

🌟C# 패턴 매칭 😋 🌟

minsoungdev 2026. 7. 20. 23:52

안녕하세요. 박민성입니다. 🤗

 

오늘은 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# 패턴 매칭에 대해서 알아보았는데요. 

제가 이해한 것을 토대로 막 휘갈겨서 정리해둔 느낌이라 설명이 부족하고 이해가 어려울 수 있습니다...... 😭

그래도 이렇게 정리해서 작성해보며 여러 가지로 좋은 경험을 한 것 같습니다. 

 

내일은 더욱 알차게 보내고 작성해보도록 하겠습니다. 

봐주셔서 감사합니다. ☺️