- 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
- 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.
구조체 임베딩 사용하기
이재홍 http://www.pyrasis.com 2014.12.17 ~ 2015.02.07
Go 언어는 클래스를 제공하지 않으므로 상속 또한 제공하지 않습니다. 하지만 구조체에서 임베딩(Embedding)을 사용하면 상속과 같은 효과를 낼 수 있습니다.
간단하게 사람(Person)과 학생(Student) 구조체를 정의한 뒤 사람 구조체에는 인사(greeting) 함수를 작성했습니다.
type Person struct { // 사람 구조체 정의
name string
age int
}
func (p *Person) greeting() { // 인사(greeting) 함수 작성
fmt.Println("Hello~")
}
type Student struct {
p Person // 학생 구조체 안에 사람 구조체를 필드로 가지고 있음. Has-a 관계
school string
grade int
}
func main() {
var s Student
s.p.greeting() // Hello~
}
Student 구조체를 보면 p Person 필드가 들어있습니다. 이렇게 되면 구조체가 해당 타입을 가지고 있는(Has-a) 관계가 됩니다. 즉 "학생이 사람을 가지고 있다"가 됩니다. 따라서 greeting 함수를 호출할 때도 s.p.greeting()처럼 p 필드를 통해서 호출합니다.
이번에는 Student 구조체에 Person 구조체를 임베딩합니다.
type Person struct {
name string
age int
}
func (p *Person) greeting() {
fmt.Println("Hello~")
}
type Student struct {
Person // 필드명 없이 타입만 선언하면 포함(Is-a) 관계가 됨
school string
grade int
}
func main() {
var s Student
s.Person.greeting() // Hello~
s.greeting() // Hello~
}
Student 구조체에서 Person 필드를 정의할 때 필드명은 사용하지 않고, 구조체 타입만 지정했습니다. 이렇게 되면 구조체가 해당 타입을 포함하는(Is-a) 관계가 됩니다. 즉 "학생은 사람이다."가 됩니다. 따라서 greeting 함수를 호출할 때 s.Person.greeting()처럼 Person 구조체 타입을 통해서 호출하거나 s.greeting()처럼 바로 호출할 수 있습니다.
구조체 임베딩을 사용하면 다른 언어의 상속과 동일한 형태가 됩니다. 물론 구조체 안에 여러 개의 구조체를 임베딩하면 다중 상속도 구현할 수 있습니다. 하지만 Go 언어에서는 복잡한 다중 상속 대신 인터페이스를 주로 활용합니다. 인터페이스에 대해서는 뒤에서 자세히 설명하겠습니다.
구조체 임베딩을 할 때 필드명을 사용하지 않는 필드를 익명 필드(anonymous field)라고 합니다.
저작권 안내
이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.- 블로그, 게시판 등에 퍼가는 것을 금지합니다.
- 비공개 포스트에 퍼가는 것을 금지합니다.
- 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
- 링크 및 SNS 공유는 허용합니다.