클래스나 메소드에서 사용할 내부 타입을 컴파일 순간에 지정하는 방법으로, 타입을 일반화하는 것을 의미한다.
func addInt(a int, b int) int {
return a * b
}
func addInt64(a int64, b int64) int64 {
return a * b
}
func addFloat64(a float64, b float64) float64 {
return a * b
}
위와 같이 동일한 동작을 하지만, 타입이 다른 여러개의 함수를 생성할 때,
Number 라는 타입을 지정하여 제네릭 함수를 만들 수 있다.
type Number interface {
int | int64 | float64
}
func addGeneric[T Number](a, b T) T {
return a * b
}
이 Number라는 타입은 int, int64, float64중 하나의 타입을 가지며, 컴파일 순간 3가지 타입에 대해 서로다른 3개의 함수를 정의하고, 함수에 들어오는 입력에 따라 타입을 결정한다.
제네릭으로 생성한 함수나 타입은 하나의 함수나 타입처럼 보이지만, 실제로는 컴파일 타임에 사용한 타입 파라미터별로 새로운 함수나 타입을 생성해서 사용하게 된다. 따라서 제네릭 프로그래밍을 많이 사용할 경우 컴파일 타임에 생성해야하는 함수와 타입 갯수가 늘어난다. 이로 인해 컴파일 시간이 증가하고 프로그램의 크기가 커진다.