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.
'Dart > Study' 카테고리의 다른 글
Dart 언어로 서버 셋팅: 고급 기술 및 최적화 기법 (0) | 2024.08.06 |
---|---|
Dart 언어로 서버 셋팅: 고급 기술 가이드 (0) | 2024.08.06 |
DartPad: 웹에서 직접 Dart 프로그래밍을 체험해 보세요.[ IDE ] (0) | 2024.07.27 |
Dart로 서버 개발하기 (0) | 2024.07.13 |
Dart로 간단한 웹 서버 만들기: Shelf 패키지 사용법과 옵션 (0) | 2024.07.13 |