소개
프로젝트가 복잡해짐에 따라 코드를 여러 함수로 나누는 것이 일반적입니다. 이 접근 방식은 코드 가독성을 향상시키고, 협업을 용이하게 하며, 코드를 중복하지 않고 로직을 빠르게 재사용할 수 있게 해줍니다. 이 랩에서는 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에서 사전순으로 먼저 나오는 파일이 먼저 실행됩니다. 예를 들어, 동일한package에init함수가 있는 다음 파일이 포함된 경우:
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 애플리케이션을 구축하는 데 기본입니다. 프로젝트가 커짐에 따라 코드를 구성하고 로직을 관리하기 위해 함수를 활용하는 것이 점점 더 중요해질 것입니다.



