기능이 프로그래밍 언어 / 플랫폼에서 "일등 시민"으로 간주되는 시점은 언제입니까?


61

나는 "이 기능을 언어 / 플랫폼에서 일류 시민으로 만들어주십시오"와 같은 진술을 여러 번 보았습니다. 예를 들어 C # /. net의 열거 형에 대해 말합니다. 그렇다면 언제 기능이 프로그래밍 언어 / 플랫폼에서 "일등 시민"으로 간주됩니까?

답변:


40

정의

객체는 다음과 같은 경우 일류입니다.

  • 변수 및 데이터 구조에 저장 가능
  • 서브 루틴에 매개 변수로 전달 될 수 있습니다.
  • 서브 루틴의 결과로 반환 될 수 있습니다
  • 런타임에 구성 가능
  • 고유 한 정체성을 가지고 있음

여기서 "객체"라는 용어는 느슨하게 사용되며, 객체 지향 프로그래밍에서 객체를 반드시 언급 할 필요는 없습니다. 정수 및 부동 소수점 숫자와 같은 가장 간단한 스칼라 데이터 형식은 거의 항상 일류입니다.

http://en.wikipedia.org/wiki/First_class_object


1
그렇다면 열거 형을 .net / C #에서 2 급 객체로 만드는 것은 무엇입니까?
Gulshan

7
@Gulshan-본질적인 정체성이 없다고 주장 할 수있다-C # 열거 형은 기본적으로 정수 값에 대한 구문 설탕 (즉, "이름")이다. 열거 형 자체가 객체 인 Java와 비교하십시오.
mikera

.NET 열거 형에서 @ mikera는 그 자체의 가치입니다. Java에는 값이 없으며 객체 만 있습니다. 유일한 차이점입니다.
SK-logic

@ mikera : Java 열거 형이 비트 필드를 표현할 수있는 것과 같은 멋진 속성을 갖지 못하게합니다. 그들의 구현은 아마도 일류이지만 아마도 대부분의 API는 여전히 많은 정수 (또는 문자열) 상수를 가지고 있으며 그것들의 많은 용도는 열거 형으로 쉽게 대체 할 수 없습니다.
Joey

.Net에서 런타임에 열거 형을 만들 수 있다고 생각하지 않습니다. 나는 그들이 항상 상수라고 생각했습니다.
트래비스

33

프로그래밍 언어에서 "일등 시민"또는 "일등 요소" 라는 개념은 1960 년대 영국 컴퓨터 과학자 Christopher Strachey 에 의해 일급 기능의 맥락에서 소개되었습니다 . 이 원칙의 가장 유명한 공식은 Gerald Jay Sussman과 Harry Abelson 의 컴퓨터 프로그램 구조 및 해석에 있습니다 .

  • 변수로 이름을 지정할 수 있습니다.
  • 그것들은 절차에 대한 논쟁으로 전달 될 수 있습니다.
  • 절차 결과로 반환 될 수 있습니다.
  • 그것들은 데이터 구조에 포함될 수 있습니다.

기본적으로 이는 프로그래밍 언어의 다른 모든 요소로 수행 할 수있는 모든 것을이 프로그래밍 언어 요소로 수행 할 수 있음을 의미합니다.

그것은 "동등한 권리"에 관한 것입니다. 정수를 사용하여 위의 모든 것을 할 수 있습니다. 왜 다른 일이 달라야합니까?

위의 정의는 프로그램의 객체와 관련하여 일류의 측면에 대해서만 이야기한다는 점에서 약간 제한적입니다. 더 일반적인 정의는 모든 것을 할 수 있다면 일이 일류라는 것입니다. 비슷한 종류의 다른 일을 할 수도 있습니다.

예를 들어, Java 연산자와 Java 메소드는 비슷한 종류입니다. 새로운 메소드를 정의하고, 자신의 메소드 이름을 자유롭게 선택하고, 메소드를 대체하고, 메소드를 오버로드 할 수 있습니다. 제임스 고슬링은이 모든 것을 운영자와 함께 할 수 있지만 당신과 저는 할 수 없습니다. 나는, 통념과는 달리 의미, 자바는 않습니다 지원 연산자 오버로딩을 예를 들어, +연산자에 대한 과부하 byte, short, int, long, float, doubleString도에 대한, 그리고 IIRC는 자바 7 BigIntegerBigDecimal(와 아마 내가 잊고 몇),이 것을 그냥 당신그것에 영향을 미치지 않습니다. 그것은이 두 번째 정의에 따라 분명히 연산자를 이류로 만듭니다. 그러나 메소드는 여전히 첫 번째 정의에 따라 일류 객체가 아닙니다. (이것이 연산자를 3 등으로 만드는가?)


