Go 언어는 인터페이스를 사용하여 코드의 유연성과 재사용성을 높이는 강력한 도구를 제공합니다. 이 글에서는 Go의 인터페이스에 대한 개념을 소개하고, 실제 코드 예제를 통해 어떻게 활용할 수 있는지 설명합니다.
인터페이스란?
Go 언어의 인터페이스는 메서드 집합을 정의하는데 사용됩니다. 인터페이스는 메서드의 시그니처만을 나열하며, 실제 메서드의 내용은 인터페이스를 구현하는 구조체나 사용자 정의 타입에서 제공됩니다. 인터페이스를 사용하면 코드 간에 일관성 있는 메서드 집합을 정의하고, 다형성을 구현하는 데 도움이 됩니다.
인터페이스 정의
인터페이스는 다음과 같이 정의됩니다:
type Shape interface {
Area() float64
Perimeter() float64
}
위의 코드에서 Shape
인터페이스는 Area()
와 Perimeter()
두 개의 메서드를 정의합니다. 이러한 메서드를 구현하는 어떤 타입도 Shape
인터페이스를 따를 수 있습니다.
인터페이스 구현
어떤 타입이 인터페이스를 구현하려면, 해당 인터페이스의 모든 메서드를 구현해야 합니다. 예를 들어, 다음은 Rectangle
구조체가 Shape
인터페이스를 구현하는 방법을 보여줍니다
type Rectangle struct {
Width float64
Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
func (r Rectangle) Perimeter() float64 {
return 2 * (r.Width + r.Height)
}
인터페이스 활용
인터페이스를 활용하여 다형성을 구현할 수 있습니다. 예를 들어, Calculate
함수를 사용하여 Shape
인터페이스를 따르는 모든 도형의 면적과 둘레를 계산할 수 있습니다
func Calculate(s Shape) {
area := s.Area()
perimeter := s.Perimeter()
fmt.Printf("Area: %f, Perimeter: %f\n", area, perimeter)
}
예제 코드
이제 위의 개념을 포함한 예제 코드를 보겠습니다. 예제 코드는 Shape
인터페이스를 구현하는 Rectangle
과 Circle
구조체를 정의하고, Calculate
함수를 사용하여 각 도형의 면적과 둘레를 계산합니다. 코드는 다음과 같습니다
package main
import "fmt"
type Shape interface {
Area() float64
Perimeter() float64
}
type Rectangle struct {
Width float64
Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
func (r Rectangle) Perimeter() float64 {
return 2 * (r.Width + r.Height)
}
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14159 * c.Radius * c.Radius
}
func (c Circle) Perimeter() float64 {
return 2 * 3.14159 * c.Radius
}
func Calculate(s Shape) {
area := s.Area()
perimeter := s.Perimeter()
fmt.Printf("Area: %f, Perimeter: %f\n", area, perimeter)
}
func main() {
r := Rectangle{Width: 5, Height: 4}
c := Circle{Radius: 3}
Calculate(r)
Calculate(c)
}
위의 예제 코드에서 Rectangle
과 Circle
은 Shape
인터페이스를 구현하고, Calculate
함수를 통해 면적과 둘레를 계산합니다. main
함수에서는 이러한 구조체를 사용하여 Calculate
함수를 호출합니다.
인터페이스는 Go 언어에서 다형성을 구현하는 데 강력한 기능으로 사용됩니다. 코드의 재사용성과 확장성을 향상시키며, 동시에 코드의 유연성을 제공합니다.
'Programming' 카테고리의 다른 글
[Django/React] 장고와 리액트 연동 (1) (0) | 2023.10.20 |
---|---|
[Java] 프록시 패턴(Proxy Pattern)이란? (0) | 2023.10.13 |
많이 사용되는 개발 프레임워크 및 라이브러리 (0) | 2023.10.13 |
@Transactional 애노테이션 : 주의사항 (0) | 2023.10.13 |
[Mybatis] #{}과 ${}의 차이 (0) | 2023.10.05 |
댓글