이(컴퓨터 프로그래밍)

this (computer programming)

this, self Me는 일부 컴퓨터 프로그래밍 언어에서 현재 실행 중인 코드가 속한 객체, 클래스 또는 기타 엔티티를 참조하기 위해 사용되는 키워드입니다.따라서 이러한 키워드에 의해 참조되는 엔티티는 실행 컨텍스트(예를 들어 메서드가 호출된 오브젝트)에 따라 달라집니다.프로그래밍 언어에 따라 이러한 키워드를 사용하는 방법이 약간 다릅니다."this"와 같은 키워드가 필수인 언어에서는 키워드가 현재 개체에 저장된 데이터 및 메서드에 액세스하는 유일한 방법입니다.옵션인 경우 변수와 함수가 동일한 이름으로 모호하지 않게 할 수 있습니다.

객체 지향 프로그래밍

많은 객체 지향 프로그래밍 언어에서this(일명self또는Me)는 인스턴스 메서드에서 작업 중인 개체를 참조하기 위해 사용되는 변수입니다.첫 번째 OO 언어인 SIMULA 67이 사용되었습니다.this 로컬 [1]: 4.3.2.3 개체를 명시적으로 참조합니다.C++ 및 C++에서 파생된 언어(Java, C#, D, PHP )도 일반적으로 사용합니다.this. SmalltalkObject Pascal, Perl, Python, Ruby, Rust, Objective-C, DataFlex Swift와 같은 기타 기능은 다음과 같습니다.self. Microsoft의 Visual Basic 용도는Me.

이 개념은 모든 언어에서 동일합니다.this는 보통 현재 객체를 참조하는 불변참조 또는 포인터입니다.현재 객체는 종종 속성을 포함하는 속성, 메서드, 서브클라이언트 또는 함수에 대한 '부모'로서 기능하는 코드입니다.this키워드를 지정합니다.오브젝트가 적절하게 구성되거나 인스턴스화된 후this는 항상 유효한 참조입니다.명시적으로 필요한 언어도 있고, 클래스 내의 기호를 표시하기 위해 암시적으로 사용하기 위해 어휘 범위 지정을 사용하는 언어도 있습니다.또는 에 의해 참조되는 현재의 오브젝트this키워드를 포함하는 함수 또는 메서드를 호출한 독립 코드 개체일 수 있습니다.this예를 들어 웹 페이지의 HTML 태그에 부착된 JavaScript 이벤트 핸들러가 키워드를 포함하는 함수를 호출할 때 발생합니다.this문서 오브젝트 외부에 있는 글로벌 공간에 저장되어 있습니다.이 문맥에서는,this는 문서 오브젝트 내의 페이지 요소를 참조합니다.창 오브젝트는 [2]참조하지 않습니다.

일부 언어(예: C++ 및 Java)에서는this또는self키워드이며 변수는 인스턴스 메서드에 자동으로 존재합니다.Python, Rust 및 Perl 5와 같은 다른 예에서는 인스턴스 메서드의 첫 번째 파라미터가 이러한 참조입니다.명시적으로 지정해야 합니다.Python과 Perl에서는 파라미터에 이름을 붙일 필요가 없습니다.this또는self; 이것은 다른 파라미터와 마찬가지로 프로그래머에 의해 자유롭게 명명될 수 있습니다.단, 비공식 규칙에 따라 Perl 또는 Python의 인스턴스 메서드의 첫 번째 파라미터가 명명됩니다.self녹은 자기물체를 불러야 한다.&self또는self호출된 함수가 호출된 호출을 각각 차용하는지 또는 호출된 호출을 이동시키는지에 따라 달라집니다.

C++ 또는 Java의 정적 메서드는 인스턴스가 아닌 클래스와 관련되어 있으므로 사용할 수 없습니다.this오브젝트가 없기 때문입니다.Ruby, Smalltalk, Objective-C 또는 Swift와 같은 다른 언어에서는 메서드는 다음과 같이 전달되는 클래스 개체와 관련되어 있습니다.this클래스 메서드라고 불립니다.클래스 메서드의 경우 Python은cls클래스 오브젝트에 액세스 할 수 있습니다.

세세한 부분과 어려움

어휘 범위를 사용하여 추론하는 경우this, 의 사용방법this코드에서는 불법은 아니지만 유지관리 프로그래머에게 경고벨을 울릴 수 있다, 비록 여전히 합법적인 사용이 있다.this예를 들어, 같은 이름의 로컬 변수에 의해 숨겨진 인스턴스 변수를 참조하거나 메서드가 현재 개체에 대한 참조를 반환하려는 경우 등입니다.this그 자체입니다.

일부 컴파일러(를 들어 GCC)에서는 C++ 인스턴스 메서드에 대한 포인터를 명시적인 방법으로 다른 유형의 포인터에 직접 캐스팅할 수 있습니다.this포인터 파라미터.[3]

개방 재귀

의 디스패치 의미this즉, 이 메서드는this는 동적으로 디스패치되며 오픈 재귀라고 불리며 이러한 메서드는 파생 클래스 또는 객체에 의해 덮어쓸 수 있습니다.반면 함수의 직접 이름 있는 재귀 또는 익명 재귀는 조기 바인딩과 함께 닫힌 재귀를 사용합니다.예를 들어, 다음 요인 Perl 코드에서 토큰은__SUB__현재 기능에 대한 참조입니다.

사용하다 특징 ":5.16"; 후보선수 {     나의 x달러 = 교대하다;     x달러 == 0 ? 1 : x달러 * __SUB__->( x달러 - 1 ); } 

반면 C++에서는 (명시적 사용)this(필요하지는 않지만) 명료성을 위해this는 오브젝트 자체에 바인드되지만 클래스 메서드가 베이스에서 "가상"으로 선언된 경우(즉, 다형성) 동적 디스패치(최신 바인딩)를 통해 해결되므로 파생 클래스가 오브젝트를 덮어쓸 수 있습니다.

서명되어 있지 않다 인트 요인(서명되어 있지 않다 인트 n) {   한다면 (n == 0)     돌아가다 1;   또 다른     돌아가다 n * 이것.->요인(n - 1); } 

이것은 직접 재귀이기 때문에 이 예는 인위적인 것이므로, 이 예에서는, 우선합니다.factorialmethod는 이 함수를 덮어씁니다.파생 클래스의 메서드가 기본 클래스의 동일한 메서드를 호출하는 경우나 상호 [4][5]재귀의 경우 등입니다.

취약한 기본 클래스 문제는 오픈 재귀의 원인으로 지목되며 메서드를 호출하는 것이 권장됩니다.this오픈 재귀(다이나믹 디스패치, 레이트바인딩)가 아닌 클로즈드 재귀(스태틱디스패치, 얼리바인딩)로 디폴트 설정.특정 요구가 있을 때만 오픈 재귀를 사용.외부 콜(사용하지 않음)this)는,[6][7] 통상과 같이 동적으로 디스패치 됩니다.JDK에서 실제로 이 문제를 해결하는 방법은 특정 프로그래머 규율을 통해 해결됩니다. 이 규율은 C에 의해 공식화되었습니다.Ruby와 G. T. Leavens는 기본적으로 다음과 [8]같은 규칙으로 구성됩니다.

  • 코드가 호출되지 않음public에 대한 방법this.
  • (같은 클래스의 다른 메서드에서 호출함으로써) 내부적으로 재사용할 수 있는 코드는protected또는private사용자에게도 직접 공개해야 하는 경우 래퍼publicmethod는 내부 메서드를 호출합니다.
  • 이전 권장사항은 순수한 방법에 대해 완화될 수 있습니다.

