학습
C# 제네릭(Generic) 사용법
C# 제네릭(Generic) 사용법 — 중급
제네릭(Generic) 사용법
1. 도입 (왜 배워야 하는가)
제네릭은 C#에서 매우 중요한 개념으로, 데이터 타입에 구애받지 않고 사용할 수 있는 방법을 제공합니다. 실무에서 제네릭을 사용하면 코드의 재사용성을 극대화할 수 있고, 타입 안정성을 높일 수 있습니다. 예를 들어, 리스트를 구현할 때 제네릭을 사용하면 다양한 타입의 데이터를 담을 수 있는 리스트를 만들 수 있어, 코드의 양을 줄이고 가독성을 높이는 데 큰 도움이 됩니다.
제네릭을 모르면, 특정 데이터 타입에만 제한된 클래스나 메소드를 만들어야 하므로 코드가 중복되고 유지보수가 어려워질 수 있습니다. 또한, 타입 안전성이 떨어져 런타임에서 오류가 발생할 확률이 높아집니다.
2. 핵심 개념 설명
제네릭(Generic)
제네릭은 클래스, 메소드, 인터페이스 등을 정의할 때 구체적인 데이터 타입을 지정하지 않고, 나중에 사용할 데이터 타입을 매개변수로 받을 수 있게 하는 기능입니다.
비유: 제네릭을 '만능 주방 기구'에 비유할 수 있습니다. 만능 주방 기구는 다양한 재료를 사용해 요리를 할 수 있지만, 재료에 따라 적절한 조리 방법을 선택해야 합니다. 제네릭도 마찬가지로, 다양한 데이터 타입을 동일한 방법으로 처리할 수 있도록 해줍니다.
관련 용어 정리
| 용어 | 설명 |
|---|---|
| 타입 매개변수 | 제네릭 정의 시 사용되는 placeholder |
| 제네릭 클래스 | 제네릭 타입을 사용하는 클래스 |
| 제네릭 메소드 | 제네릭 타입을 사용하는 메소드 |
3. 기본 코드 예제
아래는 제네릭 클래스를 사용하는 기본적인 예제입니다.
public class Box<T>
{
private T item;
public void Pack(T item)
{
this.item = item;
}
public T Unpack()
{
return item;
}
}
// 사용 예제
Box<int> intBox = new Box<int>();
intBox.Pack(123);
int unpackedInt = intBox.Unpack();
// unpackedInt는 123이 된다
Box<string> strBox = new Box<string>();
strBox.Pack("Hello");
string unpackedStr = strBox.Unpack();
// unpackedStr는 "Hello"가 된다
실행 결과:
- unpackedInt는 123이 되고, unpackedStr는 "Hello"가 됩니다.
Box<T>라는 제네릭 클래스를 정의합니다. 여기서 T는 타입 매개변수입니다.Pack메소드는 제네릭 타입 T의 데이터를 받아서item에 저장합니다.Unpack메소드는item을 반환합니다.Box<int>와Box<string>을 통해 각각 정수와 문자열을 담을 수 있는 박스를 만듭니다.- 각각의 박스에 값을 포장하고 풀어봅니다.
- 올바른 코드:
intBox.Pack(123); - 올바른 코드:
numbers.Add(123); - 제네릭을 사용하면 코드의 재사용성과 타입 안전성을 높일 수 있습니다.
- 다양한 데이터 타입을 처리할 수 있는 유연한 클래스를 만들 수 있습니다.
- 제네릭을 활용해 실무에서 자주 사용하는 패턴을 구현할 수 있습니다.
- LINQ (Language Integrated Query)와 제네릭의 활용
- 제네릭 인터페이스와 제네릭 메소드
- C#에서의 컬렉션(리스트, 딕셔너리 등)과 제네릭 사용법
코드 동작 설명:
4. 실전 활용 예제
예제 1: 쇼핑몰 장바구니 구현
쇼핑몰에서 장바구니를 구현할 때 제네릭을 사용하면 다양한 타입의 상품을 장바구니에 담을 수 있습니다.
public class ShoppingCart<T>
{
private List<T> items = new List<T>();
public void AddItem(T item)
{
items.Add(item);
}
public List<T> GetItems()
{
return items;
}
}
// 사용 예제
ShoppingCart<Product> cart = new ShoppingCart<Product>();
cart.AddItem(new Product("Laptop", 1200));
var itemsInCart = cart.GetItems();
예제 2: 데이터 페이징
API에서 데이터 페이징을 구현할 때 제네릭을 사용하면 다양한 타입의 데이터를 처리할 수 있습니다.
public class Paging<T>
{
public List<T> Items { get; set; }
public int TotalCount { get; set; }
}
// 사용 예제
Paging<Order> orderPaging = new Paging<Order>
{
Items = new List<Order> { new Order(1), new Order(2) },
TotalCount = 2
};
5. 흔한 실수와 주의사항
실수 1: 타입 매개변수를 잘못 사용하는 경우
public class Box<T>
{
public void Pack(T item) { / ... / }
}
// 잘못된 코드
Box<int> intBox = new Box<int>();
intBox.Pack("Hello"); // 컴파일 오류
실수 2: 제네릭 타입을 잘못 이해하는 경우
List<int> numbers = new List<int>();
numbers.Add("string"); // 컴파일 오류