Flutter에선 변수,함수,클래스 에서 사용할 데이터 타입을 정해야 한다.
final int exampleValue
이런식으로 변수의 데이터 타입을 정해준다. 위의 exampleValue의 데이터 타입은 int (정수)값으로 정의되었고, 해당 값만 받아야 한다.
exampleValue = 10 // 정수 10을 할당했기에 맞다.
exampleValue = '글자당' // 텍스트 타입을 할당했기에 틀렸다.
그런데 Generic(제네릭)이란 개념을 사용하면,
변수를 정의할 때(코드 작성 시), 데이터 타입을 결정할 필요가 없다.
즉 그 변수를 사용할 때(실행 시) 데이터 타입을 결정하고 알맞은 값을 할당하면 된다.
제네릭은 코드의 재사용성을 높이고, 유연성과 타입 안전성을 제공하기 위해 사용됩니다.
예를 들어, 특정 타입의 데이터를 저장하는 List가 있다고 가정할 때, List로 선언하면 해당 리스트는 오직 int 타입의 데이터만 저장할 수 있습니다.
제네릭을 사용하면 이러한 리스트, 맵, 또는 클래스들이 특정 타입에 의존하지 않도록 유연하게 설계할 수 있습니다.
// 제네릭을 사용하지 않은 경우
class NonGenericBox {
final int value;
NonGenericBox(this.value);
//.value를 이용하면 해당 클래스안에서 value 변수를 찾아서 value에 할당된 값을 반환해준다.
}
// 제네릭을 사용하는 경우
class GenericBox<T> {
final T value;
GenericBox(this.value);
}
위의 코드에서 NonGenericBox는 int 타입만을 저장할 수 있지만, GenericBox는 T라는 제네릭 타입을 사용하여 어떤 타입이든 저장할 수 있습니다.
void main() {
// int 타입의 박스
var intBox = GenericBox<int>(10);
// String 타입의 박스
var stringBox = GenericBox<String>("Hello");
print(intBox.value); // 10
print(stringBox.value); // Hello
}
위의 예에서 GenericBox는 int 타입만 받도록, GenericBox은 String 타입만 받도록 제네릭 타입을 설정했습니다. 이렇게 제네릭을 사용하면 다양한 타입을 사용하는 코드를 보다 안전하고 효율적으로 관리할 수 있습니다.
결과적으로, 제네릭은 타입 안정성을 보장하고, 다양한 타입을 다루는 코드를 작성할 때 코드 중복을 줄이도록 돕는 중요한 기능입니다.