본문 바로가기

전자 공학/C언어 C++

[C++ 독학하기] 12. this 포인터

반응형

안녕하세요. 취업한 공대누나입니다.

오늘은 자기 자신을 가리키는 this포인터에 대한 공부를 해보도록 하겠습니다.


 

1. this 포인터

this 포인터는 클래스의 실제 인스턴스에 대한 주소를 가리키는 포인터입니다. 

클래스의 멤버 함수를 호출할 때 어떻게 호출할 때에도 이 this라는 포인터를 이용해서 객체를 찾을 수 있는 것입니다. 예제를 보도록 하겠습니다.

위의 예제를 실행하면 st1의 Print_studentst1을 실행시켜야 하는 것을 알고 이를 참조하는데요.

사실 st1.Print_student()는 인수 없이 함수를 호출하는 것처럼 보입니다.

하지만 사실은 st1.Print_student(&st1)처럼 존재하고 있습니다.

이 주소가 우리 눈에는 보이지 않을 뿐 존재하고 있으며 첫 번째 매개변수로 전달된 인스턴스의 주소는 이름이 this인 포인터 변수에 저장이 되는 것입니다. 컴파일러에 의해서 알아서 추가되는 것입니다. 이 때 이 this는 지역 변수입니다.

우리가 실제로 매개변수로 넣어주는 것보다 하나 더 들어가는 셈이 됩니다.

이렇게 하면 호출된 멤버 함수는 자신을 호출한 객체가 무엇인지 정확하게 알 수 있는 것입니다.


2. this 포인터는 언제 사용할까?

1) 클래스의 멤버 변수와 매개 변수가 동일할 때 사용할 수 있다.

이렇게 멤버 변수 age와 매개 변수 age가 같을 때가 있습니다.

이 때 this->age는 멤버 변수를 뜻하고 age는 매개 변수를 뜻합니다.

하지만 굳이 매개 변수를 동일한 이름으로 하지 않는다면 굳이 사용할 필요는 없긴 합니다.

 

2) 객체 자신의 주소를 리턴할 때 사용할 수 있다.

this를 이용해서 출력한 값과 &st1의 값이 같은 것을 알 수 있습니다.

즉, this는 자기 자신을 가리키는 것입니다. 

 

이렇게 다른 객체를 선언하고 this를 출력해보면 값이 다른 것 또한 확인할 수 있습니다.

this 포인터는 멤버 함수가 호출된 객체의 주소를 가리키는 포인터입니다.


이러한 this 포인터는 정적(static) 멤버 함수에서는 사용이 불가능하며 클래스, 구조체와 같은 비정적인 멤버 함수에서만 사용할 수 있습니다.

 

그렇다면 굳이 이러한 this 포인터는 왜 만든 것일까요?

클래스의 멤버 변수들은 객체가 만들어질 때마다 메모리에 할당이 되게 됩니다.

하지만 함수와 같이 크기가 큰 것들을 메모리에 굳이 반복해서 할당 할 필요가 없습니다.

그래서 함수를 메모리에 할당 해 놓고 각 객체의 this 포인터를 함수에 넘겨서 어떤 객체가 함수를 호출했는지 알게 만드는 것입니다.


왜 만들었는지 이유를 알고 나니까 조금 더 이해가 잘 됩니다.

앞으로도 조금씩 원리를 이해해 가면서 공부해 나가는 것이 중요할 것 같습니다.

반응형