더북(TheBook)

2.4.2 매개변수 전달 방식

Go는 값에 의한 호출(call by value)이 기본이다. 값에 의한 호출은 함수를 호출할 때 매개변수 값을 복사해서 함수 내부로 전달한다. 함수 내부에서는 전달된 매개변수의 본래 값을 변경할 수 없다. 함수 내부에서 본래 값을 변경하려면 & 연산자로 변수의 메모리 주소를 전달해야 한다.

참조에 의한 호출(call by reference)로 매개변수를 전달하면 함수에서는 전달한 매개변수의 메모리 주소를 매개변수로 받는다. 이때 * 연산자를 사용하여 매개변수 타입을 포인터로 지정해야 한다. 함수의 매개변수 타입을 포인터로 지정하면 변수의 값이 아닌 변수의 메모리 주소가 전달된다. 이렇게 포인터로 메모리 주소에 접근하면 매개변수로 전달된 인수의 본래 값을 변경할 수 있다. 단, 참조 타입인 슬라이스와 맵은 메모리의 참조 값을 전달하는 게 기본이다(슬라이스와 맵은 3장 데이터 타입에서 상세히 다룬다).

▼ 값에 의한 호출

package main
  
import "fmt"
  
func inc(i int) {
    i = i + 1
}
  
func main() {
    i := 10
    inc(i)
    fmt.Println(i)
}

실행 결과

10

▼ 참조에 의한 호출

package main
  
import "fmt"
  
func inc(i *int) {
    *i = *i + 1
}
  
func main() {
    i := 10
    inc(&i)
    fmt.Println(i)
}

실행 결과

11

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.