Go First-Class Function(일급함수)

 

안녕하세요, 오늘은 우연히 JWT 프로젝트를 하던 중 일급함수에 대해서 이야기를 들어서 한 번 살펴보기 위해서 글을 써 봅니다!
일단 Go에서 함수는 일급함수로서 Go의 기본 타입과 같게 취급됩니다. 따라서 다른 함수의 파라미터로 전달하거나 다른 함수의 리턴값으로도 사용될 수 있습니다.
다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킵니다. 보통 함수에 매개변수로 넘기기, 수정하기, 변수에 대입하기와 같은 연산을 지원할 때 일급 객체라고 합니다.
본 글은 Golang first-class function (일급함수)를 보고 작성하였습니다.

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 clac(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에서의 프로시저는 이급 시민인데, 변수나 연산식 등을 통한 간접적인 등장이 허용되지 않으면서 스스로 ‘직접’ 나타나야 하기 때문입니다.

로빈 포플스톤은 일급 객체를 구성하는 요소는 기본적인 권리가 있다는, 다음의 정의를 내렸습니다.

  1. 모든 요소는 함수의 실제 매개변수가 될 수 있다.
  2. 모든 요소는 함수의 반환 값이 될 수 있다.
  3. 모든 요소는 할당 명령문의 대상이 될 수 있다.
  4. 모든 요소는 동일 비교의 대상이 될 수 있다.

1990년대에 들어 미국의 컴퓨터 과학자 라피엘 핀켈이 이급 및 삼급 객체에 대한 정의를 제안한 바 있으나, 널리 받아들여지는 않았습니다.

일부 사람들은 함수가 ‘일급 객체’가 되기 위해서는 런타임에 함수를 생성할 수 있어야 한다고 말합니다. 이 조건에 의하면 C와 Go 같은 언어들에서의 함수는 일급 객체가 아닙니다. 그럼… Go의 함수는 일급객체일까요…?

참고한 문서