"일등석"개체 란 무엇입니까?


191

주어진 프로그래밍 언어에서 객체 나 다른 것들이 언제 "일등"이라고 말합니까? 다른 언어와 다른 점은 무엇입니까?

편집하다. 파이썬에서와 같이 "모든 것이 객체"라고 말할 때 실제로 "모든 것이 일류"라는 의미입니까?


1
이 질문을 프로그래머에게 맡길 수 있습니까? 아니면 거기에 맞지 않을까요? 나는이 질문이 좋다고 생각한다. 어떤 포럼이 가장 적합한 지 말할 수 없습니다.
Shashank Sawant

16
이 프로그램을하지 않는 사람들에 의해 폐쇄 것처럼 슬프게도이 정말 보인다 ... 재개로 선정,이 주제에 대해 명확입니다 : /
djechlin

답변:


176

즉, 객체 사용에 제한이 없음을 의미합니다. 다른 객체와 동일합니다.

첫 번째 클래스 객체는 동적으로 생성, 소멸, 함수에 전달, 값으로 반환되고 프로그래밍 언어의 다른 변수와 같은 모든 권한을 가질 수있는 엔터티입니다.

언어에 따라 다음을 의미 할 수 있습니다.

  • 익명의 리터럴 값으로 표현 가능
  • 변수에 저장 가능
  • 데이터 구조에 저장 가능
  • 고유 한 정체성을 가진 사람 (명칭과 무관)
  • 다른 단체와의 평등에 필적하는 것
  • 프로 시저 / 함수에 매개 변수로 전달 가능
  • 절차 / 기능의 결과로 반환 가능
  • 런타임에 구성 가능
  • 인쇄 가능
  • 읽을 수있는
  • 분산 프로세스간에 전송 가능
  • 실행중인 프로세스 외부에 저장 가능

소스 .

그러나 C ++ 함수 자체는 일류 객체가 아닙니다.

  • '()'연산자를 재정 의하여 첫 번째 클래스 인 객체 함수를 사용할 수 있습니다.
  • 함수 포인터는 일류입니다.
  • 부스트 바인드, 람다 및 함수는 일급 함수를 제공합니다.

C ++에서 클래스는 첫 번째 클래스 객체가 아니라 해당 클래스의 인스턴스입니다. 파이썬에서 클래스 객체는 모두 일류 객체입니다. (참조 이 대답 객체로 클래스에 대한 자세한 내용을).

다음은 Javascript 일급 함수의 예입니다.

// f: function that takes a number and returns a number
// deltaX: small positive number
// returns a function that is an approximate derivative of f
function makeDerivative( f, deltaX )
{
    var deriv = function(x)
    { 
       return ( f(x + deltaX) - f(x) )/ deltaX;
    }
    return deriv;
}
var cos = makeDerivative( Math.sin, 0.000001);
// cos(0)     ~> 1
// cos(pi/2)  ~> 0

소스 .

1 급 객체가 아닌 엔티티를 2 급 객체라고합니다. C ++의 함수는 동적으로 만들 수 없기 때문에 두 번째 클래스입니다.

편집 관련 :

편집하다. 파이썬에서와 같이 "모든 것이 객체"라고 말할 때 실제로 "모든 것이 일류"라는 의미입니까?

객체라는 용어는 느슨하게 사용할 수 있으며 일등석을 의미하지는 않습니다. 그리고 전체 개념을 '일등 실체'라고 부르는 것이 더 합리적 일 것입니다. 그러나 파이썬에서는 모든 것을 일등으로 만드는 것을 목표로합니다. 나는 당신의 진술을 한 사람의 의도가 일등을 의미한다고 생각합니다.


2
'일등석'이 아닌 물건의 예를 들어 줄 수 있습니까?
Sudip Bhandari

