PHpullh
학습 라이브러리/Go/구조체 & 메서드

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를 구현합니다.

구조체 & 메서드 학습 시 주의할 점은 무엇인가요?

값 수신자 메서드를 통해 구조체를 수정하면 복사본만 수정 됩니다. 원본에 반영되지 않습니다.