GO · 구조체/인터페이스
구조체 & 메서드
Go에는 클래스가 없습니다. struct와 메서드로 OOP를 구현합니다.
구조체/인터페이스입문structmethodembeddingpointer-receivervalue-receiver
핵심 설명
Go에는 클래스가 없습니다. struct와 메서드로 OOP를 구현합니다.
Go code
package main
import (
"fmt"
"math"
)
// 구조체 정의
type Point struct {
X, Y float64
}
// 값 수신자 메서드 — 복사본에서 실행
func (p Point) Distance() float64 {
return math.Sqrt(p.X*p.X + p.Y*p.Y)
}
// 포인터 수신자 메서드 — 원본 수정 가능
func (p *Point) Scale(factor float64) {
p.X *= factor
p.Y *= factor
}
func (p Point) String() string {
return fmt.Sprintf("(%.1f, %.1f)", p.X, p.Y)
}
// 임베딩 — 상속 대신
type Circle struct {
Point // 임베딩 (익명 필드)
Radius float64
}
func (c Circle) Area() float64 {
return math.Pi * c.Radius * c.Radius
}
// 구조체 태그 (JSON, DB 매핑)
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"email,omitempty"`
}
func main() {
p := Point{X: 3, Y: 4}
fmt.Println(p.Distance()) // 5
p.Scale(2)
fmt.Println(p) // (6.0, 8.0)
// 임베딩으로 Point 메서드 승격
c := Circle{Point: Point{1, 2}, Radius: 5}
fmt.Println(c.Distance()) // 임베딩된 Point의 메서드
fmt.Printf("넓이: %.2f
", c.Area())
// 구조체 리터럴
u1 := User{ID: 1, Name: "Alice"}
u2 := User{1, "Bob", "bob@test.com"}
_ = u1; _ = u2
// 익명 구조체
config := struct {
Host string
Port int
}{"localhost", 8080}
fmt.Println(config.Host, config.Port)
}학습 팁
수신자를 값으로 할지 포인터로 할지: 구조체를 수정해야 하거나 크기가 크면 포인터, 그렇지 않으면 값 수신자를 사용하세요. 같은 타입의 모든 메서드는 일관성 있게 하나로 통일하세요.
주의할 점
값 수신자 메서드를 통해 구조체를 수정하면 복사본만 수정됩니다. 원본에 반영되지 않습니다.
자주 묻는 질문
구조체 & 메서드란 무엇인가요?
Go에는 클래스가 없습니다. struct 와 메서드로 OOP를 구현합니다.
구조체 & 메서드 학습 시 주의할 점은 무엇인가요?
값 수신자 메서드를 통해 구조체를 수정하면 복사본만 수정 됩니다. 원본에 반영되지 않습니다.
Continue Learning
Go 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.