본문 바로가기
언어/C++

[C++ 기본 공부정리] 14-3. OOP - this 포인터

by 민-Zero 2019. 12. 29.

공부 내용을 정리하는 목적 이므로 참고용으로만 읽어 주시기 바랍니다.

틀린 부분에 대한 지적은 감사합니다.

this 포인터는 class의 특징 때문에 등장한 포인터이다. 동일 클래스를 이용해 여러개의 인스턴스가 생성될 때 멤버 변수의 경우 각각 메모리를 할당받아 동작하지만 멤버 함수의 경우 메모리 공간을 공유하기 때문에 이를 구분하기 위해 사용된다. 

예를 들어 Test라는 클래스가 존재해서 test1, test2라는 두개의 클래스를 생성했다고 하면 멤버변수 num은 test1, test2 각각 독립된 메모리를 할당받지만 멤버 함수 printNum은 메모리 주소를 공유하고 있기 때문에 printNum을 호출할 경우 어떤 객체에서 호출하였는지 알기 힘들다. 이러한 문제를 해결하기 위해 등장한 것이 this 포인터이다.

 

1. this pointer 란?

위에서 설명한 이유로 모든 멤버 함수는 자신만의 this 포인터를 가지고 있다. this 포인터는 멤버 함수를 호출한 객체 자신을 가리키는 포인터가 된다. 멤버 함수가 호출될 때 직접 적으로 보이지는 않지만 컴파일러에 의해 객체를 구분할 수 있도록 전달되는 객체의 주소이다. 따라서 호출된 멤버 함수는 자신을 호출한 객체가 무엇인지 알 수 있다.

this 포인터를 사용하는 방법은 this 키워드를 사용하면 되며 포인터 변수이기 때문에 주소 값을 저장하고 있다.

앞에서 예시로 사용한 Test class를 간단하게 생성하여 객체의 주소와 해당 멤버 함수가 가진 this포인터의 주소를 비교해 보면 해당 멤버 함수를 호출한 객체의 주소를 가지고 있음을 확인할 수 있다.

 

this 포인터의 특징을 정리하면 다음과 같다. (static은 뒤에 자세히 정리하며 간단히 설명하면 static으로 설정된 멤버 함수의 경우 객체가 생성되기 전에 미리 생성되어 있게 해주는 키워드이다.)

정적(static) 멤버 함수에서는 사용불가(멤버 함수가 미리 생성되어 this가 가리키는 호출한 객체가 그 시점에 존재하지 않을 수 있기때문)

클래스, 구조체, 열거체의 비정적(non static) 멤버 함수에서만 사용 가능

③ this 포인터는 자기 자신만을 가리키는 포인터 상수이기 때문에 값의 재할당이 불가능

 

2. -> (화살표 연산자)

this 포인터를 사용할 때 자주 사용하는 연산자로 포인터 멤버 연산자라고도 한다. 객체에 객체 변수를 통해 접근할 때 멤버 연산자 (.)을 이용한 것처럼 객체에 포인터를 통해 접근한다면 (->)를 사용하는 것이다. 

문법)

포인터 -> 해당 객체 멤버

만약 포인터 클래스 test의 num이라는 멤버 변수에 접근한다면 (*test).num을  test->num으로 사용하는 것이다.

printNum의 this->num = num; 에서 왼쪽의 num은 test클래스의 멤버 변수를 의미하며 num은 함수의 매개변수를 의미하게 된다.

 

이처럼 화살표 연산자와 this 포인터를 이용하면 매개변수와 멤버 변수의 이름이 같을 때나 여러 클래스에서 상속받은 멤버와 자기 자신의 멤버를 구분 지어 사용할 때도 사용할 수 있다.

 

댓글