Golang 함수 사용법

GolangBeginner
지금 연습하기

소개

프로젝트가 복잡해짐에 따라 코드를 여러 함수로 나누는 것이 일반적입니다. 이 접근 방식은 코드 가독성을 향상시키고, 협업을 용이하게 하며, 코드를 중복하지 않고 로직을 빠르게 재사용할 수 있게 해줍니다. 이 랩에서는 Go 에서 함수를 생성하고 사용하는 기본 사항을 배우게 됩니다. 자신만의 함수를 정의하는 방법, Go 가 매개변수와 반환 값을 처리하는 방식, init 함수와 가변 매개변수에 대해 배우게 됩니다.

주요 내용:

  • 함수가 무엇이며 어떻게 작동하는지 이해하기
  • Go 에서 함수 선언하기
  • 값으로 및 참조로 매개변수 전달하기
  • 함수에서 여러 값 반환하기
  • 환경 설정을 위해 init 함수 사용하기
  • 유연한 입력 처리를 위한 가변 매개변수 사용하기

기본 프로그램 생성 및 실행

먼저, 프로젝트 디렉토리로 이동하여 Go 파일을 생성합니다.

cd ~/project
touch func.go

텍스트 편집기를 사용하여 func.go를 열고 다음 코드를 추가합니다.

package main

import "fmt"

func main() {
    a1, b1 := 12, 4
    a2, b2 := 12, 0

    // For the first pair
    if b1 == 0 {
        fmt.Println("The divisor cannot be 0")
    } else {
        fmt.Println(a1 / b1)
    }

    // For the second pair
    if b2 == 0 {
        fmt.Println("The divisor cannot be 0")
    } else {
        fmt.Println(a2 / b2)
    }
}

이 코드는 두 번의 나눗셈 연산을 시도하고 나눗셈 전에 0 으로 나누는 경우를 확인합니다. 제수가 0 이면 오류 메시지를 출력합니다.

프로그램을 실행합니다.

go run func.go

다음과 같은 출력을 볼 수 있습니다.

3
The divisor cannot be 0

함수 선언

이전 랩에서는 프로그램이 간단하든 복잡하든 상관없이 main 함수만 연산에 사용했습니다.

프로그램은 하나의 main 함수만 가질 수 있으며, 이는 프로그램의 진입점입니다. 프로그램을 실행하면 다른 함수들이 main 함수 내에서 직접 또는 간접적으로 호출되고 실행됩니다.

이제 함수의 구문을 살펴보겠습니다.

func functionName(parameters...)(returnValues...){
    code block
}

여기서 함수 이름은 함수를 식별하는 데 사용됩니다. 함수 이름에는 다음 규칙이 적용됩니다.

  • 문자, 숫자, 밑줄로 구성될 수 있습니다. 그러나 함수 이름의 첫 글자는 숫자가 될 수 없습니다. 예를 들어, func 3ab(){}는 유효하지 않습니다.
  • 첫 글자가 대문자인 경우 외부 패키지의 코드에서 참조할 수 있습니다. 첫 글자가 소문자인 경우 패키지 내에서만 사용할 수 있습니다. 이는 public 및 private 함수와 유사합니다.

매개변수 목록은 함수에 전달되는 매개변수의 수와 유형을 선언합니다.

  • 매개변수 목록은 비어 있거나 여러 매개변수를 포함할 수 있습니다.

  • 각 매개변수는 매개변수 이름과 매개변수 유형으로 구성됩니다. 예를 들어, 아래 매개변수 목록에서는 int 유형의 두 변수를 선언합니다.

    func test(a, b int) (res int){}
    

반환 값 목록은 함수가 실행된 후 필요한 값을 반환하는 데 사용됩니다.

  • 반환 값 목록은 매개변수 목록과 유사합니다. 매개변수의 수는 임의의 값일 수 있습니다.

  • 일반적으로 반환 목록은 변수 이름과 변수 유형으로 구성되며, 변수 이름은 선택 사항입니다.

  • 하나의 변수만 반환되고 변수 유형만 선언된 경우 괄호를 생략할 수 있습니다. 예를 들어:

    func test(a int, b string) int{}
    

매개변수 유형이 동일한 경우 축약형을 사용할 수 있습니다. 아래 두 함수는 동일한 기능을 수행합니다.

func test(a, b int, c, d string)(res1, res2 int, res3 string){}

