본문 바로가기
Programming/Dart

Dart Generic

by #root 2025. 4. 3.

🏹 Dart 제네릭(Generic) 완벽 가이드: 개념부터 예제까지 📜

1️⃣ Dart 제네릭(Generic)이란? 🤔

Dart에서 제네릭(Generic) 🎭은 코드의 🔄 재사용성과 🏷️ 타입 안정성을 높이기 위해 사용됩니다. 제네릭을 사용하면 특정 타입에 의존하지 않고 다양한 타입을 처리할 수 있는 유연한 코드 작성이 가능합니다. 🛠️

🏆 제네릭의 주요 장점 ✨

  1. ♻️ 코드 재사용성 증가: 동일한 로직을 여러 타입에서 사용할 수 있습니다.
  2. ✅ 타입 안정성 보장: 🖥️ 컴파일 타임에서 타입을 검사하여 오류를 줄일 수 있습니다.
  3. 👀 가독성 및 🛠️ 유지보수성 향상: 명확한 타입을 지정하여 가독성을 높이고 유지보수하기 쉽습니다.

 

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