실장

C++

C++의 이전 버전에서는this포인터를 변경함으로써 프로그래머는 메서드가 동작하고 있는 오브젝트를 변경할 수 있습니다.이 기능은 결국 삭제되었으며,thisC++는 r-값입니다.[9]

C++의 초기 버전에는 참조가 포함되어 있지 않습니다.C++에 처음부터 포함되어 있었다면,this포인터가 [10]아니라 참고 자료였을 거예요

C++를 사용하면 오브젝트가 소스 코드 문을 사용하여 자신을 파괴할 수 있습니다.delete this.

C#

키워드this참조 타입의 경우는, Java 와 같은 방법으로 동작합니다.단, C# 값 유형 내에서는this는 일반적인 가변 변수 참조와 유사하기 때문에 상당히 다른 의미를 가지며 할당의 왼쪽에서도 발생할 수 있습니다.

의 1회 사용thisC#에서는 이름이 같은 로컬 변수를 포함하는 메서드 내에서 외부 필드 변수를 참조할 수 있습니다.예를 들어, 이러한 상황에서 진술은var n = localAndFieldname;메서드 내에서 로컬 변수의 유형과 값을 할당합니다.localAndFieldname로.n단, 스테이트먼트var n = this.localAndFieldname;외부 필드 변수의 유형과 값을 에 할당합니다.n를 클릭합니다.[11]

