PHpullh
학습 라이브러리/Go/임베딩으로 상속 흉내내기

GO · 구조체/인터페이스

임베딩으로 상속 흉내내기

Go는 상속이 없지만 구조체 임베딩으로 코드 재사용과 다형성을 구현합니다. 합성(Composition) 패턴입니다.

구조체/인터페이스중급embeddingcompositionpolymorphisminterface

핵심 설명

Go는 상속이 없지만 구조체 임베딩으로 코드 재사용과 다형성을 구현합니다. 합성(Composition) 패턴입니다.

Go code

package main

import "fmt"

type Animal struct {
	Name string
}

func (a Animal) Speak() string {
	return a.Name + "이(가) 소리를 냅니다"
}

type Dog struct {
	Animal     // 임베딩
	Breed string
}

// 메서드 오버라이드
func (d Dog) Speak() string {
	return d.Name + ": 멍멍!"
}

type Cat struct {
	Animal
}

func (c Cat) Speak() string {
	return c.Name + ": 야옹~"
}

type Speaker interface {
	Speak() string
}

func main() {
	pets := []Speaker{
		Dog{Animal: Animal{Name: "바둑이"}, Breed: "진돗개"},
		Cat{Animal: Animal{Name: "나비"}},
	}
	for _, p := range pets {
		fmt.Println(p.Speak())
	}
}

학습 팁

임베딩 + 인터페이스 조합이 Go의 다형성 패턴입니다. 상속 대신 "작은 인터페이스 + 합성"을 사용하세요.

주의할 점

임베딩된 타입의 메서드는 외부 타입을 모릅니다. Animal.Speak()에서 Dog의 필드에 접근할 수 없습니다.

자주 묻는 질문

임베딩으로 상속 흉내내기란 무엇인가요?

Go는 상속이 없지만 구조체 임베딩으로 코드 재사용과 다형성을 구현합니다. 합성(Composition) 패턴입니다.

임베딩으로 상속 흉내내기 학습 시 주의할 점은 무엇인가요?

임베딩된 타입의 메서드는 외부 타입을 모릅니다. Animal.Speak() 에서 Dog 의 필드에 접근할 수 없습니다.