[go] Go 언어에서 임베딩된 메소드의 다중 상속

Go 언어는 클래스 기반이 아닌 구조체 기반의 언어이기 때문에, 명시적으로 다중 상속을 지원하지 않습니다. 하지만 임베딩된 메소드를 통해 다중 상속과 비슷한 효과를 얻을 수 있습니다.

임베딩된 메소드는 한 구조체를 다른 구조체에 포함시키는 것을 말합니다. 이를 통해 내장된 구조체에 정의된 메소드를 사용할 수 있게 되며, 이는 상속과 비슷한 효과를 제공합니다.

임베딩된 메소드

아래 예제에서는 Animal 구조체에 Move() 메소드가 정의되어 있습니다. Animal을 임베딩한 Dog 구조체와 Cat 구조체는 Move() 메소드를 사용할 수 있습니다.

type Animal struct {
    name string
}

func (a *Animal) Move() {
    fmt.Println(a.name, "is moving")
}

type Dog struct {
    Animal
}

type Cat struct {
    Animal
}

func main() {
    dog := Dog{Animal{name: "Dog"}}
    dog.Move()  // Dog is moving

    cat := Cat{Animal{name: "Cat"}}
    cat.Move()  // Cat is moving
}

DogCat 구조체는 Animal 구조체를 임베딩함으로써 Move() 메소드를 상속받았습니다.

다중 임베딩

Go 언어에서는 다중 상속과 비슷한 효과를 위해 다중 임베딩을 할 수 있습니다. 즉, 하나의 구조체에 여러 구조체를 임베딩할 수 있습니다.

아래 예제에서는 Car 구조체에 Vehicle 구조체와 Engine 구조체를 임베딩했습니다.

type Vehicle struct {
    brand string
}

func (v *Vehicle) Start() {
    fmt.Println(v.brand, "is starting")
}

type Engine struct {
    hp int
}

func (e *Engine) Run() {
    fmt.Println("Engine is running with", e.hp, "hp")
}

type Car struct {
    Vehicle
    Engine
}

func main() {
    car := Car{
        Vehicle: Vehicle{brand: "BMW"},
        Engine:  Engine{hp: 200},
    }

    car.Start() // BMW is starting
    car.Run()   // Engine is running with 200 hp
}

위 예제에서 Car 구조체는 Vehicle 구조체와 Engine 구조체를 임베딩하여 Start()Run() 메소드를 상속받았습니다.

결론

Go 언어에서 다중 상속을 명시적으로 지원하지 않지만, 임베딩된 메소드를 활용하여 다중 상속과 비슷한 효과를 얻을 수 있습니다. 이를 통해 코드의 재사용성과 유연성을 높일 수 있으며, 객체지향 프로그래밍에서의 다중 상속의 장점을 얻을 수 있습니다.

참고 자료: