일급 객체

위키백과, 우리 모두의 백과사전.

컴퓨터 프로그래밍 언어 디자인에서, 일급 객체(영어: first-class object)란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다. 보통 함수에 인자로 넘기기, 수정하기, 변수에 대입하기와 같은 연산을 지원할 때 일급 객체라고 한다.

역사[편집]

1960년대, 영국의 컴퓨터 과학자 크리스토퍼 스트래치알골실수프로시저를 비교함으로써 일급 및 이급 객체의 개념에 대해 처음으로 언급하였다.

일급 객체와 이급 객체. ALGOL에서 실수는 표현식에 사용하거나 변수에 할당할 수 있으며, 프로시저에 매개변수로 넘겨질 수 있다. 하지만 프로시저의 경우 프로시저 콜에서 호출 대상 혹은 매개 변수로 등장할 수 있을 뿐이며, 프로시저를 반환하는 프로시저는 없다. 이런 측면에서 ALGOL에서의 프로시저는 이급 시민이다. 언제나 직접 나타나야 하며 변수나 연산식으로 대신 나타낼 수 없기 때문이다.

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

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

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

예제[편집]

정수실수처럼 가장 간단한 스칼라 자료형은 대부분 일급 객체이다.

대다수의 구형 언어에서, 배열문자열은 일급 객체에 해당하지 않으며 객체에 할당하거나 서브루틴에 매개변수로 전달할 수 없다. 가령 포트란 IVC는 배열을 할당할 수 없으며, 함수의 매개변수로는 첫 요소의 위치만 전달할 뿐, 배열 크기는 분실한다. C의 경우 배열 포인터 할당을 지원하므로 언뜻 배열을 할당할 수 있는 것처럼 보일 수 있으나, 마찬가지로 첫 요소를 가리키는 포인터일 뿐 크기는 알지 못한다.

대부분의 언어에서 자료형은 일급 객체가 아니지만, 일부 객체 지향 언어의 클래스는 메타클래스의 인스턴스로서 일급 객체이다,

GOTO 레이블과 같은 프로그램 컨트롤 흐름 제어의 경우 많은 수의 언어에서 일급 객체는 물론 객체로 취급하지 않는다.

개념 기술 지원 언어
일급 함수 클로저무명 함수 Dart, Scheme, ML, 하스켈, F#, Kotlin, Scala, 스위프트, , PHP, 파이썬, 라쿠, 자바스크립트, 델파이, 러스트
일급 컨트롤 continuations Scheme, ML, F#
일급 타입 Coq
일급 자료형 Generic Haskell
일급 다형성 비서술적 다형성
일급 메시지 동적 메시지 스몰토크,[1] Objective-C[1]
일급 클래스 메타 클래스 스몰토크, Objective-C, 루비, 파이썬
일급 증명 증명 객체 Coq, Agda

함수[편집]

대다수의 언어에서 함수를 다른 함수에 매개 변수로 전달하거나 리턴 값으로 받을 수 있는데, 이러한 속성이 일급 객체의 조건으로 충분한 지에 대해서는 논쟁의 여지가 있다.

일부 저자들의 경우 함수가 '일급 객체'가 되기 위한 조건으로 런타임에 함수 생성 가능 여부를 드는데, 이 조건에 의하면 C와 같은 언어에서의 함수는 일급 객체가 아니다. C의 함수와 같은 객체들은 경우에 따라서 이급 객체로 불리기도 하는데, 비록 일급 객체의 속성을 모두 갖추지는 못했다 하더라도 그에 상응하는 방식으로 다뤄질 수 있기 때문이다.

프로그래밍 언어 Smalltalk의 경우 클래스와 마찬가지로 함수 역시 일급 객체에 해당하며, +, -와 같은 연산 자체 역시 본질적으로 함수(메서드)이므로 마찬가지로 일급 객체에 해당한다.

리플렉션[편집]

Java와 같은 일부 언어의 경우 명시적 리플렉션 서브시스템을 갖추고 있다.

각주[편집]

  1. Paritosh Shroff, Scott F. Smith. Type Inference for First-Class Messages with Match-Functions