개발/Go

[Go 언어 학습기 #4] Go 언어(Golang) 의 함수

황동리 2025. 12. 2. 18:56
반응형


이 글은 Must Have Tucker의 Go 언어 프로그래밍 책을 참고하여 작성하였으며, 개인적인 학습 내용을 정리한 글입니다.


함수 란?

함수란 특별한 목적의 작업을 수행하는 코드 묶음입니다. 일정 범위의 코드를 묶어서 함수를 만들면 같은 코드를 여러 번 작성하지 않고 한 번만 작성해 재활용 할 수 있습니다.

함수 정의

함수는 아래와 같이 구성 됩니다.

  1. 함수 키워드
  2. 함수명
  3. 매개변수
  4. 반환 타입
  5. 함수 코드 블록
  1   2       3         4
func Add(a int, b int) int { ------
    return a + b                   | 5 
}                            ------    

1 = func 키워드를 사용해서 함수 정의
2 = 그 뒤에 함수명 정의, 여기서 함수명을 만들 때 규칙이 있는데, 첫 글자를 대문자로 하는 함수명은 패키지 외부로 공개되는 함수가 됩니다.
3 = 함수명 뒤에 소괄호에 매개 변수를 넣습니다.
4 = 반환 타입 정의
5 = 중괄호로 함수 코드 블록을 표시해서 함수 코드가 어디서부터 어디까지인지 정의 합니다.

간단하게 코드를 작성해서 함수 사용하는 법을 알아보겠습니다.

package main

import "fmt"

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

func main() {
    c := Add(3, 6)
    fmt.Println(c)
}

이 코드를 위에서부터 아래 순서로 보면,

  1. Add() 함수 안에서 사용할 매개변수(a, b)와 함수 코드를 정의를 해주고
  2. Add() 함수 코드에서는 매개 변수 a와 b를 더하는 코드를 작성 해줬습니다.
  3. 마지막으로 main() 함수에서 Add() 함수룰 호출하여 반환값을 c에 저장해주고
  4. fmt 를 사용해서 출력을 해줍니다.

이런 식으로 함수를 정의하고 사용하는 방법을 간단하게 알아보았습니다.

함수를 호출하면 생기는 일

함수를 호출할 때 입력하는 값을 argument 혹은 인수 라고 합니다.


반대로 함수가 외부로부터 입력받는 변수를 parameter 혹은 매개 변수 라고 합니다.


앞서 간단하게 알아봣던 코드에서 함수를 호출하면 생기는 일에 대해 알아보자면,


먼저 함수를 아래와 같이 호출을 했을 때, 함수를 호출 할 때 넣어준 3, 6인수 라고 합니다.

c := Add(3, 6) // a=3, b=6 인수 넣어서 함수 호출

그러면, Add() 함수에서는 매개 변수를 생성 및 초기화를 합니다.


매개 변수를 a=3, b=6 으로 바꿔주고 return 값 반환을 해줍니다.


그래서 c := 9 이렇게 c 에는 9란 값이 들어가게 됩니다.


간략하게 정리를 하자면,

핵심은 '인수는 매개 변수로 복사된다.' 입니다. 매개 변수와 함수 내에서 선언된 변수는 함수가 종료되면 변수 범위를 벗어나서 접근하지 못하게 됩니다.

함수를 사용하는 이유

함수를 사용하면 중복 코드를 제거하여 코드를 간결하게 만들 수 있습니다.


간단한 예시를 통해 알아보자면, 수학/영어/역사 시험 성적의 평균 점수를 출력하는 예시 코드 입니다.

package main

import "fmt"

func main() {
    math := 80
    eng := 74
    history := 95
    fmt.Println("김일등 님 평균 점수는", (math + eng + history)/3, "입니다.")

    math := 88
    eng := 92
    history := 53
    fmt.Println("송이등 님 평균 점수는", (math + eng + history)/3, "입니다.")

    math := 78
    eng := 73
    history := 78
    fmt.Println("박삼등 님 평균 점수는", (math + eng + history)/3, "입니다.")
}
---
김일등 님 평균 점수는 83 입니다.
송이등 님 평균 점수는 77 입니다.
박삼등 님 평균 점수는 76 입니다.

이런 식으로 코드가 3번이나 반복이 되었는데 함수를 사용하면, 중복 코드 없이 생성할 수 있습니다.

package main

import "fmt"

func PrintAvgScore(name string, math int, eng int, history int) {
    total := math + eng + history
    avg := total / 3
    fmt.Println(name, "님 평균 점수는", avg, "입니다.")
}

func main() {
    PrintAvgScore("김일등", 80, 74, 95)
    PrintAvgScore("송이등", 88, 92, 53)
    PrintAvgScore("박삼등", 78, 73, 78)
}
---
김일등 님 평균 점수는 83 입니다.
송이등 님 평균 점수는 77 입니다.
박삼등 님 평균 점수는 76 입니다.

이렇게 함수를 사용하면 중복코드 없이 간단하게 정리 할 수 있습니다.

멀티 반환 함수

멀티 반환 함수하나의 함수가 여러 개의 값을 동시에 반환할 수 있는 기능을 뜻 합니다.

일반적으로 다른 언어들은(Python, Java, C, JS 등) 에서는 함수가 1개의 값만 반환하지만,
Go는 여러 개를 동시에 반환할 수 있습니다.


예시를 통해 알아보겠습니다.

package main

import "fmt"

func Divide(a, b int) (int, bool) {
    if b == 0 {
        return 0, false
    }
    return a / b, true
}

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

먼저 Divide 함수를 선언을 할 때 보면 int 타입 a, b를 매개변수로 받고,
int 타입과 bool 타입을 반환한다고 선언을 합니다.


그래서 return 에 보면 매개변수 b가 0 일 때는, 0과 false를 반환한다고 하고,
매개변수 b가 0이 아닐 때는 a/b와 true를 반환 합니다.


그래서 위 코드를 돌려 결과를 보면
3 true, 0 false 이렇게 나오는 것을 확인할 수 있습니다.

재귀 호출

마지막으로 재귀 호출을 알아보겠습니다.

재귀 호출 이란 함수 안에서 자기 자신 함수를 다시 호출하는 것을 말합니다.

바로 코드를 통해 알아보겠습니다.

package main

import "fmt"

func printNo(n int) {
    if n == 0 {
        return
    }
    fmt.Println(n)
    printNo(n - 1)
    fmt.Println("After", n)
}

func main() {
    printNo(3)
}
---
3
2
1
After 1
After 2
After 3

이 코드를 보면 main 함수에서 printNo 함수에 매개변수 n에 3을 넣어주면,


printNo 함수에서 n == 0 인지 확인하고 아니면 `fmt.Println(3)`을 실행을 해주고,

다시 printNo(3-1) 함수를 실행을 합니다.


이렇게 되면


printNo(3), printNo(2), printNo(1), printNo(0) 순으로 실행이 되고


최종적으로 printNo(0) 실행 되었을 때 탈출 조건인 n == 0을 만족해 재귀 호출 이 종료(return) 되고,


그 순간 fmt.Println("After", n) <= 이 줄로 다시 돌아가고 스택에 쌓인 역순으로 호출이 되어 1 -> 2 -> 3


즉, After 1 -> After 2 -> After 3 이렇게 값이 반환 됩니다.



이상으로 Go 언어의 함수에 대해 알아보았습니다.


감사합니다.

반응형