Go: Methods

오병민·2021년 6월 13일
0

go

목록 보기
4/7
post-thumbnail

1. Methods

Go 에는 class 가 존재하지 않는다 대신에 Methods 를 정의해서 사용 할 수 있다.

methods 는 함수에 receiver 라는 특별한 arguments와 함께 사용하면 된다.

receiver 는 func 키워드와 methods 이름 사이에 위치 하게 된다

package main

import "fmt"

type person struct {
	name string
	age int
}

// person struct의 methods
func (p person) introduction(){
	fmt.Printf("Hi, my name is %s i'm %d years old\n", p.name, p.age)
}


func main(){
	me := person{"obm", 19}
	me.introduction()
}

위 예제를 보면 func 키워드와 methods 사이에 (p person) 이 있는 것을 확인 할 수 있다.

receiver 의 이름은 임의로 정할 수 있지만 일반적으로 타입의 맨 앞글자를 가져와서 사용한다.

2. Pointer Methods

receiver 는 pointer 와 함께 사용 할 수 있습니다.

type person struct {
	name string
	age int
}

func (p person) modifyName(name string) {
	p.name = name
	fmt.Println(p.name)
}


func main(){
	me := person{"obm", 19}
	me.modifyName("newName")
	fmt.Println(me.name)
}

출력 : newName
      obm

위 예제를 보면 포인터를 사용 안했기 때문에 me가 copy 된 value 가 methods 에서 사용 됐기 때문에 원래 me 는 값이 변하지 않았습니다.

이는 pointer 를 사용해서 me 의 주소값을 가져와서 해결 할 수 있습니다.

func (p *person) modifyName(name string) {
	p.name = name
	fmt.Println(p.name)
}


func main(){
	me := person{"obm", 19}
	me.modifyName("newName")
	fmt.Println(me.name)
}

출력 : newName
      newName

Go 공식 홈페이지 를 보면 receiver pointer 를 사용하는 2가지 이유가 있다고 적혀있다.

첫번째, receiver 가 가르키는 값을 methods 로 값을 수정 할 수 있다.

두번째, methods 가 호출 될 때 마다 값이 복사되는 것을 피하기 위해서다. 이는 type 의 struct 가 커질수록 효율적이다.

일반적으로 타입이 주어진 methods 들은 value 나 pointer reveivers 를 가지게 된다
하지만 둘을 섞어서 쓰지는 않는다.

즉, 값을 복사 할 것인가 pointer를 쓸 것인가 선택할 수 있지만 둘을 혼합해서 코딩하는 일은 피하도록 하자.

profile
안녕하세요

0개의 댓글