[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개의 댓글

Powered by GraphCDN, the GraphQL CDN