Featured image of post Golang: 4. 함수

Golang: 4. 함수

func 키워드를 사용하여 정의한다.

함수 파라미터는 0개 이상 사용할 수 있는데, 각 파라미터는 파라미터명 뒤에 int, string 등 파라미터 타입을 정의한다.

함수의 반환 타입은 파라미터 괄호 뒤에 적는다.

함수는 패키지 안에 정의되며 호출되는 함수가 호출하는 함수의 반드시 앞에 위치해야 할 필요는 없다.

1
2
3
4
5
6
7
8
9
package main
func main() {
    msg := "Hello"
    say(msg)
}
 
func say(msg string) {
    println(msg)
}

Pass By Reference

Go에서 파라미터를 전달하는 방식은 크게 Pass By Value와 Pass By Reference로 나뉜다.

Pass By Value

함수를 사용할 때 변수를 그대로 사용하면 함수 인자로 사용된 변수들의 값이 복사되어 함수에게 전달된다.

따라서 함수 인자로 받은 값을 함수 내부에서 변경해도 실제 변수값은 영향을 전혀 받지 않는다.

Pass By Reference

변수 앞에 & 를 붙이면 주소를 표시한다. 흔히 포인터라 부르며, 포인터를 사용하면 함수에서 해당 변수를 사용할 때 복사본이 아닌 실제 메모리에 접근하여 변수를 지정하므로 함수 내에서 변경이 인자에 넘겨진 주소를 가진 변수의 실제 값이 변경된다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
package main
func main() {
    msg := "Hello"
    say(&msg)
    println(msg) //변경된 메시지 출력
}
 
func say(msg *string) {
    println(*msg)
    *msg = "Changed" //메시지 변경
}

함수에서 파라미터를 선언할 때 *string 처럼 포인터임을 표시하면 해당 파라미터가 문자열이 아닌 문자열을 저장하고있는 메모리의 주소를 갖는다.

함수 내에서 포인터 파라미터의 주소에 저장된 데이터를 변경하려면 *변수명 = 값 형태로 변수 이름에 역참조 심볼인 *을 붙여 접근하고 변경할 수 있다.

가변인자함수

함수에 여러개ㅢ 파라미터를 전달하려면 가변 파라미터를 나타내는 ... 을 타입 앞에 붙여 사용한다.

가변 파라미터를 갖는 함수를 호출할 때 n개 동일 타입 파라미터를 전달할 수 있다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
package main
func main() {   
    say("This", "is", "a", "book")
    say("Hi")
}
 
func say(msg ...string) {
    for _, s := range msg {
        println(s)
    }
}

함수 반환값

기본형

함수에서 반환값이 있는 경우 func 문 마지막에 리턴 타입을 정의한다. 그리고 return 키워드를 사용해야 한다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
package main
 
func main() {
    total := sum(1, 7, 3, 5, 9)
    println(total)
}
 
func sum(nums ...int) **int** {
    s := 0
    for _, n := range nums {
        s += n
    }
    return **s**
}

복수 개 반환값

go 언어에서 함수는 반환값이 여러개일 수 있다.

여러개 값을 반환하기 위해서는 해당 반환 타입들을 괄호 안에 적어준다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
package main
 
func main() {
    count, total := sum(1, 7, 3, 5, 9)
    println(count, total)   
}
 
func sum(nums ...int) (int, int) {
    s := 0      // 합계
    count := 0  // 요소 갯수
    for _, n := range nums {
        s += n
        count++
    }
    return count, s
}

Named Return Parameter

Named Return Parameter라는 기능을 제공하는데, 이는 반환되는 값들을 미리 선언하며, 값들이 여러 개 일때, 코드 가독성을 높힌다.

1
2
3
4
5
6
7
func sum(nums ...int) (**count** int, **total** int) {
    for _, n := range nums {
        total += n
    }
    count = len(nums)
    return
}

마지막에 빈 return이 있지만 named return parameter로 정의된 형태로 반환된다. return 은 반환값에 아무런 영향을 주지 않지만 생략하면 에러가 발생한다.