📘 Go 언어 12강 - 임베딩과 인터페이스 확장
Go에는 클래스 상속이 없지만, 임베딩(Embedding)을 통해 유사한 기능을 구현할 수 있습니다.
또한 인터페이스를 확장</strong하여 더 복잡한 구조를 만들 수 있습니다.
1️⃣ 구조체 임베딩
type Animal struct {
name string
}
func (a Animal) Speak() {
fmt.Println(a.name, "이(가) 소리를 냅니다.")
}
type Dog struct {
Animal // 임베딩 (상속 유사)
breed string
}
Dog
는 별도 선언 없이 Animal
의 메서드와 필드를 사용할 수 있습니다.
2️⃣ 사용 예시
d := Dog{
Animal: Animal{name: "바둑이"},
breed: "진돗개",
}
d.Speak() // 바둑이 이(가) 소리를 냅니다.
fmt.Println("견종:", d.breed)
3️⃣ 인터페이스 확장
여러 인터페이스를 조합하여 새로운 인터페이스를 만들 수 있습니다.
type Walker interface {
Walk()
}
type Runner interface {
Run()
}
type Athlete interface {
Walker
Runner
}
💡 예제 1: 구조체 임베딩 후 메서드 호출
type Person struct {
name string
}
func (p Person) Introduce() {
fmt.Println("안녕하세요,", p.name, "입니다.")
}
type Student struct {
Person
grade int
}
func main() {
s := Student{Person: Person{name: "철수"}, grade: 2}
s.Introduce()
fmt.Println("학년:", s.grade)
}
💡 예제 2: 인터페이스 확장
type Walker interface {
Walk()
}
type Runner interface {
Run()
}
type Athlete interface {
Walker
Runner
}
type Human struct{}
func (h Human) Walk() {
fmt.Println("걷는 중")
}
func (h Human) Run() {
fmt.Println("뛰는 중")
}
func play(a Athlete) {
a.Walk()
a.Run()
}
func main() {
h := Human{}
play(h)
}
🧠 요약
- 구조체 임베딩은 상속처럼 작동하되 훨씬 간단함
- 인터페이스는 다른 인터페이스를 포함하여 확장 가능
- Go는 조합(composition) 중심 설계를 선호
한 줄 요약: "Go는 상속 대신 임베딩, 복잡한 설계 대신 조합으로 해결한다!"