[ Dart&Flutter ] Dart 제너릭(Generics) 심화 학습

Dart 제너릭(Generics) 심화 학습 방법입니다. Dart 제너릭(Generics) 개념 설명 → 실습 예제 2개 → 해설 & 출력 예시 순서대로 공부 할수 있도록 작성하였습니다. 실습하면서 자연스럽게 제너릭 개념을 이해하고 활용할 수 있으시길 바랍니다. 


Dart 제너릭(Generics) 심화 학습
Dart 제너릭(Generics) 심화 학습



🧩 Dart 제너릭(Generics) 심화 학습

여러 타입을 다룰 수 있는 유연하고 재사용 가능한 코드 작성 방법


✅ 1. 제너릭 타입 이해하기 ( List<T>Map<K, V> )

📘 개념 설명

  • **제너릭(Generic)**은 타입을 코드에서 나중에 결정할 수 있도록 하는 문법입니다.

  • List<T>에서 T는 **어떤 자료형이든 될 수 있는 “타입 변수”**예요.

  • 코드 재사용성과 타입 안정성을 높여줍니다.



🏆 실습 예제 1: 제너릭 List 사용하기

void main() {
  List<int> numbers = [1, 2, 3];
  List<String> fruits = ['사과', '바나나'];

  print(numbers);
  print(fruits);
}

✅ 출력:

[1, 2, 3]  
[사과, 바나나]
타입이 명확하므로 실수로 다른 타입을 넣으면 에러 발생!



🏆 실습 예제 2: Map<K, V>로 학생 점수 저장

void main() {
  Map<String, int> scores = {
    '지훈': 95,
    '민지': 88,
  };

  print('지훈 점수: ${scores['지훈']}');
}

✅ 출력:

지훈 점수: 95





✅ 2. 제너릭 클래스 & 함수 만들기

📘 개념 설명

  • 제너릭은 직접 만든 클래스나 함수에도 사용할 수 있어요!

  • 다양한 타입을 받아서 하나의 구조로 재사용할 수 있게 도와줍니다.



🏆 실습 예제 1: 제너릭 클래스 만들기

class Box<T> {
  T item;

  Box(this.item);

  void show() {
    print('박스 안에: $item');
  }
}

void main() {
  Box<String> box1 = Box('사탕');
  Box<int> box2 = Box(100);

  box1.show();  // 박스 안에: 사탕
  box2.show();  // 박스 안에: 100
}

✅ 출력:

박스 안에: 사탕  
박스 안에: 100




🏆 실습 예제 2: 제너릭 함수 만들기

T repeat<T>(T value, int times) {
  print('값을 $times번 반복합니다:');
  for (int i = 0; i < times; i++) {
    print(value);
  }
  return value;
}

void main() {
  repeat<String>('안녕', 2);
  repeat<int>(123, 3);
}

✅ 출력:

값을 2번 반복합니다:
안녕  
안녕  
값을 3번 반복합니다:
123  
123  
123





✅ 3. 제너릭 타입 제한 ( extends )

📘 개념 설명

  • T extends SomeType을 사용하면 T는 반드시 특정 타입의 자식이어야 한다는 제한을 줄 수 있어요.

  • 예: 숫자만 비교하거나, 공통 속성이 있는 객체만 허용할 때 유용합니다.




🏆 실습 예제 1: 숫자 타입만 허용하는 제너릭 클래스

class MathBox<T extends num> {
  T x;
  T y;

  MathBox(this.x, this.y);

  T add() => (x + y) as T;
}

void main() {
  MathBox<int> box = MathBox(10, 20);
  print('합: ${box.add()}');
}

✅ 출력:

합: 30





🏆 실습 예제 2: 특정 클래스를 상속한 타입만 받기

abstract class Animal {
  void speak();
}

class Dog extends Animal {
  void speak() => print('멍멍!');
}

class Cat extends Animal {
  void speak() => print('야옹!');
}

class PetCage<T extends Animal> {
  T pet;

  PetCage(this.pet);

  void callPet() {
    pet.speak();
  }
}

void main() {
  PetCage<Dog> cage = PetCage(Dog());
  cage.callPet(); // 멍멍!
}

✅ 출력:

멍멍!




🎓 마무리 요약

개념

설명

List<T>, Map<K,V>

다양한 타입을 받을 수 있는 컬렉션 구조

제너릭 클래스

어떤 타입이든 받아서 재사용할 수 있는 클래스

제너릭 함수

입력 타입에 따라 유연하게 동작하는 함수

T extends Type

특정 타입만 허용하도록 제한하는 문법




💡 실전 활용 예시

  • Flutter에서 ListView<T>, Dropdown<T> 등 많은 위젯이 제너릭 기반

  • API 응답을 여러 타입으로 파싱할 때 제너릭 클래스 사용

  • Dart 유틸리티 함수의 범용성 향상


댓글 쓰기