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

댓글

답변

정의

객체는 다음과 같은 경우 최고급입니다.

  • 변수 및 데이터 구조에 저장 가능
  • 파라미터로 서브 루틴에 전달 가능
  • 서브 루틴의 결과로 반환 가능
  • 런타임에 생성 될 수 있습니다.
  • (주어진 이름과 무관 한) 고유 ID가 있습니다.

여기서 “객체”라는 용어는 느슨하게 사용됩니다. 객체 지향 프로그래밍에서 반드시 객체를 참조하는 것은 아닙니다. 정수 및 부동 소수점 숫자와 같은 가장 단순한 스칼라 데이터 유형은 거의 항상 일급입니다.

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

댓글

  • 그러면 enum을 두 번째 클래스 객체로 만드는 것은 .net / C #에서?
  • @Gulshan-고유 ID의 부족을 주장 할 수 있습니다.-C # 열거 형은 기본적으로 구문 설탕 일뿐입니다 (예 : " 지정된 이름 ")는 정수 값입니다. 열거 형이 자체적으로 객체 인 Java와 비교해보십시오.
  • @mikera, .NET에서 열거 형은 자체적으로 값입니다. Java에는 값이없고 객체 만 있습니다. ' 유일한 차이점입니다.
  • @mikera : Java를 방지하지만 '의 열거 형은 비트 필드를 표현할 수있는 것과 같은 멋진 속성을 가지고 있습니다. 그들의 구현은 아마도 더 일류급이지만 대부분의 API에는 여전히 많은 정수 (또는 문자열) 상수가 있으며 이들의 많은 용도는 열거 형으로 쉽게 대체 할 수 없습니다.
  • I don ' .Net에서 런타임에 열거 형을 구성 할 수 있다고 생각하지 않습니까? 항상 상수라고 생각했습니다.

Answer

" 일류 시민 " 또는 " 일류 요소 " 는 1960 년대 영국의 컴퓨터 과학자 Christopher Strachey 가 최초의 맥락에서 소개했습니다. -클래스 기능. 이 원칙의 가장 유명한 공식은 아마도 Gerald Jay Sussman과 Harry Abelson의 컴퓨터 프로그램의 구조 및 해석 에 있습니다.

  • 변수로 이름을 지정할 수 있습니다.
  • 프로 시저에 인수로 전달할 수 있습니다.
  • 다음의 결과로 반환 될 수 있습니다.
  • 데이터 구조에 포함될 수 있습니다.

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

" 동등한 권한 " : 정수를 사용하여 위의 모든 작업을 수행 할 수 있습니다. 그렇다면 다른 것이 왜 달라야합니까?

위의 정의는 실제로 만 가능하다는 점에서 약간 제한적입니다. 프로그램의 대상이되는 것과 관련된 일류의 측면에 대해 이야기합니다. 모든 것을 할 수 있다면 비슷한 종류의 다른 작업을 할 수도 있습니다.

예를 들어 Java 연산자와 Java 메서드는 비슷한 종류입니다. 새로운 메서드를 정의 할 수 있고, (다소) 자유롭게 자신의 메서드 이름을 선택할 수 있으며, 메서드를 재정의하고 메서드를 오버로드 할 수 있습니다. James Gosling은 연산자로도 모든 작업을 수행 할 수 있지만 당신과 나 는 할 수 없습니다. 대중적인 믿음과는 달리 Java는 연산자 오버로딩을 지원 합니다. 예를 들어 , + 연산자가 byte, short, , long, float, doubleString 및 Java 7의 IIRC는 BigIntegerBigDecimal (그리고 아마도 몇 개는 잊었습니다), 단지 당신 에 영향을 미치지 않는다는 것입니다.이 두 번째 정의에 따르면 연산자는 분명히 두 번째 클래스가됩니다. 그러나 첫 번째 정의에 따르면 메서드는 여전히 “일급 객체가 아닙니다. 연산자를 세 번째로 만들까요?”

댓글

  • 훌륭한 대답입니다. 예를 들어 pipenv 문서 는 " Windows가 일류 시민입니다. " Windows에서 pipenv를 사용하여 Linux에서도 수행 할 수있는 모든 작업을 수행 할 수 있음을 의미합니까?

