일급 객체
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
일급 객체는 프로그래밍 언어에서 객체를 다루는 방식에 대한 개념으로, 1960년대 크리스토퍼 스트래치에 의해 처음 언급되었다. 일급 객체는 로빈 포플스톤에 의해 정의된 네 가지 기본적인 권리, 즉 함수의 매개변수, 반환 값, 할당 명령문의 대상, 동일 비교의 대상이 될 수 있는 특징을 갖는다. 일급 객체는 정수, 실수와 같은 스칼라 자료형, 함수, 클래스 등 다양한 형태로 나타나며, 언어에 따라 지원되는 정도가 다르다. 자바, PHP와 같은 언어는 리플렉션을 통해 내부 구조에 접근할 수 있으며, Lisp 계열 언어에서는 언어의 핵심 기능으로 제공된다.
더 읽어볼만한 페이지
일급 객체 | |
---|---|
개요 | |
유형 | 프로그래밍 언어 개념 |
다른 이름 | 일급 타입 일급 객체 일급 엔티티 일급 값 |
정의 | |
설명 | 프로그래밍 언어에서 다른 모든 엔티티와 동등하게 취급되는 엔티티. |
특징 | 변수에 저장될 수 있다. 함수에 인수로 전달될 수 있다. 함수에서 반환될 수 있다. 데이터 구조에 저장될 수 있다. |
예시 | 함수를 일급 객체로 취급하는 언어: 스몰토크, 러스트, 자바스크립트, 파이썬, 루비, 스칼라, 클로저, 하스켈, ML 일부 제약 하에 일급 객체를 지원하는 언어: C, C++ |
C/C++에서의 예시 | 기본 타입: 정수형, 부동소수점수 포인터 |
주의사항 | C/C++에서 배열 자체는 일급 객체가 아니지만, 배열의 요소에 대한 포인터는 일급 객체로 취급될 수 있다. |
2. 역사
1960년대, 영국의 컴퓨터 과학자 크리스토퍼 스트래치는 알골의 실수와 프로시저를 비교하면서 일급 및 이급 객체의 개념을 처음 언급하였다.[2][3]
크리스토퍼 스트래치는 알골의 실수와 프로시저를 비교하면서 일급 객체와 함께 이급 객체 개념을 처음 언급했다.[2][3] 일부 언어에서는 일급 객체의 조건을 모두 만족하지는 않지만, 함수 포인터 등을 통해 유사하게 다룰 수 있는 '''이급 객체'''를 지원하기도 한다.
First-class and second-class objects.영어 알골에서 실수는 표현식에 사용하거나 변수에 할당할 수 있으며, 프로시저에 매개변수로 넘겨질 수 있다. 하지만 프로시저의 경우 프로시저 호출에서 호출 대상 혹은 매개 변수로 등장할 수 있을 뿐이며, 프로시저를 반환하는 프로시저는 없다. 이런 측면에서 ALGOL에서의 프로시저는 이급 시민이다. 언제나 직접 나타나야 하며 변수나 연산식으로 대신 나타낼 수 없기 때문이다.[4]
로빈 포플스톤은 일급 객체를 구성하는 요소는 기본적인 권리가 있다는, 다음의 정의를 내렸다.[5]
# 모든 요소는 함수의 실제 매개변수가 될 수 있다.
# 모든 요소는 함수의 반환 값이 될 수 있다.
# 모든 요소는 할당 명령문의 대상이 될 수 있다.
# 모든 요소는 동일 비교의 대상이 될 수 있다.
1990년대에 들어 미국의 컴퓨터 과학자 라파엘 핑켈이 이급 및 삼급 객체에 대한 정의를 제안한 바 있으나,[6] 널리 받아들여지지는 않았다.[7]
3. 상세
스몰토크에서 함수(메서드)와 연산자(+, - 등)는 모두 메서드이므로 일급 객체이다.
자바와 PHP 같은 일부 언어는 내부 구현 구조에 접근할 수 있는 리플렉션 하위 시스템을 가지고 있지만, 일반 객체처럼 다룰 수는 없다. 반면, Lisp 계열 언어에서는 리플렉션이 핵심 기능으로, 다음과 같은 형태로 나타난다.3. 1. 일급 객체의 조건
1960년대, 영국의 컴퓨터 과학자 크리스토퍼 스트래치는 알골의 실수와 프로시저를 비교하면서 일급 및 이급 객체의 개념을 처음으로 언급하였다.[2][3] 그는 알골에서 실수는 표현식에 사용하거나 변수에 할당할 수 있으며, 프로시저에 매개변수로 넘겨질 수 있지만, 프로시저 자체는 호출 대상 또는 매개변수로만 나타날 수 있고 프로시저를 반환하는 프로시저는 없다는 점을 지적했다. 이러한 측면에서 알골의 프로시저는 이급 시민으로, 항상 직접 나타나야 하며 변수나 연산식으로 표현될 수 없다고 하였다.[4]
로빈 포플스톤은 일급 객체가 가져야 할 기본적인 권리로 다음 네 가지를 제시하였다.[5]
# 모든 요소는 함수의 실제 매개변수가 될 수 있다.
# 모든 요소는 함수의 반환 값이 될 수 있다.
# 모든 요소는 할당 명령문의 대상이 될 수 있다.
# 모든 요소는 동일 비교의 대상이 될 수 있다.
1990년대에 미국의 컴퓨터 과학자 라파엘 핀켈은 이급 및 삼급 객체에 대한 정의를 제안했지만, 널리 받아들여지지는 않았다.[6][7]
대부분의 언어에서 함수를 다른 함수에 매개 변수로 전달하거나 리턴 값으로 받을 수 있다는 점이 일급 객체의 조건으로 충분한지에 대해서는 논쟁의 여지가 있다. 일부 저자들은 런타임에 함수를 생성할 수 있어야 '일급 객체'라고 부를 수 있다고 주장하며, 이 기준에 따르면 C와 같은 언어의 함수는 일급 객체가 아니다. 이러한 C의 함수 등은 때때로 '''이급 객체'''라고 불리기도 하는데, 이는 일급 객체의 속성을 모두 갖추지는 못했지만 그에 상응하는 방식으로 다뤄질 수 있기 때문이다.
스몰토크에서 함수(메서드)는 스몰토크 클래스와 마찬가지로 일급 객체이다. 스몰토크 연산자(+, - 등)는 메서드이므로 일급 객체이다.
3. 2. 일급 객체의 예
정수와 실수처럼 가장 간단한 스칼라 자료형은 대부분 일급 객체이다.
대부분의 구형 언어에서 배열 및 문자열은 일급 객체에 해당하지 않으며 객체에 할당하거나 서브루틴에 매개변수로 전달할 수 없다. 예를 들어 포트란 IV나 C는 배열을 할당할 수 없으며, 함수의 매개변수로는 첫 요소의 위치만 전달할 뿐, 배열 크기는 알 수 없다. C의 경우 배열 포인터 할당을 지원하므로 언뜻 배열을 할당할 수 있는 것처럼 보일 수 있으나, 마찬가지로 첫 요소를 가리키는 포인터일 뿐 크기는 알지 못한다.
대부분의 언어에서 자료형은 일급 객체가 아니지만, 일부 객체 지향 언어의 클래스는 메타클래스의 인스턴스로서 일급 객체이다.
GOTO 레이블과 같은 프로그램 컨트롤 흐름 제어의 경우 많은 수의 언어에서 일급 객체는 물론 객체로 취급하지 않는다.
개념 | 기술 | 지원 언어 |
---|---|---|
일급 함수 | 클로저와 무명 함수 | Dart, Scheme, ML, 하스켈, F#, Kotlin, Scala, 스위프트, 펄, PHP, 파이썬, 라쿠, 자바스크립트, 델파이, 러스트 |
일급 컨트롤 | continuations | Scheme, ML, F# |
일급 타입 | Coq | |
일급 자료형 | Generic Haskell | |
일급 다형성 | 비서술적 다형성 | |
일급 메시지 | 동적 메시지 | 스몰토크,[13] Objective-C[13] |
일급 클래스 | 메타클래스 | 스몰토크, Objective-C, 루비, 파이썬 |
일급 증명 | 증명 객체 | Coq, Agda |
3. 3. 이급 객체
크리스토퍼 스트래치는 알골의 실수와 프로시저를 비교하면서 이급 객체의 개념을 처음 언급하였다.First and second class objects.영어
In ALGOL a real number may appear in an expression or be assigned to a variable, and either may appear as an actual parameter in a procedure call. A procedure, on the other hand, may only appear in another procedure call either as the operator (the most common case) or as one of the actual parameters. There is no sense in which a procedure may be the result of a procedure call or the value of an assignment.영어
Thus in a sense procedures in ALGOL are second class citizens—they always have to appear in person and can never be represented by a variable or expression (except in the case of formal parameters.영어
로빈 포플스톤은 일급 객체가 가져야 할 기본적인 권리로 다음을 제시했다.[1]
# 모든 요소는 함수의 실제 매개변수가 될 수 있다.
# 모든 요소는 함수의 반환 값이 될 수 있다.
# 모든 요소는 할당 명령문의 대상이 될 수 있다.
# 모든 요소는 동일 비교의 대상이 될 수 있다.
C의 함수와 같은 객체는 때때로 '''이급 객체'''라고 불리는데,[2] 비록 일급 객체의 속성을 모두 갖추지는 못했지만, 함수 포인터를 통해 그에 상응하는 방식으로 다뤄질 수 있기 때문이다.[3]
4. 언어별 지원 현황
정수, 실수와 같은 간단한 스칼라 자료형은 대부분 일급 객체이다.
대부분의 구형 언어에서 배열 및 문자열은 일급 객체에 해당하지 않으며, 객체에 할당하거나 서브루틴에 매개변수로 전달할 수 없다. 예를 들어 포트란 IV나 C는 배열을 할당할 수 없으며, 함수의 매개변수로는 첫 요소의 위치만 전달할 뿐, 배열 크기는 알 수 없다. C의 경우 배열 포인터 할당을 지원하므로 배열을 할당할 수 있는 것처럼 보일 수 있지만, 이 역시 첫 요소를 가리키는 포인터일 뿐 크기는 알 수 없다.
대부분의 언어에서 자료형은 일급 객체가 아니지만, 일부 객체 지향 언어의 클래스는 메타클래스의 인스턴스로서 일급 객체이다.
GOTO 레이블과 같은 프로그램 컨트롤 흐름 제어의 경우 많은 수의 언어에서 일급 객체는 물론 객체로 취급하지 않는다.
개념 | 기술 | 지원 언어 |
---|---|---|
일급 함수 | 클로저와 무명 함수 | Dart, Scheme, ML, 하스켈, F#, Kotlin, Scala, 스위프트, 펄, PHP, 파이썬, 라쿠, 자바스크립트, 델파이, 러스트 |
일급 컨트롤 | continuations | Scheme, ML, F# |
일급 타입 | Coq | |
일급 자료형 | Generic Haskell | |
일급 다형성 | 비서술적 다형성 | |
일급 메시지 | 동적 메시지 | 스몰토크,[13] Objective-C[13] |
일급 클래스 | 메타 클래스 | 스몰토크, Objective-C, 루비, 파이썬 |
일급 증명 | 증명 객체 | Coq, Agda |
5. 리플렉션
자바와 PHP와 같은 일부 언어는 명시적 리플렉션 하위 시스템을 갖추고 있다. 이러한 언어에서는 일반 객체와 동일한 방식으로 접근하거나 조작할 수는 없지만, 내부 구현 구조에 접근할 수 있다.
Lisp 계열과 같은 다른 언어에서 리플렉션은 특별한 하위 시스템이 아닌 언어의 핵심 기능이다. 일반적으로 다음과 같은 형태로 나타난다.
- 구문 매크로 또는 fexpr: 사용자가 코드를 데이터로 처리하고 재량에 따라 평가하는 코드를 작성할 수 있다. 예를 들어 프로그램이 컴파일러, 인터프리터 또는 파서 (리더 매크로) 내에서 프로그램을 작성(또는 자체 재작성)할 수 있도록 한다.
- 메타순환 평가자: 언어의 평가자 정의를 자체의 컴파일된 동일체화로 제공하여, 자체와 다른 메타 언어 없이 언어를 간단하게 수정할 수 있다.
- 메타객체 프로토콜: 객체 지향 프로그래밍을 위한 특수한 형태의 메타순환 평가자다. 객체 시스템이 메타클래스와 메타객체 시스템을 통해 재귀적으로 자체를 구현하며, 이들은 자체적으로 클래스이자 객체이다.
이러한 기능들은 언어 구현에 대한 다양한 형태의 일급 접근을 허용하며, 일반적으로 일반 언어 객체와 동일한 방식으로 조작할 수 있고 완전히 구별할 수 없다. 그러나 사용자의 테스트되지 않은 핵심 프로그래밍 시스템 수정은 언어 구현자가 수행한 성능 최적화를 쉽게 훼손할 수 있으므로, 일반적으로 사용에는 몇 가지 제약과 조언이 따른다.
참조
[1]
서적
Programming Language Pragmatics
https://archive.org/[...]
Morgan Kaufmann Publishers
[2]
논문
Christopher Strachey—Understanding Programming Languages
[3]
서적
Structure and Interpretation of Computer Programs
http://mitpress.mit.[...]
[4]
논문
Fundamental Concepts in Programming Languages
http://www.ics.uci.e[...]
[5]
간행물
The Design Philosophy of POP-2
Edinburgh at the University Press
[6]
서적
Advanced Programming language Design
[7]
웹사이트
About first-,second- and third-class value
https://stackoverflo[...]
2013-09-14
[8]
논문
Type Inference for First-Class Messages with Match-Functions
http://citeseerx.ist[...]
[9]
서적
Language Engineering and Rigorous Software Development
2009
[10]
웹사이트
型 - cppreference.com (C)
https://ja.cpprefere[...]
[11]
웹사이트
型 - cppreference.com (C++)
https://ja.cpprefere[...]
[12]
웹사이트
C Program For Create An Array In Structure
https://www.programm[...]
2016-04-29
[13]
문서
Type Inference for First-Class Messages with Match-Functions
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com