[Golang] Go 언어 기초 문법 (4) – 함수

함수 정의

함수함수 키워드, 함수명, 매개변수, 반환 타입, 함수 코드 블록으로 구성됩니다.

func Add(a int, b int) int {
    // a와 b를 더한 결과를 반환한다.
    return a + b
}
  1. 첫 글자가 대문자인 함수는 패키지 외부로 공개되는 함수입니다.
  2. Go 언어에서는 함수코드 블록의 시작을 알리는 중괄호 ‘{‘ 가 함수를 정의하는 라인과 항상 같은 줄에 있어야 합니다.
pakage main

import "fmt"

func Add(a int, b int) int { // 함수가 외부로부터 입력받는 변수는 parameter라고 부름. 한국어 : 매개변수
    return a + b
}

func main() {
    c := Add(3, 6) // 함수를 호출할 때 입력하는 값은 argument라고 부름. 한국어 : 인수
    fmt.Println(c)
}
  1. 인수는 매개변수로 복사됩니다.
  2. 매개변수와 함수 내에서 선언된 변수는 함수가 종료되면 접근하지 못합니다.

함수를 쓰는 이유

  1. 코드를 반복적으로 재사용 할 수 있다.
  2. 코드를 간결하게 만든다.
pakage main

import "fmt"

func main() {

    aespa := 1000
    blackPink := 2000
    bts := 3000
    fmt.Println("가수들의 한국 음반 판매량은 총 ", (aespa + blackPink + bts), "장 입니다.")

    aespa := 3300
    blackPink := 1200
    bts := 4300
    fmt.Println("가수들의 미국 음반 판매량은 총 ", (aespa + blackPink + bts), "장 입니다.")

    aespa := 4300
    blackPink := 2200
    bts := 1300
    fmt.Println("가수들의 일본 음반 판매량은 총 ", (aespa + blackPink + bts), "장 입니다.")
}
 

똑같은 변수들로 계산을 하는데, 중복되는 코드 양이 많은걸 볼 수 있습니다.
이를 함수로 묶어서 중복코드를 개선하면 아래와 같이 바꿀 수 있습니다.

package main

import "fmt"

func PrintSum(nation string, aespa int, blackPink int, bts int) {
    total = aespa + blackPink + bts
    fmt.Println("가수들의 ", nation, " 음반 판매량은 총 ", total, "장 입니다.")
}

func main() {
    PrintSum("한국", 1000, 2000, 3000)
    PrintSum("미국", 3300, 1200, 4300)
    PrintSum("일본", 4300, 2200, 1300)
}

멀티 반환 함수

Go 언어에서는 함수에서 한번에 여러개의 리턴값을 반환할 수 있습니다.

package main

import "fmt"

func Divide(a, b int) (result int, success bool) {
    if b == 0 {
        result = 0
        success = false
        return // 리턴값을 명시하지 않았다.
    }
    result = a / b
    success = true
    return // 리턴값을 명시하지 않았다.
}

func main() {
    c, success := Divide(9, 3)
    fmt.Println(c, success)
    d, success := Divide(9, 0)
    fmt.Println(d, success)
}

재귀 호출

함수 안에서 자기 자신을 호출하는 것을 말합니다.

package main

import "fmt"

func factorial(n int) int {
    if n <= 1 {  // n이 1이 되면 리턴하라.
        return 1
    }
    return n * factorial(n - 1) // 리턴할때 n을 하나 뺀 뒤에 다시 자기 자신으로 호출한다.
}

func main() {
    num := 5
    result := factorial(num)
    fmt.Println(num, "팩토리얼의 결과 값은 ", result, " 입니다.")
}

팩토리얼을 푸는 코드입니다. 5를 입력하면 5 X 4 X 3 X 2 X 1의 결과값이 나오게 됩니다.

factorial(5) 를 호출합니다.
5를 받은 함수는 리턴 시에 [ 5 X factorial(4)] 가 될테고,
4를 받은 함수는 리턴 시에 [ 4 X factorial(3)] 이 될테고,
3을 받은 함수는 리턴 시에 [ 3 X factorial(2)] 가 될테고,
2를 받은 함수는 리턴 시에 [ 2 X factorial(1)] 이 될테고,
1을 받은 함수는 “1이되면 리턴하라”의 조건에 걸렸기 때문에 1을 리턴합니다.

그러면 1 을 리턴한 2를 받은 함수가 2 X 1 이 되고,
(2 X 1) 을 리턴한 3을 받은 함수가 3 X (2 X 1) 이 되고,
(3 X (2 X 1)) 을 리턴한 4를 받은 함수가 4 X (3 X (2 X 1)) 이 되고,
(4 X (3 X (2 X 1))) 을 리턴한 5를 받은 함수가 5 X (4 X (3 X (2 X 1)))이 되고,
결과값은 120이 출력되게 됩니다.

재귀호출은 자기 자신을 호출하는 함수이기 때문에 이해하려면 다소 어려울 수 있습니다.
나중에 다시 자세히 다뤄보겠습니다.

Tucker의 Go 언어 프로그래밍 참조.

책을 보면서 공부한 내용을 정리하면서 작성하는 글입니다. 따라서, 주제 하나를 많은 시간을 들여서 쓰지 않고, 간단하게 작성하는 것부터 시작해서, 계속 다듬어가면서 업데이트해 나갈 생각입니다. 참고하는 자료가 있을 때마다 출처를 적어 놓겠습니다.

[이전글] [Golang] Go 언어 기초 문법 (3) – 연산자

[다음글] [Golang] Go 언어 기초 문법 (5) – 상수

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x