this 포인터는 class의 특징 때문에 등장한 포인터이다. 동일 클래스를 이용해 여러 개의 인스턴스가 생성될 때 멤버 변수의 경우 각각 메모리를 할당받아 사용하지만 멤버 함수의 경우 메모리 공간을 공유하기 때문에 이를 구분하기 위해 사용한다.
예를 들어 Test라는 클래스가 존재하는데 test1, test2라는 두 개의 클래스를 생성했다고 하면 멤버변수 num은 test1, test2 각각 독립된 메모리를 할당받지만 멤버 함수 printNum은 메모리 주소를 공유하고 있기 때문에 printNum을 호출할 경우 어떤 객체에서 호출하였는지 알기 어렵다. 이러한 문제를 해결하기 위해 등장한 것이 this 포인터이다.
this 포인터는 멤버 함수를 호출한 객체 자신을 가리키는 포인터가 된다. 멤버 함수가 호출될 때 컴파일러에 의해 객체를 구분할 수 있도록 전달되는 객체의 주소이다. 따라서 호출된 멤버 함수는 자신을 호출한 객체가 무엇인지 알 수 있다.
Test class를 간단하게 생성하여 객체의 주소와 해당 멤버 함수가 가진 this 포인터의 주소를 비교해보면 해당 멤버 함수를 호출한 객체의 주소를 가지고 있음을 확인할 수 있다.
this 포인터의 특징
① 정적(static) 멤버 함수에서는 사용 불가 (멤버 함수가 미리 생성되어 this가 가리키는 호출한 객체가 그 시점에 존재하지 않을 수 있기 때문)
② 클래스, 구조체, 열거체의 비정적 멤버 함수에서만 사용 가능
③ this 포인터는 자기 자신만을 가리키는 포인터 상수이기 때문에 값의 재할당이 불가능
-> (화살표 연산자)
객체에 객체 변수를 통해 접근할 때 멤버 연산자(.)를 사용한 것처럼 객체에 포인터를 통해 접근한다면(->)를 사용한다.
만약 포인터 클래스 test의 num이라는 멤버 변수에 접근한다면 (*test).num을 test->num으로 사용한다.
printNum의 this->num = num; 에서 왼쪽의 num은 test클래스의 멤버 변수를 의미하며 num은 함수의 매개변수를 의미하게 된다.
'Language > C++' 카테고리의 다른 글
[C++] OOP 캡슐화 - 프렌드(friend) (0) | 2021.10.25 |
---|---|
[C++] OOP - 생성자와 소멸자 (0) | 2021.10.24 |
[C++] OOP - 클래스(class) (0) | 2021.10.24 |
[C++] <random> 라이브러리 (난수 생성) (0) | 2021.10.03 |
[C++] <string> 라이브러리 (0) | 2021.10.03 |