본문 바로가기
Go

golang 상속? 임베딩?

by 참새는 짹짹 2021. 1. 8.

임베딩


go 언어에는 상속이 없다

대신 임베딩을 통한 조합으로 상속과 유사한 효과를 볼 수 있다

표현
type SmartPhone struct {
    Navigation
}

위와 같이 구조체 안에 변수명 없이 타입명만 정의 하는 것으로 그 타입(구조체)을 임베딩할 수가 있다

만일 SmartPhone이 변수명 있는 Navigation 타입의 멤버를 갖는다고 해보자

type SmartPhone struct {
    navi Navigation
}

이 때 SmartPhone에서 멤버 navi가 갖고 있는 Navigate()을 그대로 사용하고 싶다면 다음과 같이

함수를 만들 수 있다

func (sp SmartPhone) Navigate() {
    return sp.navi.Navigate()
}

그럼 아래와 같이 SmartPhone에서 Navigate() 사용할 수 있다

func main() {
		sp := SmartPhone{Navigation{}}
		sp.Navigate()
}

💡
여기서 만일 SmartPhone에서 Navigate()함수를 만들지 않고도 혹은 자동으로 만들어 주어 navi의 Navigate()를 사용할 수 있다면

마치 SmartPhone이 Navigation을 상속 받은 것과 같은 효과를 갖게 된다


다시 처음으로 돌아가서 임베딩을 하면

즉, 변수명 없이 타입명만 정의하게 되면 이게 가능해진다

따라서, 겉보기엔 상속과 같지만

같은 함수명으로 구조체 멤버의 함수를 호출해준다고

이해할 수 있다

참고


golangkorea/effective-go
Go는 전형적인, 타입주도형의 subclassing을 제공하지 않는다. 하지만 struct나 인터페이스안에 타입을 임베딩함으로써 구현체의 일부를 "빌리는"것은 가능하다. 인터페이스 임베딩은 매우 간단하다. 이미 언급된 바 있는 io.Reader와 io.Writer 인터페이스의 정의를 살펴보자. io패키지는 다수의 또 다른 인터페이스들을 노출시키고 있는데, 다수의 메서드를 구현할 수 있는 객체를 명시하는데 쓴다. 예를 들어, io.ReadWriter는 Read와 Write를 모두 가지고 있다.
https://github.com/golangkorea/effective-go/blob/master/embedding.md


'Go' 카테고리의 다른 글

golang 리시버  (0) 2021.02.14
Go run, build, install?  (0) 2021.01.20
Go modules  (0) 2021.01.19

댓글