{{위키데이터 속성 추적}}
[[컴퓨터 과학]]에서 [[프로그래밍 언어]]는 [[함수 (컴퓨터 과학)|함수]]를 [[일급 객체]]로 취급하는 경우 '''일급 함수'''(first-class function)를 갖는다고 한다. 이는 언어가 함수를 다른 함수에 대한 인수로 전달하고, 이를 다른 함수의 값으로 반환하고, 변수에 할당하거나 자료 구조에 저장하는 것을 지원한다는 것을 의미한다.<ref>{{서적 인용|first1=Harold|last1=Abelson|authorlink1=Harold Abelson|first2=Gerald Jay|last2=Sussman|authorlink2=Gerald Jay Sussman|title=Structure and Interpretation of Computer Programs|at=[https://archive.org/details/structureinterpr00abel/page/ Formulating Abstractions with Higher-Order Procedures]|publisher=MIT Press|year=1984|isbn=0-262-01077-1|url=https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-12.html#%_sec_1.3|access-date=2024-04-13|archive-date=2021-09-21|archive-url=https://web.archive.org/web/20210921155625/https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-12.html#%_sec_1.3|url-status=}}</ref> 일부 프로그래밍 언어 이론가들은 [[익명 함수]](함수 리터럴)에 대한 지원도 요구한다.<ref name="test">[http://www.worldcat.org/oclc/222529448 Programming language pragmatics], by Michael Lee Scott, section 11.2 "Functional Programming".</ref> 일급 함수를 사용하는 언어에서는 함수 이름에 특별한 상태가 없다. 이는 함수 유형의 일반 [[변수 (컴퓨터 과학)|변수]]처럼 취급된다.<ref>{{저널 인용|title=The Implementation of Lua 5.0 |author1=Roberto Ierusalimschy |author1-link=Roberto Ierusalimschy |author2=Luiz Henrique de Figueiredo |author3=Waldemar Celes |journal=Journal of Universal Computer Science |doi=10.3217/jucs-011-07-1159 |doi-access=free |volume=11 |issue=7 |date=2005 |pages=1159–1176}}</ref> 이 용어는 1960년대 중반 [[크리스토퍼 스트래치]]가 "일급 객체로서의 기능"이라는 맥락에서 만들어졌다.<ref name=strachey>{{저널 인용|last1=Burstall |first1=Rod |last2=Strachey |first2=Christopher |title=Understanding Programming Languages |journal=[[Higher-Order and Symbolic Computation]] |date=2000 |volume=13 |issue=52 |pages=11–49 |doi=10.1023/A:1010052305354 |s2cid=1989590 |url=http://www.cs.cmu.edu/~crary/819-f09/Strachey67.pdf |url-status=bot: unknown |archiveurl=https://web.archive.org/web/20100216060948/http://www.cs.cmu.edu/~crary/819-f09/Strachey67.pdf |archivedate=February 16, 2010 }} (also  on 2010-02-16</ref>

일급 함수는 고차 함수의 사용이 표준 관행인 [[함수형 프로그래밍]] 스타일에 필수적이다. 고차 함수의 간단한 예는 함수와 목록을 인수로 사용하고 목록의 각 구성원에 함수를 적용하여 형성된 목록을 반환하는 [[Map (고차 함수)|map]] 함수이다. 언어가 맵을 지원하려면 함수를 인수로 전달하는 것을 지원해야 한다.

함수를 인수로 전달하거나 결과로 반환하는 데는 특정 구현상의 어려움이 있다. 특히 중첩 및 익명 함수에 도입된 비지역 변수가 있는 경우에는 더욱 그렇다. 역사적으로 이러한 문제는 "함수 인수"에서 유래한 이름인 funarg 문제라고 불렸다.<ref>Joel Moses. [https://dspace.mit.edu/handle/1721.1/5854 "The Function of FUNCTION in LISP, or Why the FUNARG Problem Should be Called the Environment Problem"]. MIT AI Memo 199, 1970.</ref> 초기 명령형 언어에서는 함수를 결과 유형(예: [[알골 60]], [[파스칼 (프로그래밍 언어)|파스칼]])으로 지원하지 않거나 중첩 함수 및 비지역 변수(예: [[C (프로그래밍 언어)|C]])를 생략하여 이러한 문제를 방지했다. 초기 함수형 언어 [[리스프]]는 동적 범위 지정의 접근 방식을 취했다. 여기서 비지역 변수는 함수가 정의된 위치 대신 함수가 실행되는 지점에서 해당 변수의 가장 가까운 정의를 참조한다. 어휘 범위가 지정된 일급 함수에 대한 적절한 지원이 [[스킴 (프로그래밍 언어)|스킴]]에 도입되었으며 함수에 대한 참조를 기본 [[함수 포인터]]<ref name="strachey"/> 대신 [[클로저 (컴퓨터 프로그래밍)|클로저]]로 처리해야 하므로 [[쓰레기 수집 (컴퓨터 과학)|쓰레기 수집]]이 필요하다.

== 같이 보기 ==
* [[eval]]

== 각주 ==
{{각주}}

== 출처 ==
* Leonidas Fegaras. [https://web.archive.org/web/20110720102933/http://lambda.uta.edu/cse5317/l12.ppt "Functional Languages and Higher-Order Functions"]. CSE5317/CSE4305: Design and Construction of Compilers. University of Texas at Arlington.

== 외부 링크 ==
* [http://rosettacode.org/wiki/First-class_functions First-class functions] on Rosetta Code.
* [http://www.ibm.com/developerworks/linux/library/l-highfunc/index.html Higher order functions] {{Webarchive|url=https://web.archive.org/web/20191112160401/http://www.ibm.com/developerworks/linux/library/l-highfunc/index.html|date=November 12, 2019}} at IBM developerWorks

{{자료형}}

[[분류:컴파일러 구성]]
[[분류:자료형]]
[[분류:함수형 프로그래밍]]
[[분류:원시 자료형]]
[[분류:프로그래밍 언어 이론]]
[[분류:함수 (프로그래밍)]]