// Short writing mode
func test(a, b int, c, d string)(res1, res2 int, res3 string){}

func.go의 내용을 다음 코드로 바꿉니다.

package main

import "fmt"

func check(divisor int) bool {
    if divisor == 0 {
        fmt.Println("The divisor cannot be 0")
        return false
    }
    return true
}

func main() {
    a1, b1 := 12, 4
    a2, b2 := 12, 0

    // Use the check function before division
    if check(b1) {
        fmt.Println(a1 / b1)
    }
    if check(b2) {
        fmt.Println(a2 / b2)
    }
}

프로그램을 다시 실행합니다.

go run func.go

동일한 출력을 볼 수 있습니다.

3
The divisor cannot be 0

이번에는 검사 로직이 check 함수에 캡슐화되어 코드가 더 깔끔하고 재사용 가능해졌습니다.

init 함수 사용법

Go 는 main 함수 전에 실행되는 init 함수를 지원합니다. 이는 종종 환경 조건을 설정하거나 주 실행 전에 변수를 초기화하는 데 사용됩니다.

func.go의 내용을 다음으로 바꿉니다.

package main

import "fmt"

func init() {
    fmt.Println("init statement")
}

func main() {
    fmt.Println("main statement")
}

프로그램을 실행합니다.

go run func.go

다음과 같은 출력을 볼 수 있습니다.

init statement
main statement

Go 에서 init 함수는 다음과 같은 특징을 가지고 있습니다.

  • 입력 매개변수나 반환 값이 없습니다.
  • 다른 함수에서 호출할 수 없습니다.

동일한 코드 파일 또는 동일한 패키지에 여러 개의 init 함수가 있을 수 있습니다. 실행 순서는 다음과 같습니다.

  • 동일한 코드 파일에서 먼저 나타나는 init 함수가 먼저 실행됩니다.
  • 동일한 package에서 사전순으로 먼저 나오는 파일이 먼저 실행됩니다. 예를 들어, 동일한 packageinit 함수가 있는 다음 파일이 포함된 경우:
a1.go
a2.go
b1.go

실행 순서는 a1.go, a2.go, b1.go가 됩니다. 왜냐하면 a > b 이고 1 < 2 이기 때문입니다.

함수에서 여러 값 반환하기

Go 는 함수가 여러 값을 반환하도록 허용합니다. 이는 여러 관련 계산을 한 번에 수행하는 데 유용합니다.

func.go의 내용을 다음으로 바꿉니다.

package main

import "fmt"

func cal(a, b int) (int, int, int, int) {
    return a + b, a - b, a * b, a % b
}

func main() {
    add, sub, mul, rem := cal(90, 12)
    fmt.Println(add, sub, mul, rem)
}

프로그램을 실행합니다.

go run func.go

다음과 같은 출력을 볼 수 있습니다.

102 78 1080 6

여기서 cal은 네 개의 값을 한 번에 반환하며, 여러 반환 값이 특정 작업을 어떻게 단순화할 수 있는지 보여줍니다.

가변 매개변수 사용법

가변 매개변수를 사용하면 함수가 가변적인 수의 인수를 받을 수 있습니다. 이는 입력 크기가 고정되지 않은 시나리오를 단순화할 수 있습니다.

func.go의 내용을 다음으로 바꿉니다.

package main

import "fmt"

func printX(values ...string) {
    for _, v := range values {
        fmt.Println(v)
    }
}

func main() {
    printX("labex", "labs", "courses")
}

프로그램을 실행합니다.

go run func.go

다음과 같은 출력을 볼 수 있습니다.

labex
labs
courses

printX 함수는 임의의 수의 문자열 인수를 처리할 수 있어 유연하고 사용하기 쉽습니다.

요약

이 랩에서는 Go 에서 함수를 정의하고 사용하는 방법을 배웠습니다. 여기에는 여러 값을 반환하고 가변적인 수의 매개변수를 허용하는 방법이 포함됩니다. 또한 init 함수가 main 전에 실행되는 방식도 확인했습니다. 코드를 함수로 구조화함으로써 프로그램을 더 쉽게 이해하고, 유지 관리하며, 재사용할 수 있습니다.

이러한 기술은 모듈식이고 확장 가능한 Go 애플리케이션을 구축하는 데 기본입니다. 프로젝트가 커짐에 따라 코드를 구성하고 로직을 관리하기 위해 함수를 활용하는 것이 점점 더 중요해질 것입니다.