개발/Go

[Go] 기초 - 함수

devhooney 2022. 7. 17. 20:29
728x90

1. 함수

- Go에서 함수는 func 키워드와 함수명을 사용해서 정의한다.

- Java의 메소드와 비슷하다.

- 함수명 뒤에 괄호 안에 받을 파라미터를 적는데, 파라미터명 + 타입 순서로 적어준다.

func main() {
    msg := "Hello"
    say(msg)
}
 
func say(msg string) {
    println(msg)
}

- msg에 "Hello"를 담아 say함수에 전달했고, say함수에서 msg(string)로 받아서 출력했다.

 

2. 파라미터 전달 방식

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

(1) Pass By Value
위의 [1. 함수]의 예제에서는 msg의 값 "Hello" 문자열이 복사되어 함수 say()에 전달된다. 즉, 만약 파라미터 msg의 값이 say() 함수 내에서 변경된다하더라도 호출함수 main()에서의 msg 변수는 변함이 없다.

(2) Pass By Reference

아래의 예제에서처럼 msg 변수앞에 & 부호를 붙이면 msg 변수의 주소를 표시하게 된다. 흔히 포인터라 불리우는 이 용법을 사용하면 함수에 msg 변수의 값을 복사하지 않고 msg 변수의 주소를 전달하게 된다. 피호출 함수 say()에서는 *string 과 같이 파라미터가 포인터임을 표시하고 이때 say 함수의 msg는 문자열이 아니라 문자열을 갖는 메모리 영역의 주소를 갖게 된다. msg 주소에 데이타를 쓰기 위해서는 *msg = "" 과 같이 앞에 *를 붙이는데 이를 흔히 Dereferencing 이라 한다.

func main() {
    msg := "Hello"
    say(&msg)
    println(msg) //변경된 메시지 출력
}
 
func say(msg *string) {
    println(*msg)
    *msg = "Changed" //메시지 변경
}

- Pass By Reference 방식은 내가 개발할 때 사용해 본적이 없다. 이번에 공부하면서 알게 된 방식.

 

3. 가변인자함수

- 함수에 고정된 수의 파라미터들을 전달하지 않고 다양한 숫자의 파라미터를 전달하고자 할 때 가변 파라미터를 나타내는 ... (3개의 마침표)을 사용.

func main() {   
    say("This", "is", "a", "book")
    say("Hi")
}
 
func say(msg ...string) {
    for _, s := range msg {
        println(s)
        // this
        // is
        // a
        // book
        // Hi
    }
}

 

4. 함수 리턴값

- Go는 함수 리턴값을 여러 개를 할 수 있다.

- 리턴값 타입은 파라미터 괄호 뒤에 적어준다.

- 리턴 변수명을 파라미터 괄호 뒤에 같이 적어서 바로 리턴이 가능하다.

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
}

// 리턴값 여러 개
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들에 리턴값들을 할당하여 리턴
func sum(nums ...int) (count int, total int) {
    for _, n := range nums {
        total += n
    }
    count = len(nums)
    return
}

 

참고 사이트

http://golang.site/go/article/9-Go-%ED%95%A8%EC%88%98

728x90

'개발 > Go' 카테고리의 다른 글

[Go] 기초 - 클로저 (Closure)  (0) 2022.07.19
[Go] 기초 - 익명함수  (0) 2022.07.18
[Go] 기초 - 반복문  (0) 2022.07.17
[Go] 기초 - 조건문  (0) 2022.07.15
[Go] 기초 - 연산자  (0) 2022.07.13