제네릭이란?
- 데이터의 타입을 일반화하는 것
- 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법
- 코드 중복을 줄이기 위해 사용
- 정적인 분석의 이점을 챙기면서, 많은 타입들이 단일 인터페이스와 구현을 공유할 수 있게 한다.
사용 이유
- 같은 유형의 코드를 작성하는 데 자료형이 다르다면 각 케이스마다의 코드를 작성해야 했다.
- 제네릭을 사용하면 해당 경우를 방지할 수 있다.
만약 제네릭이 없다면?
- n종류의 자료형에 대해 대응이 필요하다면 n개의 클래스를 작성해줘야 한다.
//s:클래스 작성
class IntSample {
late int _value;
int get value => _value;
set value(int value) => _value = value;
}
class DoubleSample {
late double _value;
double get value => _value;
set value(double value) => _value = value;
}
class StringSample {
late String _value;
String get value => _value;
set value(String value) => _value = value;
}
//e:클래스 작성
//s:메인
IntSample intSample = IntSample();
intSample.value = 7;
DoubleSample doubleSample = DoubleSample();
doubleSample.value = 7.0;
StringSample stringSample = StringSample();
stringSample.value = "7";
//e:메인
제네릭을 사용한다면?
- n종류의 자료형에 대해 대응이 필요해도 1개의 클래스만 작성하면 된다.
//s:클래스 작성
class Sample<T> {
late T _value;
T get value => _value;
set value(T value) => _value = value;
}
//e:클래스 작성
//s:메인
Sample<int> intSample = Sample();
intSample.value = 7;
Sample<double> doubleSample = Sample();
doubleSample.value = 7.0;
Sample<String> stringSample = Sample();
stringSample.value = "7";
//e:메인
작성 방법
//기본 형식
class 클래스명<T> {
}
//사용 예시
class GenericSample<T> {
}
선언 방법
//기본 형식
class 클래스명<자료형> 변수명 = 클래스명();
class 클래스명<자료형> 변수명 = 클래스명<자료형>();
//사용 예시
GenericSample<int> gs_i = GenericSample();
GenericSample<double> gs_d = GenericSample<double>();