Learning
레슨 2 / 8·20분

구조체와 인터페이스

구조체 (struct)

Go에는 클래스가 없습니다. 대신 struct로 데이터 구조를 정의하고, 메서드를 연결하여 객체지향과 유사한 패턴을 구현합니다.

go
package main

import "fmt"

// 구조체 정의
type User struct {
    Name  string
    Email string
    Age   int
}

// 메서드 — 리시버(receiver)를 통해 연결
func (u User) Greet() string {
    return fmt.Sprintf("안녕하세요, %s님!", u.Name)
}

// 포인터 리시버 — 값을 수정할 때 사용
func (u *User) SetAge(age int) {
    u.Age = age
}

func main() {
    user := User{Name: "김철수", Email: "kim@go.dev", Age: 25}
    fmt.Println(user.Greet())  // 안녕하세요, 김철수님!

    user.SetAge(26)
    fmt.Println(user.Age)  // 26
}

인터페이스 (interface)

Go의 인터페이스는 암묵적으로 구현됩니다. 특정 메서드 집합을 가지기만 하면 해당 인터페이스를 구현한 것으로 인정됩니다. implements 같은 명시적 선언이 필요 없습니다.

go
package main

import (
    "fmt"
    "math"
)

// 인터페이스 정의
type Shape interface {
    Area() float64
}

type Circle struct {
    Radius float64
}

type Rectangle struct {
    Width, Height float64
}

// Circle이 Shape 인터페이스를 암묵적으로 구현
func (c Circle) Area() float64 {
    return math.Pi * c.Radius * c.Radius
}

// Rectangle도 Shape 구현
func (r Rectangle) Area() float64 {
    return r.Width * r.Height
}

func printArea(s Shape) {
    fmt.Printf("넓이: %.2f\n", s.Area())
}

func main() {
    printArea(Circle{Radius: 5})          // 넓이: 78.54
    printArea(Rectangle{Width: 3, Height: 4})  // 넓이: 12.00
}
💡

Go에서 이름이 대문자로 시작하면 외부 패키지에서 접근 가능(exported)하고, 소문자면 패키지 내부에서만 접근 가능합니다.