본문 바로가기
Language/Golang

Golang 함수

by 돈코츠라멘 2019. 9. 3.

Go에서 함수는 func 키워드를 사용해서 정의한다.

func 함수명(매개변수_이름 매개변수_자료형) 리턴값_자료형 {...}
()안에는 0개 이상의 매개변수의 이름과 타입이 들어가고, ()와 {}사이에 리턴값의 이름(생략 가능)과 타입을 작성한다. 그리고 {} 안에 함수의 로직을 구현한다.

func main() {
    fmt.Println(sum(2, 3)) // 5
}

func sum(a int, b int) int {
    return a + b
}

위 코드는 int 타입 a와 int 타입 b를 입력받아 그 합을 구하는 sum 함수를 작성한 예시이다. 이 함수는 아래와 같이 리턴값에 이름을 붙여서 작성할 수도 있다.

func sum(a int, b int) (r int) {
    r = a + b
    return r
}

그리고 Go에서는 다른 언어와 달리 함수에서 값을 여러개 리턴할 수 있다.

func main() {
    sum, diff := sumAndDiff(5, 2)
    fmt.Println(sum, diff) // 7 3
}

func sumAndDiff(a int, b int) (int, int) {
    return a + b, a - b
}

()안에 리턴값 자료형을 콤마로 구분하여 여러개 지정하고, 함수의 return에도 리턴 값을 콤마로 구분하여 여러개 지정한다. 리턴값을 받을 때는 sum, diff :=처럼 변수를 콤마로 구분하여 여러개 지정한다. 여기서 리턴값은 함수에서 지정한 순서대로 매칭된다.


Parameter Pass

Go에서 파라미터를 전달하는 방식은 Pass By Value와 Pass By Reference가 있다.

Pass By Value

func main() {
    originMsg := "Hello"
    changeMsg(originMsg)

    fmt.Println("originMsg: ", originMsg) // originMsg:  Hello
}

func changeMsg(msg string) {
    msg = "World"
}

위 예제에서는 Hello의 값이 복사되어 changeMsg 함수에 전달된다. 따라서 함수내에서 값을 바꾸어도 main에서의 originMsg 값에는 변화가 없다.

Pass By Reference

func main() {
    originMsg := "Hello"
    changeMsg(&originMsg)

    fmt.Println("originMsg: ", originMsg) // originMsg:  World
}

func changeMsg(msg *string) {
    *msg = "World"
}

위와 같이 변수 앞에 &를 붙이면 값이 아닌 주소를 표시하게 된다. 이것은 C에서의 포인터와 같은 개념이다. 따라서 changeMsg 함수에서 originMsg 주소값에 있는 값을 바꾸어 넣기 때문에 이후 main에서 originMsg를 출력하면 변경된 값이 출력된다.


Variadic Function (가변 인자함수)

함수의 매개변수 개수가 정해져 있지 않고 유동적으로 변하는 형태를 가변 인자라고 한다. 함수에 고정된 수의 파라미터가 아닌 다양한 갯수의 파라미터를 전달하고 싶을 때 사용한다. ...매개변수_자료형으로 표시하며 0~n개의 동일타입 파라미터를 전달할 수 있다.

func main() {
    fmt.Println(sum(1, 2, 3, 4)) // 10
    fmt.Println(sum()) // 0
    fmt.Println(sum(1)) // 1
}

func sum(n ...int) (r int) {
    for _, i := range n {
        r += i
    }
    return
}

댓글