C#에서 제네릭 메서드 만들기: T를 Enum으로 제한하기
제네릭 메서드 선언
다음은 Enum
유형을 사용하는 제네릭 메서드를 선언하는 예입니다.
public static T ParseEnum<T>(string value) where T : Enum
{
// 메서드 구현
}
이 메서드는 T
라는 제네릭 매개 변수를 사용합니다. where T : Enum
제약 조건은 T
가 Enum
유형이어야 한다는 것을 의미합니다. 즉, ParseEnum
메서드는 int
, string
또는 bool
과 같은 기본 유형이 아닌 DayOfWeek
, Color
또는 ConsoleColor
과 같은 열거형 유형에만 사용할 수 있습니다.
메서드 구현
ParseEnum
메서드는 Enum.Parse
메서드를 사용하여 문자열을 열거형 값으로 변환합니다. 다음은 메서드 구현의 예입니다.
public static T ParseEnum<T>(string value) where T : Enum
{
if (value == null)
{
throw new ArgumentNullException("value");
}
return (T)Enum.Parse(typeof(T), value, true);
}
이 코드는 value
매개 변수가 null인지 확인합니다. 그렇다면 ArgumentNullException
예외를 throw합니다. 그렇지 않으면 Enum.Parse
메서드를 사용하여 value
문자열을 T
유형의 열거형 값으로 변환하고 결과를 반환합니다.
메서드 사용
다음은 ParseEnum
메서드를 사용하는 예입니다.
DayOfWeek day = ParseEnum<DayOfWeek>("Monday");
Console.WriteLine(day); // Output: Monday
Color color = ParseEnum<Color>("Red");
Console.WriteLine(color); // Output: Red
이 코드는 ParseEnum
메서드를 사용하여 "Monday" 문자열을 DayOfWeek
열거형 값으로 변환하고 "Red" 문자열을 Color
열거형 값으로 변환합니다.
주의 사항
Enum
제약 조건은 C# 7.3에서 도입되었습니다. 이전 버전의 C#을 사용하는 경우 Enum
유형을 사용하는 제네릭 메서드를 만들 수는 있지만 컴파일러에서 경고를 표시할 수 있습니다. 경고를 표시하지 않으려면 where T : struct, Enum
제약 조건을 사용할 수 있습니다. 이 제약 조건은 T
가 struct
유형이어야 하며 Enum
유형이어야 한다는 것을 의미합니다.
결론
예제 코드: 제네릭 메서드 및 열거형
열거형 정의
먼저 Day
라는 열거형을 정의합니다.
public enum Day { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday }
이 열거형은 Sunday
부터 Saturday
까지 일곱 가지 값을 정의합니다.
public static T GetNextDay<T>(T value) where T : Day
{
if (!Enum.IsDefined(typeof(T), value))
{
throw new ArgumentOutOfRangeException("value");
}
var values = Enum.GetValues(typeof(T));
int index = Array.IndexOf(values, value);
if (index == values.Length - 1)
{
return values[0];
}
else
{
return values[index + 1];
}
}
이 메서드는 T
라는 제네릭 매개 변수를 사용합니다. where T : Day
제약 조건은 T
가 Day
열거형이어야 한다는 것을 의미합니다. GetNextDay
메서드는 value
매개 변수의 다음 날을 T
유형의 열거형 값으로 반환합니다.
Day today = Day.Monday;
Day tomorrow = GetNextDay(today);
Console.WriteLine(tomorrow); // Output: Tuesday
Day saturday = Day.Saturday;
Day nextSunday = GetNextDay(saturday);
Console.WriteLine(nextSunday); // Output: Sunday
이 코드는 GetNextDay
메서드를 사용하여 Monday
의 다음 날을 Tuesday
로, Saturday
의 다음 날을 Sunday
로 가져옵니다.
추가 예제
IsWeekend(T day)
:day
매개 변수가Day
열거형의 주말인지 확인합니다.GetFirstWeekday(T day)
:day
매개 변수가Day
열거형의 첫 번째 평일을 반환합니다.
이러한 메서드는 모두 where T : Day
제약 조건을 사용하여 T
가 Day
열거형이어야 한다는 것을 명시합니다.
결론
C#에서 열거형 처리: 대체 방법
foreach 루프 사용
foreach
루프를 사용하여 열거형의 모든 값을 반복할 수 있습니다. 다음은 예입니다.
foreach (Day day in Enum.GetValues(typeof(Day)))
{
Console.WriteLine(day);
}
이 코드는 Day
열거형의 모든 값을 출력합니다.
switch 문 사용
switch
문을 사용하여 특정 열거형 값에 따라 코드를 실행할 수 있습니다. 다음은 예입니다.
Day today = Day.Monday;
switch (today)
{
case Day.Monday:
Console.WriteLine("It's Monday!");
break;
case Day.Tuesday:
Console.WriteLine("It's Tuesday!");
break;
// ... 등등
}
이 코드는 today
변수의 값에 따라 다른 코드를 실행합니다.
LINQ 사용
LINQ (Language Integrated Query)를 사용하여 열거형 값을 쿼리할 수 있습니다. 다음은 예입니다.
var weekendDays = Enum.GetValues(typeof(Day)).Cast<Day>()
.Where(day => day == Day.Saturday || day == Day.Sunday);
foreach (Day day in weekendDays)
{
Console.WriteLine(day);
}
앞서 설명한 대로 제네릭 메서드를 사용하여 열거형을 처리할 수 있습니다. 제네릭 메서드는 코드를 더욱 효율적이고 유연하게 만들 수 있지만 다소 복잡할 수 있습니다.
최적의 방법 선택
열거형을 처리하는 가장 좋은 방법은 특정 상황에 따라 다릅니다. 간단한 작업의 경우 foreach
루프나 switch
문을 사용하는 것이 가장 적합할 수 있습니다. 더 복잡한 작업의 경우 LINQ 또는 제네릭 메서드를 사용하는 것이 더 나은 선택일 수 있습니다.
다음은 각 방법의 장단점을 요약한 표입니다.
방법 | 장점 | 단점 |
---|---|---|
foreach 루프 | 간단하고 명확함 | 모든 값을 반복해야 하는 경우 비효율적일 수 있음 |
switch 문 | 특정 값에 따라 코드를 쉽게 실행할 수 있음 | 모든 가능한 값을 처리해야 하는 경우 코드가 복잡해질 수 있음 |
LINQ | 강력하고 유연함 | 배우고 사용하기 어려울 수 있음 |
제네릭 메서드 | 코드 재사용성을 높이고 유형 안전성을 향상시킬 수 있음 | 복잡하고 이해하기 어려울 수 있음 |
결론
c# generics enums