this 포인터

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;
}

 

 

공유하기

facebook twitter kakaoTalk kakaostory naver band