D

D this클래스에서 구조법 또는 결합법은 둘러싸인 집합체의 인스턴스(instance)에 대한 불변의 참조를 말한다.클래스는 참조 유형, 구조 및 결합은 가치 유형입니다.D의 첫 번째 버전에서 키워드는this는 메서드가 바인드된 객체의 인스턴스에 대한 포인터로 사용되며 D2에서는 암묵적인 함수 인수의 특성을 가집니다.

딜런

프로그래밍 언어에서 딜런은 다중 모드를 지원하며 개념도 없는 객체 지향 언어입니다.this오브젝트에 메시지를 보내는 방법은 구문으로 유지됩니다.아래의 두 가지 형태는 같은 방식으로 작용한다; 차이점은 단지 통사적인 설탕이다.

object.param1, param2)

그리고.

method(개체, param1, param2)

에펠

클래스 텍스트 내에서 현재 유형은 현재 클래스에서 가져온 유형입니다.클래스의 기능(루틴, 명령 및 쿼리) 내에서 키워드를 사용할 수 있습니다.Current현재 클래스 및 해당 기능을 참조합니다.키워드 사용Current키워드로서 옵션입니다.Current현재 클래스 기능의 이름을 공개적으로 참조하는 것만으로 알 수 있습니다.예를 들어 다음과 같습니다.클래스 MY_CLASS에 기능 「foo」가 있어, 다음과 같이 참조할 수 있습니다.

  학급      마이클래스      특징 -- 액세스         후우: 정수         my_function(기능): 정수         하다           결과 := 후우        끝.    끝. 

[12]

10번 행(위)은 다음을 암시하고 있습니다.Current단순한 'foo'를 호출함으로써.

10번 행(아래)은 다음과 같이 명시되어 있습니다.CurrentCurrent.foo 호출에 의해.

  학급      마이클래스      특징 -- 액세스         후우: 정수         my_function(기능): 정수         하다            결과 := 현재의.후우        끝.    끝. 

어느 쪽의 어프로치는 컴파일러에게 받아들여지지만, 암묵의 버전(예:x := foo)는 상세 내용이 적기 때문에 권장됩니다.

다른 언어들과 마찬가지로 키워드의 사용이Current는 다음과 같이 필수입니다.

  학급      마이클래스      특징 -- 액세스         my_command(명령어)            -- 'Current'로 MY_OTHER_CLASS를 만듭니다.         현지의            x: 마이기타클래스        하다           만들다 x.무언가를 만들다 (현재의)        끝.    끝. 

위의 코드의 경우 #11 회선상의 make_with_something 콜은 키워드를 명시적으로 전달함으로써 현재 클래스를 통과하고 있습니다.Current.

자바

키워드this는 표시되는 클래스의 현재 인스턴스를 나타내는 Java 언어 키워드입니다.클래스 변수 및 메서드에 액세스하는 데 사용됩니다.

Java에서는 모든 인스턴스 메서드가 가상이기 때문에this[13]null일 수 없습니다.

