[go] Go 언어에서 메소드와 인터페이스

Go 언어는 메소드와 인터페이스를 사용하여 객체 지향 프로그래밍을 지원합니다. 메소드는 특정 타입에 속한 함수이며, 인터페이스는 메소드의 집합으로 타입을 정의합니다. 이러한 기능들은 Go 언어의 강력한 기능 중 하나로, 코드 재사용성과 유연성을 높여줍니다.

메소드

Go 언어에서 메소드는 특정 타입에 연결된 함수입니다. 메소드는 해당 타입의 값을 수신자(receiver)로 받아들이는데, 이를 통해 해당 타입의 값을 조작하거나 반환할 수 있습니다.

type Rectangle struct {
    width  float64
    height float64
}

func (r Rectangle) Area() float64 {
    return r.width * r.height
}

func main() {
    rect := Rectangle{10, 5}
    area := rect.Area()
    fmt.Println("사각형의 넓이:", area)
}

위의 예제에서 Area() 메소드는 Rectangle 타입의 값을 수신자로 받아들이고, 해당 타입의 너비와 높이를 사용하여 넓이를 계산하여 반환합니다.

인터페이스

Go 언어에서 인터페이스는 메소드의 집합으로써, 타입을 정의하는 역할을 합니다. 즉, 인터페이스는 다른 타입들이 구현해야 하는 메소드들의 명세서입니다.

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)
}

func main() {
    rect := Rectangle{10, 5}
    printInfo(rect)
}

func printInfo(s Shape) {
    area := s.Area()
    perimeter := s.Perimeter()
    fmt.Println("넓이:", area)
    fmt.Println("둘레:", perimeter)
}

위의 예제에서 Shape 인터페이스는 Area()Perimeter()라는 두 개의 메소드를 명세하고 있습니다. printInfo() 함수는 Shape 인터페이스를 매개변수로 받아들이는데, 이는 printInfo() 함수에 어떤 타입이든지 인터페이스에서 정의한 메소드를 구현하는 경우에 호출될 수 있다는 것을 의미합니다.

이를 통해, Rectangle 타입을 Shape 인터페이스로 사용하여 printInfo() 함수에서 해당 타입의 넓이와 둘레를 출력할 수 있습니다.

결론

Go 언어는 메소드와 인터페이스를 통해 객체 지향 프로그래밍을 지원합니다. 이를 통해 코드의 재사용성과 유연성을 높일 수 있으며, 타입에 맞는 메소드를 정의하여 해당 타입의 동작을 구현할 수 있습니다.