[기초] Flutter Generic
제네릭은 실제 실행이 될 때 데이터 타입을 정하는 방식임.
제네릭(Generics)은 프로그래밍 언어에서 타입을 매개변수화하여 코드의 재사용성을 높이고 타입 안정성을 제공하는 기능임. Dart와 같은 객체 지향 언어에서 제네릭을 사용하면 다양한 데이터 타입에 대해 유연하고 안전한 코드를 작성할 수 있음. 아래에서 제네릭의 개념과 주요 특징에 대해 설명함.
1. 제네릭의 정의
제네릭은 클래스, 메서드, 인터페이스 등을 정의할 때 데이터 타입을 매개변수로 받아들이는 방식임. 이를 통해 여러 데이터 타입에 대해 동일한 코드를 사용할 수 있음.
목차
2. 제네릭의 이점
타입 안전성: 제네릭을 사용하면 컴파일 시 타입 검사를 수행할 수 있어, 런타임 오류를 줄일 수 있음.
코드 재사용성: 다양한 타입에 대해 동일한 로직을 사용할 수 있어 코드 중복을 줄일 수 있음.
가독성 향상: 제네릭을 사용하여 코드의 의도를 명확하게 표현할 수 있음.
제네릭 클래스 예제
class Box<T> {
T item;
Box(this.item);
T getItem() {
return item;
}
}
void main() {
var intBox = Box<int>(10);
print(intBox.getItem()); // 10
var stringBox = Box<String>(“Hello”);
print(stringBox.getItem()); // Hello
}
박스 클레스의 데이터 타입을 제네릭으로 선언 하고 아래쪽에서 메인에서 받을 때 int형으로 선언해서 받아줌.
제네릭 메서드 예제
T getFirstElement<T>(List<T> list) {
return list[0];
}
void main() {
var numbers = [1, 2, 3];
var firstNumber = getFirstElement(numbers);
print(firstNumber); // 1
var strings = [“a”, “b”, “c”];
var firstString = getFirstElement(strings);
print(firstString); // a
}
제네릭 제한 두기
class Animal {}
class Dog extends Animal {}
class Box<T extends Animal> {
T item;
Box(this.item);
}
void main() {
var dogBox = Box<Dog>(Dog()); // 가능
// var stringBox = Box<String>(“Hello”); // 오류: String은 Animal을 상속받지 않음
}
제네릭 컬렉션
Dart에서 List, Map과 같은 컬렉션은 제네릭을 사용하여 타입을 명시할 수 있음. 이로 인하여 코드의 데이터 타입의 안정성을 높일 수 있음.
List<int> numbers = [1, 2, 3]; // List의 타입을 int로 지정
Map<String, int> scores = {‘Alice’: 90, ‘Bob’: 80}; // Map의 키는 String, 값은 int