답변:
정의
객체는 다음과 같은 경우 일류입니다.
- 변수 및 데이터 구조에 저장 가능
- 서브 루틴에 매개 변수로 전달 될 수 있습니다.
- 서브 루틴의 결과로 반환 될 수 있습니다
- 런타임에 구성 가능
- 고유 한 정체성을 가지고 있음
여기서 "객체"라는 용어는 느슨하게 사용되며, 객체 지향 프로그래밍에서 객체를 반드시 언급 할 필요는 없습니다. 정수 및 부동 소수점 숫자와 같은 가장 간단한 스칼라 데이터 형식은 거의 항상 일류입니다.
프로그래밍 언어에서 "일등 시민"또는 "일등 요소" 라는 개념은 1960 년대 영국 컴퓨터 과학자 Christopher Strachey 에 의해 일급 기능의 맥락에서 소개되었습니다 . 이 원칙의 가장 유명한 공식은 Gerald Jay Sussman과 Harry Abelson 의 컴퓨터 프로그램 구조 및 해석에 있습니다 .
- 변수로 이름을 지정할 수 있습니다.
- 그것들은 절차에 대한 논쟁으로 전달 될 수 있습니다.
- 절차 결과로 반환 될 수 있습니다.
- 그것들은 데이터 구조에 포함될 수 있습니다.
기본적으로 이는 프로그래밍 언어의 다른 모든 요소로 수행 할 수있는 모든 것을이 프로그래밍 언어 요소로 수행 할 수 있음을 의미합니다.
그것은 "동등한 권리"에 관한 것입니다. 정수를 사용하여 위의 모든 것을 할 수 있습니다. 왜 다른 일이 달라야합니까?
위의 정의는 프로그램의 객체와 관련하여 일류의 측면에 대해서만 이야기한다는 점에서 약간 제한적입니다. 더 일반적인 정의는 모든 것을 할 수 있다면 일이 일류라는 것입니다. 비슷한 종류의 다른 일을 할 수도 있습니다.
예를 들어, Java 연산자와 Java 메소드는 비슷한 종류입니다. 새로운 메소드를 정의하고, 자신의 메소드 이름을 자유롭게 선택하고, 메소드를 대체하고, 메소드를 오버로드 할 수 있습니다. 제임스 고슬링은이 모든 것을 운영자와 함께 할 수 있지만 당신과 저는 할 수 없습니다. 나는, 통념과는 달리 의미, 자바는 않습니다 지원 연산자 오버로딩을 예를 들어, +
연산자에 대한 과부하 byte
, short
, int
, long
, float
, double
및 String
도에 대한, 그리고 IIRC는 자바 7 BigInteger
과 BigDecimal
(와 아마 내가 잊고 몇),이 것을 그냥 당신그것에 영향을 미치지 않습니다. 그것은이 두 번째 정의에 따라 분명히 연산자를 이류로 만듭니다. 그러나 메소드는 여전히 첫 번째 정의에 따라 일류 객체가 아닙니다. (이것이 연산자를 3 등으로 만드는가?)
일반적으로 이것은 매개 변수로 전달할 수있는 구문을 말하며, 함수에서 리턴 유형으로 정의하거나 값을 지정할 수 있습니다. 일반적으로 런타임에 구성 할 수 있어야합니다. 예를 들어 클래스의 인스턴스는 c ++ 또는 java의 첫 번째 클래스 시민이지만 C의 함수는 그렇지 않습니다.
언어로만 구현되는 기능은 일류 시민이라고 말하고 싶습니다.
즉, 해당 기능을 구현하기 위해 다국어 기능이나 표준 라이브러리가 필요하지 않습니다.
예:
C / C ++에서는 함수를 일등 시민으로 간주하지 않습니다 (다른 사람도 가능).
언어가 직접 지원하지만 다른 언어 기능을 사용해야하는 기능을 조작하는 방법이 있기 때문입니다. 함수에 매개 변수 바인딩은 직접 지원되지 않으므로이 기능을 구현하려면 functor를 빌드해야합니다.