메서

메서드 에서 Go

3개의 연습 문제

메서드 소개

메서드는 특별한 리시버 인자를 가진 함수예요. 리시버는 func 키워드와 메서드 이름 사이에 있는, 그 메서드만의 인자 목록에 나타나요.

func (receiver type) MethodName(parameters) (returnTypes) {

}

리시버의 타입이 메서드와 같은 패키지에 정의되어 있을 때만 그 리시버를 가진 메서드를 정의할 수 있어요.

type Person struct {
	Name string
}

func (p Person) Greetings() string {
	return fmt.Sprintf("Welcome %s!", p.Name)
}

s := Person{Name: "Bronson"}
fmt.Println(s.Greetings())
// Output: Welcome Bronson!

리시버에는 값 리시버와 포인터 리시버, 두 가지 종류가 있어요.

값 리시버를 가진 메서드는 전달받은 값의 복사본 위에서 동작해요. 그래서 메서드 안에서 리시버를 수정해도 호출한 쪽에서는 그 변경을 볼 수 없어요.

리시버가 가리키는 값을 수정하려면 포인터 리시버를 가진 메서드를 선언하면 돼요. 이런 수정은 메서드를 호출한 쪽에도 그대로 보여요.

type rect struct {
	width, height int
}

func (r *rect) squareIt() {
	r.height = r.width
}

r := rect{width: 10, height: 20}
fmt.Printf("Width: %d, Height: %d\n", r.width, r.height)
// Output: Width: 10, Height: 20

r.squareIt()
fmt.Printf("Width: %d, Height: %d\n", r.width, r.height)
// Output: Width: 10, Height: 10

여기에서 여러 예제를 볼 수 있어요. 메서드에 관한 이 짧은 튜토리얼도 확인해 봐요.

기억해 둬요. 메서드는 그냥 리시버 인자를 가진 함수일 뿐이에요.

GitHub에서 편집 링크가 새 창이나 탭에서 열려요

메서드 배우기

연습이 잠겨 있어요

메서드 개념을 연습하려면 연습 문제 2개를 더 잠금 해제해요