서문
Golang이 드디어 제네릭을 도입하면서 프로그래밍 세계에 새로운 바람을 불어넣었습니다. 이 글에서는 Golang의 제네릭이 가져다주는 편리함과 그 구체적인 사용법을 실제 코드 예시와 함께 설명해 드리겠습니다.
제네릭이란 무엇인가?
Golang에서는 버전 1.18부터 기대되었던 제네릭 기능이 도입되었습니다. 제네릭이란, 타입을 매개변수화하여 더 일반적이고 재사용 가능한 코드를 실현하기 위한 기능입니다.
제네릭의 기본적인 사용법
코드 예제 1: 맵의 리듀스 함수
package main
import "fmt"
func Reduce[T any](s []T, init T, f func(T, T) T) T {
acc := init
for _, v := range s {
acc = f(acc, v)
}
return acc
}
func main() {
ints := []int{1, 2, 3, 4, 5}
sum := Reduce(ints, 0, func(a, b int) int { return a + b })
fmt.Println("합계:", sum)
}
이 코드에서는 어떤 타입 T
의 슬라이스를 받아들여 그것을 하나의 값으로 통합하는 리듀스 함수를 구현하고 있습니다.
코드 예제 2: 범용 스택 구조
package main
import "fmt"
type Stack[T any] struct {
elements []T
}
func (s *Stack[T]) Push(v T) {
s.elements = append(s.elements, v)
}
func (s *Stack[T]) Pop() T {
if len(s.elements) == 0 {
panic("스택이 비어있습니다")
}
v := s.elements[len(s.elements)-1]
s.elements = s.elements[:len(s.elements)-1]
return v
}
func main() {
stack := Stack[int]{}
stack.Push(42)
stack.Push(23)
fmt.Println("팝:", stack.Pop())
fmt.Println("팝:", stack.Pop())
}
이 예제에서는 어떤 타입 T
에도 적용 가능한 범용 스택 구조를 구현하고 있습니다.
제네릭을 사용하는 장점
제네릭을 사용함으로써 코드의 재사용성과 가독성이 향상됩니다. 또한, 타입 안전성을 유지하면서 다양한 데이터 타입에 적합한 함수나 데이터 구조를 유연하게 설계할 수 있습니다.
결론
Golang에서 제네릭의 도입은 개발자에게 큰 이점을 제공합니다. 이 글을 통해 제네릭의 기본적인 사용 방법과 그 강력한 기능을 이해하고, 여러분의 코드에 활용하시기 바랍니다.