Go에서 구조체 상속을 이해
Takashi Yamamoto
Infrastructure Engineer · Leapcell

Key Takeaways
- Go는 클래스 기반 상속 대신 구조체 구성을 사용합니다.
- 임베디드 구조체는 필드와 메서드를 외부 구조체로 승격시킵니다.
- 인터페이스는 명시적인 상속 없이 다형성을 가능하게 합니다.
많은 객체 지향 프로그래밍 언어에서 상속은 새로운 클래스가 기존 클래스의 속성과 동작을 획득할 수 있도록 합니다. 그러나 Go(Golang)는 다른 접근 방식을 취합니다. 기존의 클래스 기반 상속 대신 Go는 구성을 활용하여 유사한 결과를 얻습니다. 이 기사에서는 Go의 구조체 구성이 어떻게 작동하는지, 그리고 이를 사용하여 복잡한 데이터 구조를 구축하는 방법을 탐구합니다.
Go의 구조체
Go에서 struct
는 변수를 단일 이름으로 그룹화하는 복합 데이터 유형입니다. 필드라고 하는 이러한 변수는 서로 다른 유형일 수 있습니다. 간단한 예는 다음과 같습니다.
package main import "fmt" type Person struct { Name string Age int } func main() { p := Person{Name: "Alice", Age: 30} fmt.Println(p) }
이 예에서 Person
은 Name
과 Age
라는 두 개의 필드가 있는 구조체입니다.
상속보다 구성
Go는 상속보다 구성 사용을 권장합니다. 계층적 클래스 구조를 만드는 대신 Go를 사용하면 간단한 클래스를 결합하여 복잡한 유형을 구축할 수 있습니다. 이는 구조체를 다른 구조체 내에 포함시켜 달성됩니다.
구조체 임베딩
구조체가 다른 구조체 내에 임베딩되면 임베디드 구조체의 필드와 메서드는 외부 구조체를 통해 접근할 수 있게 됩니다. 작동 방식은 다음과 같습니다.
package main import "fmt" type Address struct { City, State string } type Person struct { Name string Age int Address // Address 구조체 임베딩 } func main() { p := Person{ Name: "Bob", Age: 25, Address: Address{ City: "New York", State: "NY", }, } fmt.Println(p) fmt.Println("City:", p.City) // 임베디드 필드에 직접 접근 }
이 예에서 Person
은 Address
구조체를 임베딩합니다. 이는 Person
이 Address
의 필드를 상속하여 Person
인스턴스를 통해 City
및 State
에 직접 접근할 수 있음을 의미합니다.
메서드 승격
임베디드 구조체에 정의된 메서드는 외부 구조체로 승격됩니다. 이를 통해 외부 구조체는 임베디드 구조체의 메서드를 마치 자신의 메서드인 것처럼 접근할 수 있습니다.
package main import "fmt" type Address struct { City, State string } func (a Address) FullAddress() string { return a.City + ", " + a.State } type Person struct { Name string Age int Address } func main() { p := Person{ Name: "Charlie", Age: 28, Address: Address{ City: "Los Angeles", State: "CA", }, } fmt.Println(p.FullAddress()) // 임베디드 구조체의 메서드 호출 }
여기서 FullAddress
는 Address
의 메서드이지만 임베딩으로 인해 Person
에서 호출할 수 있습니다.
인터페이스 및 다형성
Go는 기존의 상속을 지원하지 않지만 다형성을 가능하게 하는 강력한 인터페이스 기능을 제공합니다. 인터페이스는 유형이 구현해야 하는 메서드 집합을 정의합니다. 이러한 메서드를 구현하는 모든 유형은 인터페이스를 충족합니다.
package main import "fmt" type Describer interface { Describe() string } type Person struct { Name string Age int } func (p Person) Describe() string { return fmt.Sprintf("%s는 %d살입니다.", p.Name, p.Age) } type Product struct { Name string Price float64 } func (p Product) Describe() string { return fmt.Sprintf("%s의 가격은 $%.2f입니다.", p.Name, p.Price) } func PrintDescription(d Describer) { fmt.Println(d.Describe()) } func main() { p := Person{Name: "Dave", Age: 22} pr := Product{Name: "Laptop", Price: 999.99} PrintDescription(p) PrintDescription(pr) }
이 예에서 Person
및 Product
유형은 모두 Describe
메서드를 정의하여 Describer
인터페이스를 구현합니다. PrintDescription
함수는 Describer
인터페이스를 충족하는 모든 유형을 허용하여 다형성을 보여줍니다.
결론
Go의 구조체 구성 및 인터페이스에 대한 접근 방식은 기존 상속 없이 유연하고 강력한 방법으로 유형을 구축하고 확장할 수 있도록 합니다. 구조체를 임베딩하고 인터페이스를 구현함으로써 유지 관리하고 이해하기 쉬운 복잡하고 재사용 가능한 코드 구조를 만들 수 있습니다.
FAQs
아니요, Go는 클래스 기반 상속보다는 구성에 의존합니다.
하나의 구조체를 다른 구조체 안에 임베딩하면 필드와 메서드가 외부 구조체로 승격됩니다.
인터페이스를 사용하여 필요한 메서드를 구현하는 모든 유형이 인터페이스를 충족합니다.
Go 프로젝트 호스팅을 위한 최고의 선택, Leapcell입니다.
Leapcell은 웹 호스팅, 비동기 작업 및 Redis를 위한 차세대 서버리스 플랫폼입니다.
다국어 지원
- Node.js, Python, Go 또는 Rust로 개발하세요.
무료로 무제한 프로젝트 배포
- 사용량에 따라서만 비용을 지불합니다. 요청이나 요금이 없습니다.
최고의 비용 효율성
- 유휴 요금 없이 사용한 만큼 지불합니다.
- 예: $25로 평균 응답 시간 60ms에서 694만 건의 요청을 지원합니다.
간소화된 개발자 경험
- 간편한 설정을 위한 직관적인 UI
- 완전 자동화된 CI/CD 파이프라인 및 GitOps 통합
- 실행 가능한 통찰력을 위한 실시간 메트릭 및 로깅
손쉬운 확장성 및 고성능
- 손쉬운 고도의 동시성을 처리하기 위한 자동 확장
- 제로 운영 오버헤드 — 빌드에만 집중하세요.
설명서에서 자세히 알아보세요!
X에서 팔로우하세요: @LeapcellHQ