본문 바로가기
Dart/Study

Dart에서 Generics 쉽게 이해하기

by Maccrey Coding 2024. 8. 4.
728x90
반응형

 

 

Generics(제네릭)는 프로그래밍에서 여러 타입의 데이터를 다룰 때 사용됩니다.

Dart에서 제네릭을 사용하면 특정 타입에 종속되지 않는 코드를 작성할 수 있어, 코드의 재사용성을 높이고 타입 안전성을 유지할 수 있습니다.

1. Generics란?

Generics는 다양한 데이터 타입을 처리할 수 있도록 해주는 도구입니다.

쉽게 말해, 제네릭을 사용하면 여러 가지 타입을 사용할 수 있는 코드를 작성할 수 있습니다.

예를 들어, Dart의 List 클래스는 제네릭을 사용하여 다양한 타입의 데이터를 담을 수 있습니다.

예시: 리스트(List)

List<int> intList = [1, 2, 3]; // 정수 리스트
List<String> stringList = ["Hello", "World"]; // 문자열 리스트
List<double> doubleList = [1.0, 2.0, 3.0]; // 실수 리스트

 

위 예시에서 List<int>는 정수를 담을 수 있는 리스트이고, List<String>은 문자열을 담을 수 있는 리스트입니다.

이처럼 리스트는 어떤 타입의 데이터도 담을 수 있도록 제네릭으로 설계되어 있습니다.

2. 제네릭 클래스 만들기

제네릭 클래스를 사용하면 여러 타입의 데이터를 처리할 수 있는 클래스를 만들 수 있습니다.

예를 들어, 다양한 타입의 데이터를 저장하는 Box 클래스를 만들어 보겠습니다.

예시: 제네릭 클래스

class Box<T> {
  T? _value; // T 타입의 값을 저장

  void setValue(T value) {
    _value = value;
  }

  T? getValue() {
    return _value;
  }
}

void main() {
  Box<int> intBox = Box<int>();
  intBox.setValue(123);
  print(intBox.getValue()); // 123

  Box<String> stringBox = Box<String>();
  stringBox.setValue("Hello");
  print(stringBox.getValue()); // Hello

  Box<double> doubleBox = Box<double>();
  doubleBox.setValue(3.14);
  print(doubleBox.getValue()); // 3.14
}

위 예제에서 Box<T>는 제네릭 클래스로, T는 타입 매개변수를 의미합니다.

이 클래스는 정수, 문자열, 실수 등 다양한 타입의 데이터를 저장할 수 있습니다.

사용자가 Box를 사용할 때 T를 원하는 타입으로 설정하면 됩니다.

3. 제네릭 함수 만들기

제네릭 함수는 여러 타입을 처리할 수 있는 함수를 의미합니다. 함수의 매개변수나 반환값의 타입을 제네릭으로 정의할 수 있습니다.

예시: 제네릭 함수

T chooseFirst<T>(T a, T b) {
  return a;
}

void main() {
  print(chooseFirst<int>(1, 2)); // 1
  print(chooseFirst<String>("Apple", "Banana")); // "Apple"
  print(chooseFirst<bool>(true, false)); // true
}

위 예제에서 chooseFirst<T> 함수는 두 개의 같은 타입의 인자를 받아 첫 번째 인자를 반환합니다. 제네릭 타입 T를 사용해 정수, 문자열, 불리언 등 다양한 타입을 처리할 수 있습니다.

4. 제네릭 타입 제한하기

때로는 제네릭을 사용할 때 특정 타입만 허용하고 싶을 수 있습니다. 이를 "제네릭 타입 제한"이라고 합니다.

예시: 제네릭 타입 제한

class NumberBox<T extends num> {
  T? _value;

  void setValue(T value) {
    _value = value;
  }

  T? getValue() {
    return _value;
  }
}

void main() {
  NumberBox<int> intBox = NumberBox<int>();
  intBox.setValue(10);
  print(intBox.getValue()); // 10

  NumberBox<double> doubleBox = NumberBox<double>();
  doubleBox.setValue(5.5);
  print(doubleBox.getValue()); // 5.5

  // NumberBox<String> stringBox = NumberBox<String>(); // 오류 발생: num을 상속하지 않음
}

위 코드에서 NumberBox<T extends num>은 제네릭 타입 T가 반드시 숫자(num) 타입이어야 한다는 것을 의미합니다.

따라서 NumberBox는 정수(int)와 실수(double) 타입을 허용하지만, 문자열(String)은 허용하지 않습니다.

5. 제네릭의 장점

  • 코드 재사용성: 제네릭을 사용하면 같은 코드로 다양한 타입을 처리할 수 있어, 코드를 재사용할 수 있습니다.
  • 타입 안전성: 제네릭을 사용하면 컴파일 시점에 타입 검사를 할 수 있어, 런타임 에러를 줄일 수 있습니다.

마치며

이번 포스트에서는 Dart에서의 Generics를 쉽게 이해할 수 있도록 설명했습니다.

Generics는 다양한 타입을 처리할 수 있게 해주는 중요한 기능으로, Dart에서의 코딩을 더욱 유연하고 안전하게 만들어줍니다.

실습을 통해 제네릭의 개념을 확실히 이해해 보세요!

 

Starting Google Play App Distribution! "Tester Share" for Recruiting 20 Testers for a Closed Test.

 

Tester Share [테스터쉐어] - Google Play 앱

Tester Share로 Google Play 앱 등록을 단순화하세요.

play.google.com

 

 

728x90
반응형