class 개념에서 언급되는 this pointer 에 대해서 살펴보자.

 

Sales_data Class의 isbn() member function이 있다고 하자. 그리고 main에서 total 이라는 Sales_data 타입의 object를 선언한다. 그러고 isbn() member function의 호출을 살펴보자:

total.isbn()

 

여기서 우리는 total이라 불리는 object의 isbn member function를 가져오기 위해 dot operator를 사용했다. static class member에서의 예외를 제외하고, member function을 호출할 때 저렇게 한다. isbn이 Sales_data의 member(e.g., bookNo)를 가리킬 때, 이것은 암묵적으로(implicitly) 함수가 호출된 object의 member를 의미한다. 즉 이 호출에서는,  isbn이 bookNo를 반환할 때, 암묵적으로 total.bookNo를 반환하는 것이다.

 

member function은 'this'라 불리는 Extra, Implicit parameter를 통해 함수가 불린 (STACK memory에 올려진)object로 접근한다. 우리가 member function을 호출할 때, 'this'는 그 함수가 호출된 object의 주소로 자동으로 초기화(initialize)된다.

 

그렇다면 이런 의문이 생길 수 있다. 어쨌거나 함수가 호출된 object로의 함수로 들어갔다 치자. "그 함수 내에서 다른 member(field이든 function이든)들로 접근할 때마다 this를 써줘야하는가?" 이다. 결론부터 얘기하면, 'this'가 가리키는 object의 멤버를 사용하기 위해 member access operator를 사용할 필요 없다. class의 member로의 직접 접근은 암묵적으로 'this'를 통해 reference가 된다. 즉, isbn이 bookNo를 사용할 때, 암묵적으로 'this'가 가리키는 member를 사용한다. 이것은 마치 this->bookNo를 사용한 것과 같다.

 

object를 생성할 때, this parameter는 우리를 위해 암묵적으로 정의된다. 따라서 우리가 this라는 이름으로 parameter나 variable을 정의하는 것은 illegal하다. 실제로 member function의 body 안에서, 우리는 this를 사용할 수 있다. 불필요하긴 하지만, isbn을 다음과 같이 정의하는 것은 legal하다:

string isbn() const { return this -> bookNo; }

 

※this 는 항상 "this" object를 지칭하도록 의도되어있기 때문에, this 는 const pointer이다. 우리는 this 가 갖는 주소를 절대 변경할 수 없다.

 

'객체 지향 설계' 카테고리의 다른 글

string Streams  (0) 2018.06.26
Knowing Your Objects: this Pointer 2.  (0) 2018.02.25
static Class Members  (0) 2018.02.25
Automatic Storage, Static Storage, and Dynamic Storage  (0) 2018.02.23
C++ inline functions  (0) 2018.02.21