Go 언어는 매개 변수(parameter)에 기본값을 설정할 수 있는 기능을 제공하지 않습니다. 따라서 함수에서 매개 변수를 정의할 때 기본값을 명시적으로 지정해주어야 합니다. 하지만 Go 언어에서는 몇 가지 방법을 통해 디폴트 매개 변수와 비슷한 기능을 구현할 수 있습니다.
방법 1: 매개 변수에 빈 값 할당
함수의 매개 변수를 정의할 때 해당 타입의 빈 값으로 초기화합니다. 예를 들어, 정수형 매개 변수의 디폴트 값을 0으로 설정할 수 있습니다.
func foo(bar int) {
// 매개 변수가 전달되지 않았을 때, bar는 0으로 초기화됨
fmt.Println(bar)
}
func main() {
foo(10) // 10 출력
foo() // 0 출력
}
하지만 이 방법은 해당 타입이 원시 타입(primitive type)일 때만 유효하며, 구조체(struct)나 배열(array)과 같은 복합 타입의 매개 변수에는 사용할 수 없습니다.
방법 2: 매개 변수 구조체 활용
구조체를 사용하여 매개 변수에 디폴트 값을 지정할 수 있습니다. 예를 들어, 다음과 같이 구조체를 정의하여 디폴트 값을 설정할 수 있습니다.
type Options struct {
Foo int
Bar string
}
func foo(opts Options) {
// opts.Foo와 opts.Bar에 값이 할당되지 않았을 때,
// Foo는 0, Bar는 빈 문자열로 초기화됨
fmt.Println(opts.Foo, opts.Bar)
}
func main() {
foo(Options{Foo: 10, Bar: "hello"}) // 10 hello 출력
foo(Options{}) // 0 출력
}
이 방법은 모든 타입에 대해 디폴트 값을 지정할 수 있으며, 정보를 구조화하여 전달할 수 있다는 장점이 있습니다.
방법 3: 함수 오버로딩 사용
Go 언어는 함수의 오버로딩(overloading)을 지원하지 않지만, 함수명을 다르게 지정하여 같은 이름의 함수를 여러 개 정의할 수 있습니다. 매개 변수가 하나도 전달되지 않았을 때, 디폴트 값을 사용하는 함수를 다른 함수로 정의할 수 있습니다.
func foo() {
fmt.Println("디폴트 값 사용")
}
func fooWithParam(bar int) {
fmt.Println(bar)
}
func main() {
foo() // 디폴트 값 사용 출력
fooWithParam(10) // 10 출력
}
이 방법은 가독성이 좋지 않을 수 있으며, 매개 변수의 개수와 타입이 많아질수록 코드의 중복이 발생할 수 있습니다.
결론
Go 언어에서 디폴트 매개 변수를 지원하지 않지만, 빈 값 할당, 매개 변수 구조체 활용, 함수 오버로딩을 통해 비슷한 효과를 얻을 수 있습니다. 매개 변수의 개수와 종류에 따라 가장 적합한 방법을 선택하여 사용하면 됩니다.
참조: