안녕하세요. 취업한 공대누나입니다.
오늘은 자기 자신을 가리키는 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 포인터를 함수에 넘겨서 어떤 객체가 함수를 호출했는지 알게 만드는 것입니다.
왜 만들었는지 이유를 알고 나니까 조금 더 이해가 잘 됩니다.
앞으로도 조금씩 원리를 이해해 가면서 공부해 나가는 것이 중요할 것 같습니다.
'전자 공학 > C언어 C++' 카테고리의 다른 글
[C++ 독학하기] 13. 복사 생성자 (1) | 2021.03.22 |
---|---|
[C++ 독학하기] 11. 생성자와 소멸자 (0) | 2021.03.12 |
[C++ 독학하기] 10. 생성자 (0) | 2021.03.10 |
[C++ 독학하기] 8. 인라인 함수 개념 (0) | 2021.03.04 |
[C++ 독학하기] 7. 함수 다중 정의, 오버로딩 개념 (0) | 2021.03.02 |