1
@SudipBhandari 나는 똑같은 것을 궁금해했으며 마침내이 주제에 관한 유용한 Wikipedia 기사 인 first-class citizen / object를 발견했습니다 . Robin Popplestone의 정의가 특히 도움이된다는 것을 알았습니다. (Btw은하는 WP 기사를 게시하는 것은 매우 분명 보일지도 모르지만, 나는 이것이 기본적인 프로그래밍 언어의 개념 몰랐어요)
mblakesley

19

"파이썬에서와 같이"모든 것이 객체 "라고 말할 때 실제로"모든 것이 일류 "라는 의미입니까?"

예.

파이썬의 모든 것은 적절한 객체입니다. 다른 언어로 "기본형"인 것조차도.

2실제로 같은 객체 에는 상당히 풍부하고 정교한 인터페이스가 있습니다.

>>> dir(2)
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__str__', '__sub__', '__truediv__', '__xor__']

모든 것이 파이썬에서 일류 객체이기 때문에 모호한 특수 사례는 거의 없습니다.

예를 들어 Java에는 올바른 객체가 아닌 기본 유형 (int, bool, double, char)이 있습니다. 그렇기 때문에 Java는 정수, 부울, 이중 및 문자를 일급 유형으로 도입해야합니다. 이것은 초보자에게 가르치기가 어려울 수 있습니다. 왜 기본 유형과 클래스가 나란히 존재해야하는지는 분명하지 않습니다.

또한 객체의 클래스 자체가 객체라는 것을 의미합니다. 이것은 클래스가 런타임에 항상 존재하지 않는 C ++과 다릅니다.

의 유형 은 메소드, 속성 및 유형 2이있는 type 'int'오브젝트입니다.

>>> type(2)
<class 'int'>

내장 유형의 유형 inttype 'type'객체입니다. 여기에는 메소드와 속성도 있습니다.

>>> type(type(2))
<class 'type'>

1
이것은 현대 파이썬의 경우에 해당됩니다. 오래된 파이썬 (버전 1? 내 시간 이전)에서는에서 상속받을 수 없었습니다 int. 따라서 "오래된"클래스와 "새로운 스타일의 클래스"(3에는 더 이상 올드 스타일 클래스가 없음)가 있습니다.
Keith Pinson

17

“일등석”은 평소와 같이 업무를 수행 할 수 있음을 의미합니다. 대부분의 경우 이는 단지 일류 시민을 함수에 대한 인수로 전달하거나 함수에서 반환 할 수 있음을 의미합니다.

이것은 객체에 대해 자명하지만 기능이나 클래스에 대해 항상 분명하지는 않습니다.

void f(int n) { return n * 2; }

void g(Action<int> a, int n) { return a(n); }

// Now call g and pass f:

g(f, 10); // = 20

함수가 실제로 일류 객체 가 아닌 C #의 예입니다 . 따라서 위의 코드는 작은 해결 방법 (즉,이라는 일반 대리자 Action<>)을 사용하여 함수를 인수로 전달합니다. Ruby와 같은 다른 언어를 사용하면 클래스와 코드 블록도 일반 변수 (또는 Ruby의 경우 상수)로 처리 할 수 ​​있습니다.



1

IMO 이것은 자연 언어로 사물을 묘사하는 데 사용되는 은유 중 하나입니다. 이 용어는 본질적으로 함수를 일급 객체로 설명하는 맥락에서 사용됩니다.

객체 지향 언어를 고려하면 상속, 클래스 정의, 코드의 다른 섹션에 전달하는 기능 (메서드 인수), 데이터 구조에 저장하는 기능 등과 같은 다양한 기능을 객체에 부여 할 수 있습니다. 자바 스크립트의 경우 함수와 같이 일반적으로 객체로 간주되지 않는 엔터티와 동일하게 이러한 엔터티는 일류 객체로 간주됩니다.

여기서 1 급은 본질적으로 2 급으로 취급되지 않는 것을 의미합니다 (저하 된 행동으로). 본질적으로 조롱은 완벽하거나 구별 할 수 없습니다.

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