method는 receiver가 있는 함수. func keyword 그리고 method name사이에 나타난다. receiver란 객체와 함수를 연결하는 매개체로 method는 객체에 연결된 함수이다.
value receiver : object를 value를 통해 접근하여 사용
value를 통해서 접근하기 때문에, 원본 값 자체가 아닌 새로운 struct를 사용한다.
즉, 새로운 struct를 선언해 object를 리시버로 사용하는 것이기에 원본 struct로 정의된 object와 주소값이 다르다.
value receiver : 같은 struct 구조를 가지지만 value는 다른 새로운 object를 생성하고 싶을 때 사용한다.
pointer receiver : object를 reference를 통해 접근하여 사용
pointer를 통해서 참조하기 때문에, 원본을 참조하며 원본 값 자체를 복제하여 사용한다.
따라서, 원본 struct로 정의된 object와 주소값이 동일하다.
pointer receiver : 같은 struct 구조와 value를 가지는 동일한 object를 사용하고 싶을 때 활용한다.
package main
import (
"fmt"
"math"
)
type Vertex struct {
X, Y float64
}
func (v Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func (v *Vertex) add() {
v.X += 5
v.Y += 5
}
func (v Vertex) sub() {
v.X -= 3
v.Y -= 3
}
func main() {
v := Vertex{3, 4}
fmt.Println(v.Abs()) //1)
// add function
v.add() //2)
fmt.Println(v)
fmt.Println(v.Abs())
//subtraction function
v.sub() //3)
fmt.Println(v)
fmt.Println(v.Abs())
}
result :
5
{8 9}
12.041594578792296
{8 9}
12.041594578792296
다음의 결과가 나오는 이유를 알아보자!
v는 Vertex struct object로 정의되어있다.
1) v.Abs() => object v의 X, Y값을 제곱해 루트
2) v.add() => object v를 pointer를 통해서 넘겨 v.X, v.Y를 변경
3) v.sub() => object v.X, v.Y값을 저장하는 기존의 main에서 선언된 v와 다른 주소값을 가지는 객체 생성후 v.X, v.Y를 변경
따라서 3)번 단계를 지나도 v.X, v.Y가 변경되지 않는다.