제네릭 ( Generic )
제네릭은 클래스 , 메서드 , 구조체 등에 데이터 타입을 매개변수화 해서 코드의 재사용성과 타입 안정성을 높이는 문법이다.
자료형을 고정하지 않고 어떤 타입이든 받을 수 있도록 만든 문법이다.
1. 제네릭 클래스 선언
public class Box<T>
{
private T item;
public void SetItem(T value)
{
item = value;
}
public T GetItem()
{
return item;
}
}
람다식 ( => ) 을 사용하면 코드를 간결하게 할수 있다.
public class Box<T> // <T> → 타입 매개변수
{
private T item;
public void SetItem(T value) => item = value;
public T GetItem() => item;
}
예시
Box<int> intBox = new Box<int>();
intBox.SetItem(100);
Box<string> strBox = new Box<string>();
strBox.SetItem("Hello");
<T> 안에 원하는 타입을 지정해줘야 한다.
여러 개도 가능하다 Box<TKey, TValue>
2. 제네릭 인터페이스 선언
public interface IRepository<T>
{
void Add(T item);
T Get(int id);
}
public class MemoryRepository<T> : IRepository<T>
{
private List<T> storage = new List<T>();
public void Add(T item) => storage.Add(item);
public T Get(int id) => storage[id];
}
3. 제네릭 메서드 선언
public class Util
{
public static void Swap<T>(ref T a, ref T b)
{
T temp = a;
a = b;
b = temp;
}
}
int x = 1, y = 2;
Util.Swap(ref x, ref y); // x=2, y=1
4. 제네릭 구조체 선언
public struct Pair<T1, T2>
{
public T1 First;
public T2 Second;
public Pair(T1 first, T2 second)
{
First = first;
Second = second;
}
}
// 사용
var p = new Pair<int, string>(1, "Hello");
5. 제네릭 델리게이트 선언
public delegate T Operation<T>(T a, T b);
class Program
{
static int Add(int a, int b) => a + b;
static void Main()
{
Operation<int> op = Add;
Console.WriteLine(op(3, 5)); // 8
}
}
제네릭을 사용하는 이유
1. 자료형에 의존하지 않고 공통된 로직을 만들고 싶을 때
- 배열이나 리스트처럼 "어떤 타입이 들어올지 모르지만 , 저장 / 검색 / 추가" 로직은 똑같을 때
2. 형변환 ( Casting )을 줄이고 싶을 때
- Object 를 쓰면 매번 박싱 / 언박싱이 필요하다.
- 제네릭은 그걸 컴파일 시점에 타입을 고정해줘서 안전하고 성능도 좋다
3. 타입 안정성을 확보하고 싶을 때
- Object 로 다 받으면 잘못된 타입을 넣어도 컴파일러가 못잡는다.
- 제네릭은 <T> 가 어떤 타입인지 지정해야 해서, 런타임 오류 대신 컴파일 오류를 내준다.
정리
데이터 형식에 의존하지 않고, 재사용 가능한 형식 안전한 코드(클래스 , 메서드)를 만들 수 있게 해주는 문법
참고 자료
제네릭 : https://learn.microsoft.com/ko-kr/dotnet/standard/generics/
제네릭 컬렉션 : https://learn.microsoft.com/ko-kr/dotnet/standard/generics/collections
'⭐C Sharp > 15-1. 제네릭' 카테고리의 다른 글
| Dictionary<TKey, TValue> (0) | 2025.11.14 |
|---|---|
| 제네릭 사용 예시 코드 (0) | 2025.10.02 |