6

일반적으로 이것은 매개 변수로 전달할 수있는 구문을 말하며, 함수에서 리턴 유형으로 정의하거나 값을 지정할 수 있습니다. 일반적으로 런타임에 구성 할 수 있어야합니다. 예를 들어 클래스의 인스턴스는 c ++ 또는 java의 첫 번째 클래스 시민이지만 C의 함수는 그렇지 않습니다.


C ++에서 클래스를 일등 시민으로 만드는 이유는 무엇입니까?
Bjarke Freund-Hansen

2
@bjarkef : 위의 문장에서 제공된 설명과 일치하는 것으로 이미 답변 된 것 같습니다.
doppelgreener

@Jonathan : 예, 죄송합니다. "런타임에 구성"을 잘못 읽었습니다. 예. 런타임에 클래스 인스턴스 (객체)를 만들 수 있지만 클래스 자체는 만들 수 없습니다. 그것이 나를 혼란스럽게 한 것입니다.
Bjarke Freund-Hansen

1
매개 변수로 전달하는 것만으로는 충분하지 않습니다. C / C ++에서 나는 여전히 기능을 2 급 시민으로 생각할 것이다. 매개 변수로 전달 될 수 있으며 다른 오브젝트 내에 배치 된 결과로 리턴됩니다. 그러나 다른 구문을 사용하지 않으면 조작 할 수 없습니다 (예 : std :: bind는 매개 변수를 함수에 바인딩하는 데 필요함).
Martin York

@Martin 저는 함수가 C / C ++에서 일류 시민이라고 말한 적이 없습니다.
Pemdas

1

언어로만 구현되는 기능은 일류 시민이라고 말하고 싶습니다.
즉, 해당 기능을 구현하기 위해 다국어 기능이나 표준 라이브러리가 필요하지 않습니다.

예:

C / C ++에서는 함수를 일등 시민으로 간주하지 않습니다 (다른 사람도 가능).
언어가 직접 지원하지만 다른 언어 기능을 사용해야하는 기능을 조작하는 방법이 있기 때문입니다. 함수에 매개 변수 바인딩은 직접 지원되지 않으므로이 기능을 구현하려면 functor를 빌드해야합니다.


1
바운드 함수 (또는 "클로저")가 일류가 아닌 함수 자체가 아닌가? 폐쇄에 대한 0x의 지원은 분석에 어떻게 영향을 미칩니 까?
Fred Nurk

@Fred Nurk : 언어에 따라 다릅니다. 일부 언어에서는 클로저가 일류 시스템입니다. 다른 사람들에게는 그렇지 않습니다. 아직 C ++ 0x에 익숙하지 않아서 명시적인 의견을 제시 할 수 없습니다.
Martin York

대답에서와 같이 언어가 C 또는 C ++ (0x 아님)라고 가정 해 봅시다. "퍼스트 클래스"에 대한 정의가 바운드 함수 (또는 "클로저")가 퍼스트 클래스가 아닌 함수 자체가 아닌가?
Fred Nurk

@Fred Nurk : 함수로 할 수있는 일을 제한한다면 그것들을 클로저로 만드는 것입니다. 그러나 나에게 그것은 당신이 플랫폼이 라이브러리를 가져 와서 만 정수 추가를 지원한다면 말하는 것과 같습니다. 그런 다음 정수는 일급 시민이지만 정수 추가는 고려되지 않습니다. 내 관점에서 클로저는 새로운 함수를 효과적으로 반환하는 함수에서 수행 할 수있는 작업입니다 (그러나 정의하는 방법에 따라 다름). 그러나 폐쇄와 구속은 토론에서 제외 할 수있는 다른 작업의 두 가지 작업에 지나지 않습니다 (물론 확실하지 않습니다).
Martin York

@ 마틴 : 나는 나 자신을 명확하게 설명해서는 안됩니다. "기능이 언어에 의해서만 구현된다면 기능은 일류 시민"이라는 점을 감안할 때 C와 C ++의 함수는 언어에 의해서만 구현되므로 일류가 될 것입니다. 바운드 함수 ( "클로저"라고도 함)는 바인딩 매개 변수 등을 사용하여 말하는 내용이지만 다른 기능입니다.
Fred Nurk

-1

이미 제공된 답변에 예를 추가하려면 다음을 수행하십시오.

WCF / C #에서는 현재 서비스로 작동하도록 서비스 계약 속성으로 클래스 개체를 표시해야합니다. 다음과 같은 것은 없습니다.

public **service** MyService (in relation public **class** MyClass). 

클래스는 서비스가없는 C #의 일등 시민입니다.

도움이 되었기를 바랍니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.