Go 언어 12강 - 임베딩과 인터페이스 확장

 

📘 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는 상속 대신 임베딩, 복잡한 설계 대신 조합으로 해결한다!"