안녕하세요, 오늘은 Golang의 제네릭과 인터페이스에 중점을 두어 더 다양한 구체적인 예제를 통해 설명하겠습니다. 제네릭과 인터페이스는 Golang의 강력한 기능으로, 이러한 특성을 이해하면 코드를 더 효과적으로 작성할 수 있습니다. 그럼 시작해 봅시다.
제네릭이란 무엇인가요?
제네릭은 다른 데이터 유형에 대해 공통 알고리즘 또는 데이터 구조를 사용하기 위한 메커니즘입니다. 이를 통해 코드의 재사용성이 향상되며, 유형 안전성이 유지됩니다.
다음은 제네릭을 사용하여 단순한 슬라이스 반전 함수의 예입니다.
package main
import "fmt"
func Reverse[T any](s []T) []T {
for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
s[i], s[j] = s[j], s[i]
}
return s
}
func main() {
ints := []int{1, 2, 3, 4, 5}
reversedInts := Reverse(ints)
fmt.Println(reversedInts)
strings := []string{"apple", "banana", "cherry"}
reversedStrings := Reverse(strings)
fmt.Println(reversedStrings)
}
이 예제에서는 Reverse
함수를 제네릭을 사용하여 일반적으로 구현하고 있습니다. 이 코드는 int 형식의 슬라이스 뿐만 아니라 string 형식의 슬라이스에도 적용할 수 있습니다.
인터페이스와 제네릭의 결합
제네릭을 사용하면 다양한 유형의 데이터에 대한 공통 작업을 수행할 수 있지만, 인터페이스와 결합하여 더 많은 유연성을 제공할 수 있습니다. 다음은 그 예입니다.
package main
import (
"fmt"
)
type Shape interface {
Area() float64
}
type Rectangle struct {
Width float64
Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14 * c.Radius * c.Radius
}
func CalculateArea[T Shape](shape T) float64 {
return shape.Area()
}
func main() {
rectangle := Rectangle{Width: 5, Height: 10}
circle := Circle{Radius: 7}
fmt.Printf("직사각형 넓이: %.2f\n", CalculateArea(rectangle))
fmt.Printf("원 넓이: %.2f\n", CalculateArea(circle))
}
이 코드에서는 Shape
인터페이스를 정의하고 Rectangle
및 Circle
구조체가 해당 인터페이스를 구현하도록 하고 있습니다. 제네릭을 사용하여 CalculateArea
함수를 정의하여 다양한 모양에 대한 일반적인 넓이 계산을 수행할 수 있습니다.
요약
제네릭과 인터페이스는 Golang에서 효과적이고 유연한 코드 작성을 위한 강력한 도구입니다. 이 글에서는 구체적인 코드 예제를 통해 이러한 기능을 설명하였습니다. 제네릭과 인터페이스를 결합하여 코드의 재사용성과 유형 안전성을 더욱 향상시킬 수 있습니다. 여러분의 프로젝트에 적용해 보시기를 권장합니다.