함수 타입
함수 타입 (Function types)
함수도 Go에서는 하나의 타입이에요. 같은 매개변수와 결과 타입을 가진 함수들 전체를 묶어서 하나의 함수 타입으로 본다는 뜻이죠. 그리고 선언만 하고 초기화하지 않은 함수 타입 변수의 값은 nil이 된다는 점도 꽤 중요해요. 이번에는 함수 타입이 어떻게 생겼는지부터, 이름을 붙이는 규칙, 그리고 매개변수 목록의 마지막에 나오는 ...까지 하나씩 살펴볼게요.
출처: Go Specification
본문
함수 타입은 같은 매개변수 타입과 결과 타입을 가진 모든 함수들의 집합을 나타내요. 초기화되지 않은 함수 타입 변수의 값은 nil이에요.
함수 타입의 문법은 다음 EBNF 규칙으로 정의돼요.
FunctionType = "func" Signature .
Signature = Parameters [ Result ] .
Result = Parameters | Type .
Parameters = "(" [ ParameterList [ "," ] ] ")" .
ParameterList = ParameterDecl { "," ParameterDecl } .
ParameterDecl = [ IdentifierList ] [ "..." ] Type .
매개변수 목록이나 결과 목록 안에 이름을 쓸 때는 규칙이 있어요. 그 목록 안의 이름들은 전부 있거나 전부 없어야 해요. 이름이 있으면 각 이름이 지정된 타입의 한 항목(매개변수 또는 결과)을 나타내고, 시그니처 안의 모든 blank가 아닌 이름은 유일해야 해요. 이름이 없으면 각 타입이 그 타입의 항목 하나를 나타내죠.
매개변수 목록과 결과 목록은 항상 괄호로 감싸는데, 딱 한 가지 예외가 있어요. 이름 없는 결과가 정확히 하나뿐이라면 괄호 없이 타입만으로 쓸 수 있어요.
함수 시그니처의 마지막에 오는 매개변수는 타입 앞에 ...를 붙일 수 있어요. 이런 매개변수를 가진 함수를 variadic이라고 부르고, 그 매개변수 자리에 인자를 0개 이상 전달하면서 호출할 수 있어요.
func()
func(x int) int
func(a, _ int, z float32) bool
func(a, b int, z float32) (bool)
func(prefix string, values ...int)
func(a, b int, z float64, opt ...interface{}) (success bool)
func(int, int, float64) (float64, *[]int)
func(n int) func(p *T)
위 예시만 봐도 함수 타입이 얼마나 자유로운지 느껴져요. func()처럼 아무것도 받지 않고 반환하지 않는 함수부터, 결과가 하나면 (bool)처럼 괄호를 쓸 수도 bool처럼 생략할 수도 있어요. 마지막 줄처럼 함수 타입이 다시 함수를 반환하는 형태도 가능하죠.
더 알아보기
- 매개변수·결과의 이름 규칙과 관련된 개념: Blank identifier, Uniqueness of identifiers
- 초기화되지 않은 변수의 값이
nil이 되는 배경: Representation of values - 실제로 함수를 선언하는 방법이 궁금하다면: Function declarations