더북(TheBook)

사용자 정의 타입과 메서드

Go에는 기본 타입 외에 사용자가 타입을 직접 정의할 수 있는 사용자 정의 타입이 있다. 일반적으로는 구조체와 인터페이스를 사용자 정의 타입으로 지정해서 쓴다. 기본 타입이나 함수 서명(signature)을 사용자 정의 타입으로 지정해서 쓰기도 한다.

메서드는 사용자 정의 타입과 함수를 바인딩시키는 방식으로 정의한다. 메서드를 정의할 때는 어떤 타입과 연결할지 리시버(receiver)를 지정해준다. 리시버를 지정해주면 타입과 메서드가 연결되어 특정 사용자 정의 타입에 대한 동작을 표현할 수 있게 된다.

func (리시버명 리시버타입) 메서드명(매개변수) (반환타입 또는 반환값) {
    // body
}

func메서드명 사이에 리시버를 지정해주는 것만 제외하면 함수를 정의하는 방식과 같다. 메서드를 호출하면 리시버 값이 메서드 내부로 전달되며, 메서드 안에서 리시버 값을 사용할 수 있게 된다.

다음 코드는 Go에서 객체를 어떻게 표현하는지 보여준다. Item 타입은 name, price, quantity 필드로 현재 상태를 나타내고, Cost() 메서드로 동작을 표현한다.


package main
          
import "fmt"
 
// 사용자 정의 타입 정의(구조체)
type Item struct {
    name     string
    price    float64
    quantity int
}
 
// Item 타입에 Cost() 메서드 정의
func (t Item) Cost() float64 {
    return t.price * float64(t.quantity)
}
 
func main() {
    // 아이템 값 생성
    shirt := Item{name: "Men's Slim-Fit Shirt", price: 25000, quantity: 3}
           
    // Cost() 메서드로 가격 출력
    fmt.Println(shirt.Cost()) // 75000
}

Item 타입을 구조체로 정의했고 안에 name, price, quantity 필드를 정의했다. 다음 블록에는 Cost() 메서드를 정의했다. Item 타입을 함수의 리시버로 지정하여 Cost()Item의 메서드가 되었다. main 함수에서 Item 타입 값으로 shirt를 생성했고, shirt 아이템의 가격을 Cost() 메서드로 출력했다.

코드의 각 부분은 다음 절에서 자세히 설명한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.