li>

  • 아니요. ' " 일류 시민 는 용어의 형식적 프로그래밍 언어 이론 정의와 관련이 있습니다. pipenv는 일반적인 표준 영어 의미로 용어를 사용하고 있다고 생각합니다.
  • " 에서처럼 공정하게 대했습니까? " 도와 주셔서 감사합니다.
  • 답변

    보통이 refe rs를 매개 변수로 전달할 수 있고, 함수에서 반환 유형으로 정의하거나 값을 할당 할 수있는 구문에 추가합니다. 일반적으로 런타임에 구성 할 수 있어야합니다. 예를 들어, 클래스의 인스턴스는 C ++ 또는 Java의 첫 번째 클래스 시민이지만 C의 함수는 그렇지 않습니다.

    댓글

    • C ++에서 클래스를 일류 시민으로 만드는 이유는 무엇입니까?
    • @bjarkef : 이미 답변 된 것 같습니다. 이전 문장에 제공된 설명과 일치합니다.
    • @Jonathan : 예, 죄송합니다. " 런타임에 구성합니다. ". 예, 런타임에 클래스 (객체)의 인스턴스를 생성 할 수 있지만 클래스 자체는 생성 할 수 없습니다. 그것이 저를 혼란스럽게했습니다.
    • 매개 변수로 전달하는 것만으로는 충분하지 않습니다. C / C ++에서는 여전히 함수를 2 급 시민으로 간주합니다. 매개 변수로 전달 될 수 있으며 다른 객체 내에 배치 된 결과로 반환됩니다. 그러나 다른 구조의 도움 없이는 조작 할 수 없습니다 (예 : std :: bind는 매개 변수를 함수에 바인딩하는 데 필요합니다).
    • @Martin 저는 함수가 C / C ++에서 일류 시민이라고 말한 적이 없습니다. .

    답변

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

    예 :

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

    댓글

    • Wouldn ' 결합 된 함수 (또는 " 클로저 ")를 일류가 아니지만 함수 자체는 그렇지 않습니까? 0x '의 클로저 지원이 분석에 어떻게 영향을 미칩니 까?
    • @Fred Nurk : 모든 것이 언어에 따라 다릅니다. 일부 언어에서 폐쇄는 일급 시스템입니다. 다른 사람들에게는 그렇지 않습니다. 아직 C ++ 0x에 대해 충분히 익숙하지 않아 명시적인 설명을 할 수 없습니다.
    • '에서 언어가 C 또는 C ++ (0x는 아님)라고 말하게합니다. ), 당신의 대답과 같습니다. ' " 일류 "에 대한 정의가 바인딩 된 함수 (또는 " 폐쇄 ")는 일류가 아니지만 함수 자체는 그렇습니까?
    • @Fred Nurk : 제한하는 경우 함수로 할 수있는 유일한 일은 그것들을 클로저로 만드는 것입니다. 하지만 저에게는 ' 플랫폼이 라이브러리를 가져 와서 만 정수 추가를 지원하는지 말하는 것과 같습니다. 그러면 정수는 일급 시민이지만 정수 추가는 고려되지 않습니다. 내 뷰에서 클로저는 새 함수를 효과적으로 반환하는 함수에서 수행 할 수있는 작업입니다 (하지만 정의 방법에 따라 다름). 그러나 폐쇄와 구속은 우리가 토론에서 얼마나 많은 사람들을 제외하고 있는지 두 가지 작업 일뿐입니다 (질문 이었는지 모르겠습니다).
    • @Martin : 제 자신을 명확하게 설명해서는 안됩니다. " 기능이 언어로만 구현되는 경우 " 기능이 1 급 시민이므로 C 및 C ++의 기능이 모두 구현됩니다. 전적으로 언어에 의해 일류가 될 것입니다. 바운드 함수 (" 클로저 "라고도 함)는 ' 바인딩 매개 변수 등에 대해 이야기하지만 ' 다른 기능입니다.

    답변

    이미 제공된 답변에 예를 추가하려면 :

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

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

    클래스는 서비스가 아닌 C #의 1 급 시민입니다.

    희망 도움이됩니다.

    답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다