레슨 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)하고, 소문자면 패키지 내부에서만 접근 가능합니다.