제네릭 메서드(Generic Method)는 데이터 타입을 일반화한 메서드입니다.
특정 타입에 국한되지 않고 모든 타입을 메서드의 파라미터 또는 반환 형식으로 설정할 수 있는데요.
제네릭 메서드를 제대로 활용한다면, 불필요한 메서드를 반복해서 구현할 필요가 없으며, 코드의 재사용성이 증가되며, 타입을 안전하게 처리할 수 있다는 장점이 있습니다.
이번 포스팅에서는 일반적인 메서드의 문제점과 제네릭 메서드(Generic Mehtod)에 대해 정리하였습니다.
일반 메서드의 문제점
타입이 int형인 매개변수의 값을 Console에 출력하는 간단한 메서드를 구현하였습니다.
void PrintConsoleValue(int val)
{
Console.WriteLine(val.ToString());
}
타입이 double형, bool형인 매개변수의 값을 출력하는 메서드도 필요해서 PrintConsoleValue 메서드를 오버로딩합니다.
void PrintConsoleValue(double val)
{
Console.WriteLine(val.ToString());
}
void PrintConsoleValue(bool val)
{
Console.WriteLine(val.ToString());
}
이러한 방식의 코드는 애플리케이션이 실행하는데 문제는 없지만, 효율적인 방법은 아닙니다.
C#에서 데이터 타입은 int, double, bool형 이외에도 무수히 많기 때문에 타입의 개수만큼 PrintConsoleValue 메서드를 구현해야 하는 문제가 발생합니다.
제네릭 메서드로 구현한다면, 메서드 한 개로 모든 타입을 처리할 수 있습니다.
제네릭 메서드(Generic Method)
일반 메서드를 제네릭 메서드로 변경한 코드입니다.
void PrintConsoleValue<T>(T val)
{
Console.WriteLine(val.ToString());
}
제네릭 메서드는 다음과 같이 호출할 수 있습니다.
PrintConsoleValue<int>(10);
PrintConsoleValue<bool>(true);
PrintConsoleValue<float>(10.5);
PrintConsoleValue<string>("string");
<T>는 무엇인가?
<T>는 제네릭 메서드의 데이터 유형을 표시하는 기호입니다.
일반적으로 Type의 약자인 T로 작성하며, 키워드가 아니면 됩니다.
만약, <> 안에 키워드를 작성할 경우 아래 사진처럼 컴파일 에러가 발생합니다.
제네릭 메서드 호출
제네릭 메서드를 호출하는 경우 <> 안에 제네릭 메서드에 전달할 타입을 명시합니다.
PrintConsoleValue<int>(10);
제네릭 메서드는 다음과 같이 동작합니다.
void PrintConsoleValue<int>(int 10)
{
Console.WriteLine(10.ToString());
}
제네릭 메서드를 호출하는 코드에서 <> 안에 int 타입을 작성했으므로 제네릭 메서드의 T 기호는 int 타입으로 치환됩니다.
여러 매개변수
제네릭 메서드는 여러 개의 매개변수를 가질 수 있습니다.
void PrintConsoleValue<T>(T val1, T val2)
그리고 제네릭 타입이 여러 개인 제네릭 메서드가 존재합니다.
void PrintConsoleValue<T, X>(T val1, X val2)
PrintConsoleValue 메서드를 호출할 때, 첫 번째 매개변수는 int형을 전달할 수 있고 두 번째 매개변수는 string형을 전달하는 경우 제네릭 타입을 두 개로 설정하여 해결할 수 있습니다.
PrintConsoleValue<int, string>(10, "Hello");
반환 타입도 제네릭 형식인 제네릭 메서드
제네릭 메서드는 메서드의 반환 타입도 제네릭 형식으로 설정할 수 있습니다.
T ReturnValue<T>(T val)
{
return val;
}
object 타입의 단점
제네릭 메서드를 사용하지 않고 다음과 같이 object 타입으로 매개변수의 타입을 설정할 수 있습니다.
void PrintConsoleValue(object val)
{
Console.WriteLine(val.ToString());
}
PrintConsoleValue(10);
PrintConsoleValue(true);
PrintConsoleValue(10.5);
PrintConsoleValue("string");
하지만, object 타입으로 설정한 경우 정확한 타입을 식별하기 어려우며, 성능적으로 제네릭보다 좋지 않으며, 에러를 찾기 어렵다는 단점이 존재합니다.
제네릭 메서드 호출 시 <> 생략
제네릭 메서드 호출 시 <>를 생략할 수 있습니다.
PrintConsoleValue(10);
<>를 생략하는 경우 컴파일러가 제네릭 메서드에 전달하는 값의 타입을 유추하여 제네릭 유형을 치환합니다.
타입을 유추하기 어렵기 때문에 대부분의 개발자들은 <> 안에 타입을 명시하는 방법을 권장합니다.
정리
제네릭 메서드는 데이터 타입 때문에 메서드를 오버로드 해야 하는 문제를 해결하는 기법이며, 다음과 같은 장점이 있습니다.
- 코드의 재사용성이 높아집니다.
- object 타입에 비해 안전한 코드를 작성할 수 있습니다.
'C#' 카테고리의 다른 글
[C#]자료형(Data Type)의 기본 값(default) 연산자 (0) | 2021.09.20 |
---|---|
[C#]제네릭 메서드(Generic Method) 널(Null) 반환 방법 (0) | 2021.09.19 |
[C#]컬렉션, 큐(Queue) 자료구조 (0) | 2021.09.11 |
[C#]컬렉션, 스택(Stack) 자료구조 (0) | 2021.09.11 |
[C#]컬렉션, ArrayList (0) | 2021.08.28 |
댓글