🏹 Dart 제네릭(Generic) 완벽 가이드: 개념부터 예제까지 📜
1️⃣ Dart 제네릭(Generic)이란? 🤔
Dart에서 제네릭(Generic) 🎭은 코드의 🔄 재사용성과 🏷️ 타입 안정성을 높이기 위해 사용됩니다. 제네릭을 사용하면 특정 타입에 의존하지 않고 다양한 타입을 처리할 수 있는 유연한 코드 작성이 가능합니다. 🛠️

🏆 제네릭의 주요 장점 ✨
- ♻️ 코드 재사용성 증가: 동일한 로직을 여러 타입에서 사용할 수 있습니다.
- ✅ 타입 안정성 보장: 🖥️ 컴파일 타임에서 타입을 검사하여 오류를 줄일 수 있습니다.
- 👀 가독성 및 🛠️ 유지보수성 향상: 명확한 타입을 지정하여 가독성을 높이고 유지보수하기 쉽습니다.
2️⃣ Dart 제네릭 사용법 📝
Dart에서 제네릭을 사용하는 주요 방법을 살펴보겠습니다. 🔍

🎭 2.1 제네릭 클래스 (Generic Class) 🏗️
제네릭을 사용하면 특정 타입에 의존하지 않는 클래스 정의가 가능합니다.
📌 예제: 제네릭을 활용한 Box 클래스 📦
class Box<T> {
T value;
Box(this.value);
void display() {
print("Value: \$value");
}
}
void main() {
var intBox = Box<int>(10);
intBox.display(); // Value: 10
var stringBox = Box<String>("Hello, Dart!");
stringBox.display(); // Value: Hello, Dart!
}
🛠️ 2.2 제네릭 메서드 (Generic Method) 🏄
제네릭을 사용하여 특정 메서드에서만 타입을 일반화할 수도 있습니다.
📌 예제: 제네릭을 사용한 유틸리티 메서드 🧰
T getFirst<T>(List<T> items) {
return items.isNotEmpty ? items.first : throw Exception("List is empty");
}
void main() {
print(getFirst<int>([1, 2, 3])); // 1
print(getFirst<String>(["A", "B", "C"])); // A
}
📡 2.3 제네릭 인터페이스 및 상속 🏛️
제네릭은 클래스 상속 및 인터페이스 구현에도 활용할 수 있습니다.
📌 예제: 제네릭 인터페이스 활용 🌉
abstract class Repository<T> {
void add(T item);
T get(int index);
}
class StringRepository implements Repository<String> {
final List<String> _data = [];
@override
void add(String item) => _data.add(item);
@override
String get(int index) => _data[index];
}
void main() {
var repo = StringRepository();
repo.add("Dart");
print(repo.get(0)); // Dart
}
🚦 2.4 제네릭 타입 제한 (Type Constraints) 🔒
제네릭을 사용할 때 특정 타입을 제한할 수도 있습니다.
📌 예제: extends를 사용한 타입 제한 🏗️
class Animal {
void makeSound() => print("Animal sound");
}
class Dog extends Animal {
@override
void makeSound() => print("Bark");
}
class AnimalBox<T extends Animal> {
T animal;
AnimalBox(this.animal);
void makeSound() {
animal.makeSound();
}
}
void main() {
var dogBox = AnimalBox(Dog());
dogBox.makeSound(); // Bark
}
3️⃣ Dart 제네릭 활용 사례 🔍
🌐 3.1 API 응답 모델 📡
제네릭을 활용하면 API 응답을 더욱 유연하게 처리할 수 있습니다.

📌 예제: API 응답을 처리하는 제네릭 클래스 📤
class ApiResponse<T> {
final T data;
final String message;
final bool success;
ApiResponse({required this.data, required this.message, required this.success});
}
void main() {
var response = ApiResponse<int>(data: 200, message: "Success", success: true);
print(response.data); // 200
}
🗂️ 3.2 제네릭 컬렉션 사용 📑
Dart에서는 List, Set, Map 등에서도 제네릭을 활용할 수 있습니다.
📌 예제: 제네릭을 활용한 Map 사용 🗺️
void main() {
Map<String, int> studentScores = {
"Alice": 95,
"Bob": 88,
};
print(studentScores["Alice"]); // 95
}
🏁 4. 결론: Dart 제네릭을 활용하여 더 나은 코드 작성하기 🏆
Dart에서 제네릭은 ♻️ 코드 재사용성, ✅ 타입 안정성, 🔧 유지보수성을 높이는 중요한 개념입니다.

- 🎭 제네릭 클래스를 사용하면 다양한 타입을 처리하는 재사용 가능한 클래스를 만들 수 있습니다.
- 🛠️ 제네릭 메서드는 특정 로직을 다양한 타입에서 활용할 수 있도록 합니다.
- 📡 제네릭 인터페이스와 상속을 활용하면 타입 안전성을 보장하면서도 확장성 있는 코드 작성을 할 수 있습니다.
- 🔒 타입 제한을 활용하면 특정 타입에 맞는 유효한 데이터만 처리할 수 있습니다.
제네릭을 적극적으로 활용하여 🚀 효율적이고 안정적인 Dart 코드를 작성해 보세요! 🎯
'Programming > Dart' 카테고리의 다른 글
| Dart Cascade Operator (0) | 2025.04.03 |
|---|---|
| Dart Static (0) | 2025.04.03 |
| Dart Abstract (0) | 2025.03.28 |
| Dart Mixins (0) | 2025.03.28 |
| Dart Interface (0) | 2025.03.27 |