[go] 구조체(struct)의 상속과 다형성 개념

구조체(struct)는 Go 언어에서 데이터를 묶는 데 사용되는 개체입니다. 구조체는 다른 구조체로부터 상속을 받을 수는 없지만, 인터페이스(interface)를 사용하여 비슷한 효과를 낼 수 있습니다. 이를 통해 구조체의 다형성(polymorphism)을 구현할 수 있습니다.

구조체 상속

Go 언어는 명시적인 상속을 지원하지 않기 때문에 구조체 상속을 직접 지원하지 않습니다. 그러나 상속과 비슷한 효과를 내기 위해 구조체를 포함시키는 방식을 사용할 수 있습니다. 예를 들어, 아래와 같이 구조체를 정의할 수 있습니다.

type Person struct {
    name string
    age  int
}

type Employee struct {
    Person     // Person 구조체 포함
    department string
}

위의 예제에서 Employee 구조체는 Person 구조체를 포함하고 있습니다. 이를 통해 Employee는 Person의 속성과 메서드에 접근할 수 있습니다.

다형성

다형성은 객체지향 프로그래밍의 핵심 개념 중 하나로, 하나의 인터페이스를 구현하는 여러 구조체가 다양한 방식으로 동작할 수 있음을 의미합니다. Go 언어는 인터페이스를 사용하여 다형성을 구현합니다.

type Shape interface {
    Area() float64
}

type Rectangle struct {
    width  float64
    height float64
}

type Circle struct {
    radius float64
}

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

func (c Circle) Area() float64 {
    return math.Pi * c.radius * c.radius
}

위의 예제에서 Shape 인터페이스를 정의하고, 이를 구현하는 Rectangle과 Circle 구조체를 정의합니다. 각 구조체는 Area() 메서드를 구현하고 있으며, 이를 통해 다형성을 구현할 수 있습니다.

func PrintArea(s Shape) {
    area := s.Area()
    fmt.Println("도형의 넓이:", area)
}

func main() {
    rect := Rectangle{width: 10, height: 5}
    PrintArea(rect) // "도형의 넓이: 50" 출력

    circle := Circle{radius: 5}
    PrintArea(circle) // "도형의 넓이: 78.53981633" 출력
}

위의 예제에서는 PrintArea() 함수를 통해 다양한 형태의 도형을 처리할 수 있습니다. 이를 통해 인터페이스를 이용한 다형성을 구현할 수 있습니다.

결론

Go 언어에서는 구조체의 상속을 직접적으로 지원하지 않지만, 구조체 내에 다른 구조체를 포함시켜 비슷한 효과를 얻을 수 있습니다. 또한, 인터페이스를 이용하여 다형성을 구현할 수 있습니다. 이를 통해 프로그램을 더 유연하고 확장 가능하게 만들 수 있습니다.

참고: