class 코딩을 하다보면 this 라는게 나오는데 처음 봤을 때 이게 무슨 의미인지 궁굼한 적이 있었죠.
간단히 말하면 this 포인터는 객체의 주소를 저장한 포인터 변수입니다. 사용자가 작성하지 않아도 this를 사용할 수 있습니다. 컴파일러가 알아서 만들어 놓기 때문에 언제든지 객체안에서 사용할 수 있습니다.
this 라는 말처럼 자기 자신을 가리키고 있는 것이죠. 자동으로 생성되었지만 public 으로는 접근이 안됩니다. 내부 메소드를 사용해서 접근해야 합니다.
예제 코드를 통해서 보겠습니다.
2차원 좌표 x,y 를 가지는 클래스를 하나 정의합니다. setter 와 getter는 private 변수인 xPos와 yPos를 public 에서 사용합니다. 이 때 this->xPos 는 이 객체안에 있는 멤버변수인 xPos의 값에 접근합니다. 그냥 xPos 라고 사용해도 무방하지만 명시적으로 this 를 사용하면 가독성이 좋아지고 오류를 방지합니다.
아래의 예제에는 매개변수가 x 라고 되있지만 매개변수를 xPos라 지은다면? 똑같은 이름이 두개가 됩니다. 이 경우 컴파일러가 혼동하게 됩니다. 특히 문장의 R-value 에 매개변수와 멤버변수를 같이 쓴다면 사실상 구별이 불가능합니다.
this를 사용하면 매개변수와 멤버변수가 명확하게 구분이되고 코드의 가독성도 좋아집니다. 보통 getter 와 setter 는 IDE의 기능으로 자동 생성하는데 이 규칙에 따라 생성하는 IDE가 많습니다.
showThisAddress()는 this의 주소를 출력합니다. this를 public에서 직접 접근할 수 없기 때문에 메소드 안에서 사용 해야합니다.
*제대로 출력이 되는지 main 함수에서 테스트합니다.
x와 y는 제대로 출력이 됩니다.
마지막에 this 를 출력하는 것과 ptrPos 를 출력해보니 주소가 같습니다. 이는 this가 pos 객체의 주소라는 것 이죠. 즉, this-> 뒤의 변수는 객체의 멤버변수(속성)를 의미합니다.
* 자바에도 this가 있고 파이썬에도 self 가 있는 등 용어나 사용법에는 차이가 있지만 객체지향 프로그래밍에는 '객체 자신을 내부에서 가리키는 포인터' 라는 개념이 있습니다.
사용자 정의 클래스를 작성할 때 우리 눈에 보이지 않지만 컴파일러가 알아서 해주는 일련의 작업이 있습니다. (기본 생성자, this 포인터 등) 프로그래머가 직접 생석과 소멸에 관여하지 않아도 되는 작업입니다. 물론 this가 어떤 의미인지 알고 있으면 사용이 수월합니다.
* 예제코드
#include <iostream>
using namespace std;
#define Line cout <<"\n-----------------------------\n"
class MyPosition {
public:
MyPosition();
~MyPosition();
void setXPos(int x) { this->xPos = x; }
int getXPos() { return this->xPos; }
void setYPos(int y) { this->yPos = y; }
int getYPos() { return this->yPos; }
void showThisAddress() { cout << " this : 0x" << this << endl; }
private:
int xPos;
int yPos;
};
MyPosition::MyPosition()
{
xPos = 0;
yPos = 0;
}
MyPosition::~MyPosition()
{}
int main()
{
MyPosition pos;
Line;
cout << " x position : " << pos.getXPos() << endl;
cout << " y position : " << pos.getYPos() << endl;
pos.setXPos(10);
pos.setYPos(20);
Line;
cout << " x position : " << pos.getXPos() << endl;
cout << " y position : " << pos.getYPos() << endl;
Line;
pos.showThisAddress();
// 포인터를 사용해서 확인해본다.
MyPosition* ptrPos;
ptrPos = &pos;
cout << " ptrPos : 0x" << ptrPos << endl;
return 0;
}