익명 구조체와 조합
임베딩과 구조체 기반 코드 재사용
익명 구조체와 조합은(는) CoddyKit의 무료 Go Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Go Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
익명 구조체
익명 구조체에는 이름 있는 타입이 없습니다. 코드 안에서 바로 정의하며, 수명이 짧은 데이터, 표 기반 테스트, 일회성 그룹화에 유용합니다:
package main
import "fmt"
func main() {
point := struct{ X, Y int }{X: 3, Y: 7}
fmt.Println(point.X, point.Y)
}표 기반 테스트에서의 익명 구조체
Go에서는 표 기반 테스트를 위해 익명 구조체의 슬라이스를 사용하는 관용적인 방식이 자주 쓰입니다:
package main
import "fmt"
func double(n int) int { return n * 2 }
func main() {
tests := []struct{ input, want int }{
{1, 2}, {5, 10}, {0, 0},
}
for _, tt := range tests {
got := double(tt.input)
if got != tt.want {
fmt.Printf("FAIL: double(%d) = %d, want %d\n", tt.input, got, tt.want)
}
}
fmt.Println("all tests passed")
}구조체 임베딩
구조체 안에 타입을 임베딩하면 해당 타입의 필드와 메서드가 바깥 구조체로 승격됩니다:
package main
import "fmt"
type Animal struct{ Name string }
func (a Animal) Speak() string { return a.Name + " speaks" }
type Dog struct {
Animal // embedded
Breed string
}
func main() {
d := Dog{Animal: Animal{"Rex"}, Breed: "Labrador"}
fmt.Println(d.Name) // promoted field
fmt.Println(d.Speak()) // promoted method
}여러 타입 임베딩하기
구조체에는 여러 타입을 임베딩할 수 있습니다. 같은 필드나 메서드 이름이 충돌하면 명시적으로 해결해야 합니다:
package main
import "fmt"
type Logger struct{}
func (Logger) Log(s string) { fmt.Println("[LOG]", s) }
type Metrics struct{}
func (Metrics) Count() int { return 42 }
type Service struct {
Logger
Metrics
Name string
}
func main() {
svc := Service{Name: "auth"}
svc.Log("started") // from Logger
fmt.Println(svc.Count()) // from Metrics
}임베딩과 상속
Go에는 클래스 상속이 없습니다. 임베딩은 구성입니다:
- 임베딩하면 필드와 메서드가 승격되지만, 바깥 타입이 하위 타입이 되는 것은 아닙니다
Animal이 필요한 곳에Dog을 전달할 수 없습니다- 다형성에는 인터페이스를 사용하고 코드 재사용에는 임베딩을 사용합니다
승격된 메서드 재정의
바깥 구조체가 자체 메서드를 정의하여 임베딩된 메서드를 가릴 수 있습니다:
package main
import "fmt"
type Base struct{}
func (Base) Hello() string { return "Base hello" }
type Child struct{ Base }
func (Child) Hello() string { return "Child hello" } // shadows Base.Hello
func main() {
c := Child{}
fmt.Println(c.Hello()) // Child hello
fmt.Println(c.Base.Hello()) // Base hello (explicit)
}설정을 위한 익명 구조체
이름 있는 타입을 정의하지 않고 관련 설정을 묶을 때 익명 구조체를 사용합니다:
package main
import "fmt"
func main() {
cfg := struct {
Host string
Port int
TLS bool
}{
Host: "api.example.com",
Port: 443,
TLS: true,
}
fmt.Println(cfg)
}인터페이스 임베딩
구조체에 인터페이스를 임베딩하면 모의 객체와 기본 구현을 만들 때 유용합니다:
package main
import "fmt"
type Reader interface{ Read() string }
type Mock struct{ Reader } // embed interface
func main() {
m := Mock{}
fmt.Printf("%T\n", m.Reader) // <nil> — not set
// Assign a real impl at test time:
_ = m
}구조체 구성의 주의점
다음 사항에 주의하십시오:
- 두 임베딩 타입에 같은 필드나 메서드 이름이 있으면 선택자가 모호해질 수 있습니다
- nil인 임베딩 포인터의 메서드를 호출하면 패닉이 발생할 수 있습니다
- 임베딩은 상속이 아니므로 바깥 타입을 임베딩된 타입 대신 사용할 수 없다는 점을 잊지 마십시오
익명 구조체 비교
필드 이름과 타입이 같고 태그도 일치하는 두 익명 구조체는 서로 대입할 수 있습니다:
package main
import "fmt"
func main() {
a := struct{ X, Y int }{1, 2}
b := struct{ X, Y int }{1, 2}
fmt.Println(a == b) // true
}빠른 확인
구조체에 타입을 임베딩하면 어떤 효과가 있습니까?
복습: 구성
핵심 내용:
- 익명 구조체는 표 기반 테스트와 수명이 짧은 데이터에 적합합니다
- 임베딩하면 필드와 메서드가 승격되며, 이는 상속이 아니라 구성입니다
- 바깥 타입은 임베딩된 메서드를 가릴 수 있습니다
- 모호한 선택자는 명시적으로 해결하십시오
- 다형성에는 인터페이스를 사용합니다
연습 과제
TimestampedRecord 구조체를 만들고 Timestamp struct{ CreatedAt, UpdatedAt string }와 Data struct{ Key, Value string }를 임베딩하십시오. 인스턴스를 만들고 승격된 모든 필드를 출력하십시오.
AI 튜터와 함께 Go을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 51
- 레슨
- 203
자주 묻는 질문
“익명 구조체와 조합” 강의는 무료인가요?
네 — “익명 구조체와 조합” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Go Academy 강의 전체를 잠금 해제할 수 있습니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“익명 구조체와 조합”에서 뭘 배우나요?
임베딩과 구조체 기반 코드 재사용 브라우저에서 직접 실행하는 실습 코드로 Go Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Go Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Go Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“익명 구조체와 조합” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Go Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Go Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 구조체 정의와 사용
- 구조체의 메서드
- 생성자 패턴
- 익명 구조체와 조합