Go Academy · 강의

익명 구조체와 조합

임베딩과 구조체 기반 코드 재사용

레슨 4/413개 단계

익명 구조체와 조합은(는) 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 구조체 정의와 사용
  2. 구조체의 메서드
  3. 생성자 패턴
  4. 익명 구조체와 조합
← Go Academy(으)로 돌아가기