Go에서 함수는 일급함수로서 Go의 기본 타입과 같게 취급되며, 따라서 다른 함수의 파라미터로 전달하거나 다른 함수의 리턴값으로도 사용될 수 있다.
func main() {
// 정의된 함수를 파라미터에 전달
sum := func(i int, j int) int {
return i + j
}
fmt.Println(calc(sum, 5, 10)) // 15
// 파라미터에 익명함수를 직접 정의
fmt.Println(calc(func(a int, b int) int { return a \- b }, 5, 10)) // -5
}
func calc(f func(int, int) int, a int, b int) int {
return f(a, b)
}
first-class citizens
일급/이급 객체의 개념은 영국의 컴퓨터 과학자 크리스토퍼 스트레이치에 의해 1960년대에 처음 소개되었다. 그는 명시적으로 일급 객체의 개념을 정의하지는 않았으나, Algol 프로그래밍 언어의 실수(Real number)와 프로시저를 비교함으로써 일급 객체의 개념에 대해 처음으로 언급하였다.
일급 객체와 이급 객체. 프로그래밍 언어 Algol에서 실수(Real number)는 연산식(Expression)에 사용되거나 변수에 대입될 수 있으며, 프로시저에 매개변수로 넘겨질 수 있다. 하지만 프로시저의 경우 프로시저 콜에서 호출 대상 혹은 매개 변수로 등장할 수 있을 뿐, 프로시저의 리턴 값으로 전달되거나 연산식 내에서 사용될 수는 없다. 이런 측면에서 Algol에서의 프로시저는 이급 시민인데, 변수나 연산식 등을 통한 간접적인 등장이 허용되지 않으면서 스스로 '직접' 나타나야 하기 때문이다.
일반적으로 일급 객체의 조건은 아래와 같다.
- 변수나 데이터 구조 안에 담을 수 있다.
- 파라미터로 전달할 수 있다.
- 리턴값으로 사용할 수 있다.
- 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.
- 동적으로 프로퍼티 할당이 가능하다.
일부 사람들은 함수가 '일급 객체'가 되기 위해서는 런타임에 함수를 생성할 수 있어야 한다고 말한다. 이 조건에 의하면 C와 Go같은 언어들에서의 함수는 일급 객체가 아니다. Go의 함수는 일급객체일까...?
References
'Language > Golang' 카테고리의 다른 글
Golang panic(패닉)과 recover(복구): Java에서의 try-catch 구문 (0) | 2019.09.10 |
---|---|
Golang defer (지연 호출) (0) | 2019.09.07 |
Golang Closure (0) | 2019.09.06 |
Golang 함수 (0) | 2019.09.03 |
댓글