이번에는 Dart 제네릭(Generic)의 개념과 사용법을 설명하고, 이를 통해 프로그래밍에서의 코드 재사용성, 타입 안전성, 코드 간결성을 향상하는 방법에 대해 알아보겠습니다. 특히 Dart 언어에서의 제네릭 클래스와 함수 사용법을 구체적인 예시를 통해 쉽게 이해할 수 있도록 구성하였습니다.
Dart 제네릭 (Generic) 사용법
제네릭(Generic)은 "일반적인" 이라는 뜻을 가지고 있습니다. 프로그래밍에서 제네릭은 데이터 유형(Data Type)을 일반화하여 다양한 유형의 데이터를 처리할 수 있게 해주는 기능입니다. 제네릭을 사용하면 코드를 작성할 때 구체적인 데이터 유형을 지정하지 않고, 나중에 실행 시점에 데이터 유형을 결정할 수 있습니다.
왜 제네릭을 사용해야 할까?
제네릭을 사용하면 다음과 같은 장점이 있습니다.
- 재사용성 증가: 동일한 코드를 다양한 데이터 유형에 적용할 수 있습니다.
- 타입 안전성 보장: 컴파일 시점에 타입 검사를 수행하여 런타임 에러를 방지할 수 있습니다.
- 코드 간결성 향상: 반복적인 코드를 줄일 수 있어 코드가 더 간결해집니다.
제네릭 사용법
Dart에서 제네릭을 사용하려면 클래스나 함수 정의 시 `<>` 괄호 안에 타입 매개변수를 지정합니다. 타입 매개변수는 실제 데이터 유형을 나중에 결정할 수 있는 플레이스홀더 역할을 합니다.
제네릭 클래스 예시
class Box<T> {
T data;
Box(this.data);
String toString() => 'Box: $data';
}
void main() {
Box<int> boxInt = Box(42);
print(boxInt); // Box: 42
Box<String> boxString = Box('Hello, World!');
print(boxString); // Box: Hello, World!
}
위 예시에서 Box 클래스는 제네릭 클래스입니다. <T> 는 타입 매개변수로, 실제 데이터 유형을 나중에 결정할 수 있습니다. Box 객체를 생성할 때 실제 데이터 유형을 지정하면( Box<int> , Box<String> ) 해당 유형만 허용됩니다.
제네릭 함수 예시
T getFirst<T>(List<T> list) {
return list.first;
}
void main() {
print(getFirst<int>([1, 2, 3])); // 1
print(getFirst<String>(['Apple', 'Banana', 'Cherry'])); // Apple
}
위 예시에서 getFirst 함수는 제네릭 함수입니다. 함수 호출 시 <T> 안에 실제 데이터 유형을 지정하면, 해당 유형만 허용됩니다.
제네릭 제약 조건 (Constraints)
때로는 제네릭 타입에 제약 조건을 걸어야 할 수도 있습니다. 예를 들어, 특정 클래스를 상속받거나 특정 인터페이스를 구현해야 하는 경우입니다. 이때 extends 키워드를 사용합니다.
class Animal {}
class Dog extends Animal {}
class Cat extends Animal {}
class AnimalBox<T extends Animal> {
T data;
AnimalBox(this.data);
String toString() => 'AnimalBox: $data';
}
void main() {
AnimalBox<Dog> dogBox = AnimalBox(Dog());
print(dogBox); // AnimalBox: Instance of 'Dog'
// AnimalBox<String> stringBox = AnimalBox('Hello'); // 에러 발생
}
위 예시에서 AnimalBox 클래스의 제네릭 타입 T 는 Animal 클래스 또는 그 자식 클래스만 허용됩니다. 따라서 String 타입은 허용되지 않습니다.
다중 제네릭 타입 매개변수 사용하기
하나의 클래스나 함수에서 여러 개의 제네릭 타입 매개변수를 사용할 수 있습니다.
class Pair<T, U> {
T first;
U second;
Pair(this.first, this.second);
String toString() => 'Pair: $first, $second';
}
void main() {
Pair<int, String> pair = Pair(42, 'Hello');
print(pair); // Pair: 42, Hello
}
위 예시에서 Pair 클래스는 두 개의 타입 매개변수 T 와 U 를 가지고 있습니다. 객체 생성 시 각각의 타입을 지정할 수 있습니다.
제네릭은 프로그래밍에서 매우 유용한 기능입니다. 타입 안전성을 보장하면서도 코드 재사용성을 높일 수 있습니다. 입문자 단계에서는 제네릭의 개념과 기본적인 사용법을 익히는 것이 중요합니다. 앞으로 더 복잡한 프로그램을 작성하면서 제네릭의 유용성을 깨달을 수 있을 것입니다.
'프로그래밍 언어 > Dart' 카테고리의 다른 글
Dart Stream 사용법 및 예제 통한 비동기 처리와 필터링 프로그래밍 - Dart 기초 #18 (0) | 2024.06.24 |
---|---|
Dart 비동기 프로그래밍. Future와 async/await 사용법 및 예제 코드 - Dart 기초 #17 (0) | 2024.06.21 |
Dart Set 자료구조 이해하기. 셋 만들기와 사용법 - Dart 기초 #15 (0) | 2024.06.19 |
Dart Map 사용법 및 예제. 효율적인 데이터 관리를 위한 의 생성과 관리 방법 - Dart 기초 #14 (0) | 2024.06.18 |
Dart 리스트 사용법. 생성부터 추가, 제거, 정렬까지 완벽 가이드 - Dart 기초 #13 (0) | 2024.06.17 |