일급 객체

위키백과, 우리 모두의 백과사전.
이동: 둘러보기, 검색

컴퓨터 프로그래밍 언어 디자인에서, 특정 언어의 일급 객체 (일급 값, 일급 엔티티, 혹은 일급 시민)이라 함은 일반적으로 다른 객체들에 적용 가능한 연산을 모두 지원하는 객체를 가리킨다. 함수에 매개변수로 넘기기, 변수에 대입하기와 같은 연산들이 여기서 말하는 일반적인 연산의 예에 해당한다.

역사[편집]

일급/이급 객체의 개념은 영국의 컴퓨터 과학자 크리스토퍼 스트레이치에 의해 1960년대에 처음 소개되었다. 그는 명시적으로 일급 객체의 개념을 정의하지는 않았으나, Algol 프로그래밍 언어의 실수(Real number)와 프로시저를 비교함으로써 일급 객체의 개념에 대해 처음으로 언급하였다.

일급 객체와 이급 객체. 프로그래밍 언어 Algol에서 실수(Real number)는 연산식(Expression)에 사용되거나 변수에 대입될 수 있으며, 프로시저에 매개변수로 넘겨질 수 있다. 하지만 프로시저의 경우 프로시저 콜에서 호출 대상 혹은 매개 변수로 등장할 수 있을 뿐, 프로시저의 리턴 값으로 전달되거나 연산식 내에서 사용될 수는 없다. 이런 측면에서 Algol에서의 프로시저는 이급 시민인데, 변수나 연산식 등을 통한 간접적인 등장이 허용되지 않으면서 스스로 '직접' 나타나야 하기 때문이다.

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

조건[편집]

다음과 같은 조건을 만족할 때 일급 객체라고 말할 수 있다.

  • 변수나 데이터 구조안에 담을 수 있다.
  • 파라미터로 전달 할 수 있다.
  • 반환값(return value)으로 사용할 수 있다.
  • 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.

예제[편집]

가장 간단한 스칼라 타입인 정수(Integer)나 실수(Floating point number)의 경우 거의 모든 언어에서 항상 일급 객체에 해당한다.

대다수의 구형 언어들에서 배열(Array) 및 문자열(String)은 일급 객체에 해당하지 않는다. 가령 Fortran IV나 C에서는 배열 사이의 대입 연산이 지원되지 않으며, 함수의 매개 변수로 배열의 주소를 전달할 수 있을 뿐, 배열 자체를 전달할 수는 없다.

C의 경우 배열 포인터 사이의 대입이 지원되므로 언뜻 배열 대입이 지원되는 것처럼 보일 수 있으나, 배열 포인터는 배열의 첫째 요소 위치를 저장하고 있을 뿐, 배열의 크기에 대한 정보는 갖고있지 않아 배열 자체의 대입을 지원한다고는 볼 수 없다.

일부 객체지향 언어에서 클래스가 일급 객체의 속성을 지니는 경우가 있어 '메타 클래스'로서 이용되기도 하지만, 일반적인 언어에서는 클래스를 포함한 데이터 타입 자체가 일급 객체가 아니다.

GOTO 레이블과 같은 프로그램 컨트롤 흐름과 관련된 엔티티들의 경우 대다수의 언어에서 일급 객체가 아닐뿐 아니라, 애당초 '객체'로서 취급되지도 않는다.

개념 기술 지원 언어
일급 함수 클로저 Scheme, ML, Haskell, F#, Scala, Swift
일급 컨트롤 continuations Scheme, ML, F#
일급 타입 Coq
일급 데이터 타입 Generic Haskell
일급 다형성 비서술적 다형성
일급 메시지 동적 메시지 Smalltalk,[1] Objective-C[1]
일급 클래스 메타 클래스 Smalltalk, Objective-C, Ruby, Python
증명 객체 Coq, Agda

함수[편집]

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

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

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

리플렉션[편집]

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

각주[편집]

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