go언어 receiver 인자가 있는 함수

Jane Yeonju Kim·2022년 5월 16일
0

Golang

목록 보기
3/4
post-thumbnail

Go는 클래스를 가지지 않습니다.
하지만, 그와 같은 타입의 메소드를 정의할 수 있습니다.
그 메서드는 특별한 receiver 인자가 있는 함수입니다.
그 receiver는 func 키워드메서드 이름 사이자체 인수 목록에 나타납니다.
Go를 향한 여행


😎코드로 확인하기!

package main

import (
	"fmt"
	"math"
)

type Vertex struct {
	X, Y float64
}

//  여기서 리시버는 (v Vertex)이고 값 리시버를 사용합니다
func (v Vertex) Abs() float64 {
	return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

func (v *Vertex) Scale(f float64) {
	v.X = v.X * f
	v.Y = v.Y * f
}

func main() {
	v := Vertex{3, 4}
	v.Scale(10)
	fmt.Println(v.Abs())
    // Scale함수의 인자가 포인터 리시버(v *Vertex)인 경우 50
    // Scale함수의 인자가 값 리시버(v Vertex)인 경우 5
}

값 리시버를 사용 하는 이유

Read Only로 관리할 수 있습니다.
== 새로운 변수를 생성해서 기존 값(Vertex)을 수정하지 않습니다.

  • 코드 : v = Vertex{3, 4}
    ➡ Scale함수: v.X = 30, v.Y = 40 (함수가 종료되면서 사라집니다.)
    ➡ Abs함수: v는 여전히 Vertex{3, 4}. (3*3 + 4*4)값에 제곱근을 구하므로 5가 반환됩니다.

포인터 리시버를 사용 하는 이유

해당 인스턴스 값을 변경할 수 있습니다.
== 기존 값(Vertex)에 접근해서 수정합니다.
포인터 리시버를 사용하면 큰 구조체나 데이터의 값복사를 방지해서 메모리를 효율적으로 관리할 수 있는 장점이 있습니다!

  • 코드 : v = Vertex{3, 4}
    ➡ Scale함수: v.X = 30, v.Y = 40 (v의 값이 변경됩니다!)
    ➡ Abs함수: v는 이제 Vertex{30, 40}. (30*30 + 40*40)값에 제곱근을 구하므로 50이 반환됩니다.
profile
안녕하세요! 김개발자입니다 👩‍💻 🐈

0개의 댓글