자바스크립트

웹 브라우저에서 광범위하게 사용되는 프로그래밍 또는 스크립트 언어인 JavaScript에서는this는 중요한 키워드입니다.다만, 사용하는 장소에 따라서 평가 대상이 다릅니다.

  • 모든 기능 밖에서 사용할 경우, 글로벌 공간에서this에워싸는 오브젝트를 나타냅니다.이 경우 에워싸는 브라우저 창은window물건.
  • 글로벌 공간에서 정의된 함수로 사용되는 경우 키워드는 무엇입니까?this는 함수를 어떻게 호출하느냐에 따라 달라집니다.이러한 함수가 직접 호출되는 경우(예:f(x)),this는 함수가 정의되어 있는 글로벌공간과 다른 글로벌함수와 변수가 존재할 가능성이 있는(또는 엄밀한 모드에서는undefined글로벌 함수가 다음을 포함하는 경우this단, 문서 오브젝트 내 요소의 이벤트핸들러의 일부로서 호출됩니다.this는 발신측 HTML 요소를 참조합니다.
  • 를 사용하여 메서드를 호출하는 경우new키워드(예:var c = new Thing()) then within Thingthis는 Thing 객체 자체를 나타냅니다.
  • 함수가 객체의 속성으로 부가되어 해당 객체의 메서드로 호출되는 경우(예:obj.f(x)),this는 함수가 [14][15]포함된 객체를 참조합니다.수동으로 지정할 수도 있습니다.this함수를 호출할 때,.call()또는.apply()함수 [16]객체의 메서드.예를 들어 메서드 호출은obj.f(x)라고도 쓸 수 있다obj.f.call(obj, x).

의 다른 의미에 대해 연구하다thisDOM 이벤트 핸들러와 같은 중첩된 함수에서는 자바스크립트의 일반적인 용어로this변수 내 호출 객체의 참조(호출)that또는self그런 다음 변수를 사용하여 중첩된 함수의 호출 개체를 참조합니다.

예를 들어 다음과 같습니다.

// 이 예에서 $는 jQuery 라이브러리를 참조합니다. $(".discuse").맴돌다(기능.() {     // 여기서는 마우스 커서 아래의 요소를 가리킵니다.     변화하다 그거 = 이것.;          $(이것.).발견하다('.display').각각(기능.() {         // 여기서 이것은 반복되는 DOM 요소를 가리킵니다.         // 단, 마우스 커서 아래의 요소를 가리킵니다.         $(이것.).클래스 추가("실패");     }); }); 

특히 JavaScript는 이 두 가지를 모두 사용합니다.this관련 키워드self[17] (둘 중 하나를 사용하는 경향이 있는 대부분의 다른 언어와는 대조적으로),self특히 웹 [18]워커에 한정되어 있습니다.

마지막으로 자바스크립트는 글로벌(윈도 또는 동등한) 오브젝트를 구체적으로 참조하기 위한 신뢰성 높은 방법으로globalThis키워드를 [19]지정합니다.

루아

루아에서는self기능을 정의하면 통사설탕으로 생성된다.:오퍼레이터.[20]를 사용하여 메서드를 호출할 때:인덱스되는 오브젝트는 호출되는 함수의 첫 번째 인수로 암묵적으로 지정됩니다.

예를 들어, 다음 두 함수는 동일합니다.

현지의 obj = {}  기능. obj.후우(arg1, arg2)   인쇄물(arg1, arg2) --여기서 "자기"를 사용할 수 없습니다. 끝.  기능. obj:막대기(arg)   인쇄물(자신, arg) -- "self"는 arg 앞에 암묵적인 첫 번째 인수입니다. 끝.  -- 모든 함수는, 「」또는 「」로 양쪽 모두 호출할 수 있습니다.  obj:후우("푸") -- obj.foo(obj, "foo")에 상당합니다. obj.막대기(obj, '바') -- obj:bar('바')에 상당합니다. 

Lua 자체는 객체 지향적이지 않지만 메타테이블이라고 불리는 다른 기능과 결합하면,self프로그래머는 객체 지향 프로그래밍과 유사한 방식으로 함수를 정의할 수 있습니다.

PowerShell

PowerShell의 특수 자동 변수 $_에는 파이프라인 객체의 현재 객체가 포함되어 있습니다.파이프라인의 [21]모든 개체 또는 선택한 개체에 대해 작업을 수행하는 명령에서 이 변수를 사용할 수 있습니다.

'하나', '둘', '세 개'   % { 쓰다$_ } 

또한 클래스 및 기타 사용자 정의 [22]유형을 정의하는 정식 구문을 추가하는 PowerShell 5.0부터는 $thisvariable은 객체의 현재 인스턴스를 나타냅니다.

파이썬

Python 에서는, 다음의 키워드는 없습니다.this객체에 대해 멤버 함수가 호출되면 객체의 클래스 객체에 동일한 이름으로 멤버 함수를 호출하고 객체는 함수의 첫 번째 인수에 자동으로 바인딩됩니다.따라서 인스턴스 메서드의 필수 첫 번째 매개 변수는 다음과 같은 역할을 합니다.this; 이 파라미터는 통상적으로 이름이 붙습니다.self, 단, 임의의 이름을 붙일 수 있습니다.

인클래스 메서드(로 작성)classmethod데코레이터)의 첫 번째 인수는 클래스 객체 자체를 가리키며, 일반적으로는 클래스 객체라고 불린다.cls; 주로 상속 가능한 [23]생성자에 사용됩니다. 여기서 클래스를 매개 변수로 사용하면 생성자를 하위 분류할 수 있습니다.스태틱 메서드(로 작성)staticmethoddecorator), 특별한 첫 번째 인수는 존재하지 않습니다.

