C#

[C#]제네릭 메서드(Generic Method)

DevStory 2021. 9. 19.

제네릭 메서드(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 타입에 비해 안전한 코드를 작성할 수 있습니다.
반응형

댓글