Unity & C#

[C#] Switch문을 사용한 Type Pattern Matching

왼손잡이개발자 2022. 6. 26. 22:25

 

switch 문을 많이 활용하시나요? 저는 개인적으로 switch문을 많이 활용하지 않는 것 같습니다 (계속 if, else if, else if... 이어지며 못생긴 코드가 되어버리지요;;;). 그러다가 최근에 Type 비교를 하는 코드를 작성하다가 Swith문으로 Type 을 비교할 수 있을까? 라는 의문이 들어서 검색을 해보다가 C# 7 부터 가능한 Swith 문의 엄청나게 유용한 기능을 알게되었습니다. 바로 Switch문으로 Type이 같은지 확인을 할 수 있을 뿐만 아니라 더 나아가 그 비교된 Type으로 형변환 시킨 형식으로 변수를 활용할 수 있더라고요.

 

먼저 예시로 과일을 먹는 상황이라고 생각을 하고 여러 과일들 클래스를 만들어보겠습니다. 모든 과일은 IFruit 인터페이스를 구현하고 있습니다. 

	public interface IFruit
	{
		void Eat();
	}

	public class Apple : IFruit
	{
		public void Eat()
		{
			Console.WriteLine("You are eating an apple");
		}
		public void AppleSpecificMethod()
		{
			Console.WriteLine("It's so sweet");
		}
	}

	public class Orange : IFruit 
	{
		public void Eat()
		{
			Console.WriteLine("You are eating an orange");
		}
		public void OrangeSpecificMethod()
		{
			Console.WriteLine("It's so fresh");
		}
	}

	public class Peach : IFruit 
	{
		public void Eat()
		{
			Console.WriteLine("You are eating a peach");
		}
		public void PeachSpecificMethod()
		{
			Console.WriteLine("It's so peachy");
		}
	}

 

그리고 아무 과일이나 랜덤으로 골라서 먹는다고 했을 때, Swith문을 활용해서 해당 과일의 고유의 Method를 실행하는 코드입니다. (ex. AppleSpecificMethod())

class EatFruitProgram
	{
		private static List<IFruit> fruits = new List<IFruit>();
		static void Main(string[] args)
		{
			fruits.Add(new Apple());
			fruits.Add(new Orange());
			fruits.Add(new Peach());

			var fruit = GetRandomFruit();

			EatFruit(fruit);
		}

		private static IFruit GetRandomFruit()
		{
			int randomIndex = new Random().Next(0, fruits.Count);
			return fruits[randomIndex];
		}

		private static void EatFruit(IFruit fruit)
		{
			fruit.Eat();
			switch (fruit)
			{
				case Apple apple:
					apple.AppleSpecificMethod();
					break;

				case Orange orange:
					orange.OrangeSpecificMethod();
					break;

				case Peach peach:
					peach.PeachSpecificMethod();
					break;
			}
		}
	}

 

위 코드에서 주목해야할 부분은 바로 EatFruit(...) 함수에서 Switch 문 case 마다 각 Type의 비교뿐만 아니라 해당 Type으로 Type Casting을 한 변수처럼 활용이 가능한 부분입니다.

 

Switch 문의 엄청난 매력을 하나 발견하게된듯합니다.