Rust에서 유형은 관련된 함수와 별도로 선언됩니다.보다 전통적인 객체 지향 언어의 인스턴스 메서드와 유사하게 설계된 함수는 명시적으로 다음을 수행해야 합니다.self첫 번째 매개 변수로 사용합니다.이러한 함수는 다음 명령을 사용하여 호출할 수 있습니다.instance.method()구문설탕예를 들어 다음과 같습니다.

구조 Foo { bar: i32, }는 Foo { fn new() -> Foo { bar: 0, } fn refer(&self) { println!("{}), self.bar} fn 뮤트(&mut self, baz: i32) {self.bar = baz;} fn self(self refer)를 사용합니다.

이것은 유형을 정의합니다.Foo4개의 관련 기능이 있습니다.첫 번째는Foo::new()는 인스턴스 함수가 아니므로 유형 프레픽스로 지정해야 합니다.나머지 셋은 모두 한 시간 동안self다양한 방법으로 매개 변수를 호출할 수 있습니다.Foodot-signal 구문 sugar를 사용하는 인스턴스. 이는 명시적인 명령어로 type-qualified 함수 이름을 호출하는 것과 동일합니다.self첫 번째 파라미터입니다.

let mut foo = Foo::new(); // 형식 지정 함수 foo.refer() 호출해야 합니다. //는 "0"인쇄합니다. foo::refer()는 foo 인스턴스 foo.mutate(5); //에 대한 읽기 전용 액세스 권한을 가지고 있습니다.&mut 지정에 의해 허용된 foo mut.consume(); //를 선언하고 foo를 파기해야 합니다.Foo: consume() foo()상당하는 자기 소유권을 취득하기 때문입니다.참조:

자신

Self language는 이러한 "self"의 사용에서 이름을 따왔다.

Xbase++

Self클래스 메서드 내에서 엄격하게 사용됩니다.를 참조하는 다른 방법으로는Self사용하는 것이다::.

「 」를 참조해 주세요.

레퍼런스

  1. ^ Dahl, Ole-Johan; Myhrhaug, Bjørn; Nygaard, Kristen (1970). "Common Base Language, Norwegian Computing Center".
  2. ^ 파월, 토마스 A, 그리고 슈나이더, 프리츠, 2012.JavaScript: 컴플리트 레퍼런스, 제3판맥그로 힐.11장, 이벤트 처리, 페이지 428.ISBN 978-0-07-174120-0
  3. ^ GNU 컴파일러 컬렉션(GCC) 사용바운드멤버 함수
  4. ^ "닫히고 열린 재귀", Ralf Hinze, 2007년 7월
  5. ^ 열린 재귀, 람다 더 얼티밋
  6. ^ "선택적인 열기 재귀: 취약한 베이스 클래스 문제에 대한 해결책" Jonathan Aldrich
  7. ^ "선택적인 열기 재귀: 깨지기 쉬운 베이스 클래스 문제에 대한 해결책, 람다얼티밋
  8. ^ 올드리치, 조나단, 케빈 도넬리."선택적인 개방 재귀: 컴포넌트 상속에 관한 모듈식 추론." SAVCBS 2004 컴포넌트 기반 시스템의 사양 및 검증(2004) : 26. JDK 채택 솔루션 C를 인용.루비와 G.T. 리븐스."슈퍼클래스 코드를 보지 않고 안전하게 올바른 서브클래스를 만듭니다."객체 지향 프로그래밍 시스템, 언어 및 응용 프로그램에서 2000년 10월.doi:10.1145/353171.353186은 기술 보고서 TR #00-05d로도 이용 가능합니다.
  9. ^ ISO/IEC 14882:2003(E): Programming Languages - C++. ISO/IEC. 2003.
  10. ^ 스트루스트럽:C++ 스타일과 테크닉에 관한 FAQ
  11. ^ De Smet, Bart, 2011.C# 4.0 해제.샘스 출판사, 인디애나폴리스, 미국. 제4장, Language Essentials, 페이지 210.ISBN 978-0-672-33079-7
  12. ^ 메모: 이 행 번호는 참조용입니다.에펠은 교재에 행 번호가 없습니다.단, Effel Studio IDE에는 회선 번호 옵션이 있으며 참조용으로 옵션으로 설정할 수 있습니다(예: 페어 프로그래밍).
  13. ^ Barnes, D. 및 M. Objects First with Java. "...이 구조를 사용하는 이유는 이름 오버로드로 알려진 상황이 있기 때문입니다. 두 개의 다른 엔티티에 동일한 이름이 사용되고 있습니다.필드와 파라미터는 이름이 비슷하지만 서로 독립적으로 존재하는 개별 변수임을 이해하는 것이 중요합니다.Java에서는 [citation needed]파라미터와 필드를 공유하는 것은 문제가 되지 않습니다."
  14. ^ 크록포드, 더글러스, 2008년JavaScript: 좋은 부분들O'Reilly Media Inc.와 Yahoo!Inc. 4장, 기능, 페이지 28.ISBN 978-0-596-51774-8
  15. ^ 파월, 토마스 A, 그리고 슈나이더, 프리츠, 2012.JavaScript: 컴플리트 레퍼런스, 제3판맥그로 힐.5장, 기능, 페이지 170-1.ISBN 978-0-07-174120-0
  16. ^ 굿맨, 대니 모리슨, 마이클, 2004년자바스크립트 성경, 제5판Wiley Publishing, Inc., 미국 인디애나폴리스. 제33장, 기능과 커스텀 오브젝트, 페이지 987.ISBN 0-7645-5743-2
  17. ^ Mozilla 개발자 네트워크:창문이요.자신
  18. ^ Mozilla 개발자 네트워크:웹 워커 API
  19. ^ Mozilla 개발자 네트워크: 글로벌이것.
  20. ^ "Programming in Lua : 16".
  21. ^ msdn. "PowerShell: About Automatic Variables". docs.microsoft.com. Retrieved 2018-03-22.
  22. ^ msdn. "about_Classes". docs.microsoft.com. Retrieved 2018-12-17.
  23. ^ Python 2.2의 유형클래스 통합, Guido van Rossum "_new_ 메서드 재정의"

추가 정보