[go] go에서 Method와 receiver를 사용해 객체지향적 코딩하기

sujin·2022년 9월 27일
0

Golang

목록 보기
1/3

Method와 receiver

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가 변경되지 않는다.

0개의 댓글