[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
}
Dog
와 Cat
구조체는 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 언어에서 다중 상속을 명시적으로 지원하지 않지만, 임베딩된 메소드를 활용하여 다중 상속과 비슷한 효과를 얻을 수 있습니다. 이를 통해 코드의 재사용성과 유연성을 높일 수 있으며, 객체지향 프로그래밍에서의 다중 상속의 장점을 얻을 수 있습니다.
참고 자료:
- The Go Programming Language Specification - Struct types
- Effective Go - Embedding
- Composition with Go