🔥 타입 파라미터

338자
4분

Go 언어에서는 제네릭(Generic) 함수를 사용하여 다양한 타입에 대해 유연하게 작업할 수 있습니다. 제네릭 함수의 타입 파라미터는 함수 인자 앞에 대괄호([]) 안에 작성합니다.

go
func Index[T comparable](s []T, x T) int
 
go
func Index[T comparable](s []T, x T) int
 

위의 선언은 scomparable 제약 조건을 충족하는 어떤 타입 T의 슬라이스임을 의미합니다. x 또한 동일한 타입의 값입니다.

comparable은 유용한 제약 조건으로, ==!= 연산자를 사용하여 값을 비교할 수 있게 해줍니다. 이 예제에서는 일치하는 값을 찾을 때까지 슬라이스의 모든 요소와 값을 비교하는 데 사용됩니다. 이 Index 함수는 비교를 지원하는 모든 타입에 대해 동작합니다.

go
package main
 
import "fmt"
 
// Index returns the index of x in s, or -1 if not found.
func Index[T comparable](s []T, x T) int {
	for i, v := range s {
		// v and x are type T, which has the comparable
		// constraint, so we can use == here.
		if v == x {
			return i
		}
	}
	return -1
}
 
func main() {
	// Index works on a slice of ints
	si := []int{10, 20, 15, -10}
	fmt.Println(Index(si, 15))
 
	// Index also works on a slice of strings
	ss := []string{"foo", "bar", "baz"}
	fmt.Println(Index(ss, "hello"))
}
 
go
package main
 
import "fmt"
 
// Index returns the index of x in s, or -1 if not found.
func Index[T comparable](s []T, x T) int {
	for i, v := range s {
		// v and x are type T, which has the comparable
		// constraint, so we can use == here.
		if v == x {
			return i
		}
	}
	return -1
}
 
func main() {
	// Index works on a slice of ints
	si := []int{10, 20, 15, -10}
	fmt.Println(Index(si, 15))
 
	// Index also works on a slice of strings
	ss := []string{"foo", "bar", "baz"}
	fmt.Println(Index(ss, "hello"))
}
 

위의 코드에서 Index 함수는 다음과 같이 동작합니다:

  1. Index 함수는 제네릭 타입 파라미터 T를 사용하여 선언되었습니다. 이는 Tcomparable 제약 조건을 충족해야 함을 의미합니다.
  2. 함수는 타입 T의 슬라이스 s와 타입 T의 값 x를 매개변수로 받습니다.
  3. for 루프를 사용하여 슬라이스 s의 각 요소 v와 인덱스 i를 순회합니다.
  4. 각 반복에서 vx를 비교하여 일치하는 값을 찾습니다. vxcomparable 제약 조건을 충족하므로 == 연산자를 사용할 수 있습니다.
  5. 일치하는 값이 발견되면 해당 인덱스 i를 반환합니다.
  6. 슬라이스 전체를 순회한 후에도 일치하는 값이 없으면 -1을 반환합니다.

main 함수에서는 Index 함수를 다양한 타입의 슬라이스에 적용하여 사용하는 방법을 보여줍니다:

  1. 정수 슬라이스 si에 대해 Index 함수를 호출하여 값 15의 인덱스를 찾습니다.
  2. 문자열 슬라이스 ss에 대해 Index 함수를 호출하여 값 "hello"의 인덱스를 찾습니다. 이 경우 "hello"는 슬라이스에 존재하지 않으므로 -1을 반환합니다.

이렇게 제네릭 함수를 사용하면 코드의 중복을 줄이고 다양한 타입에 대해 유연하게 작업할 수 있습니다. 제네릭 함수는 타입 안전성을 유지하면서도 코드의 재사용성을 높여줍니다.

YouTube 영상

채널 보기
미들웨어 vs 가드, 왜 NestJS에서는 가드가 더 똑똑할까? | NestJS 가이드
NestJS 인터셉터란? | NestJS 가이드
NestJS 커스텀 데코레이터 인자 전달 및 파이프 검증 활용법 | NestJS 가이드
함수 객체의 보편적 구성 | 프로그래머를 위한 카테고리 이론
NestJS 커스텀 데코레이터, createParamDecorator 사용 | NestJS 가이드
NestJS 인터셉터에서 map 연산자로 응답을 변환하는 방법 | NestJS 가이드
인터셉터와 RxJS로 캐시 시스템 구축하기 | NestJS 가이드
입력을 전처리하는 Functor - Contravariant와 contramap 이해하기 | 프로그래머를 위한 카테고리 이론