본문 바로가기
프로그래밍/C || CPP

[C/C++] this 포인터 이해 및 활용

by _BlankSpace 2017. 3. 19.

 0. 정리에 들어가기 전에 

이번에 포스팅할 내용은 this 포인터입니다. this 포인터라는 이름을 보시면 어떤 느낌이 느시나요? 뭔가 가리키는 포인터라고 생각이 드실 것입니다.

프로그래밍 언어에서 특히 객체지향 언어에서는 보통 객체를 가리키고자 할 때, 사용하는 키워드가 존재합니다.

오늘은 이러한 키워드 중에서 자기 자신을 가리키는 this 포인터에 대해서 정리하겠습니다.


this 포인터란 객체 자신을 가리키는 용도로 사용되는 포인터를 말합니다.


 1. this 포인터의 활용 방법.


this 포인터 활용 (1)


1
2
3
4
5
6
7
8
9
10
11
12
class exClass
{
private:
    int num;
public:
    void exClass(int num)
    {
        this->num = 200;
        num = 105;
    }
    ......
};
cs


위의 예를 보면 this->num 과 num을 볼 수 있습니다.


이러한 경우에는 단순히 num(1)이라는 변수만으로 클래스의 num(2)을 접근할 수 없습니다.


(1)의 num 같은 경우는 함수의 매개변수로 사용될 것이고, (2)의 num은 클래스가 가지고 있는 멤버 변수이기 때문입니다.


따라서 이럴 경우에 자기 자신을 가리키는 this 포인터를 이용하여 this->num 방법으로 클래스의 멤버 변수에 접근 할 수 있습니다.


이러한 방법을 사용하게 되면 유사한 성격의 변수 이름을 굳이 다르게 표현할 필요도 사라집니다. 이것은 굉장한 이점입니다. (프로그램을 개발하는 사람이라면 모두 공감할 내용일 것입니다. 혹시라도 아니시라면... 어쩔 수 없습니다. ㅠㅠ)


물론, 이러한 방법은 호불호가 갈릴 것 같습니다. 왜냐하면 프로그래머들은 자기 만의 것(?)애 대해서 고집이 심하다는 것을 느꼈습니다. 이것이 나쁘다는 것이 아닙니다. 다만, 프로그래머라는 직업을 오랫동안 하기 위해서는 자기 만의 것을 찾는 것이 가장 중요하다고 생각이 들었습니다.


아무튼 잡담은 각설하고, 다음 예를 보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
 
using namespace std;
 
// example for this pointer
class ThisPointer
{
private:
    int num1;
    int num2;
public:
    ThisPointer(int num1, int num2)
    {   
        this->num1 = num1;
        this->num2 = num2;
    }   
 
    void printNumber()
    {   
        std::cout << this->num1 << std::endl;
        std::cout << this->num2 << std::endl;
    }   
};
 
int main()
{
    ThisPointer num(24); 
    num.printNumber();
    return 0;
}
cs


위의 예처럼 다른 변수명을 사용하지 않아도 메소드의 매개 변수와 클래스의 멤버 변수를 구별하는 데 this 포인터 를 활용 할 수 있습니다.




this 포인터 활용 (2)


this 포인터를 이용하면 객체 자신의 포인터를 반환할 수도 있습니다.


다음 예를 보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class SelfReferance
{
private:
    int num;
public:
    SelfReferance(int n)
        : num(n)
    {
        std::cout << "create instance" << std::endl;
    }
 
    SelfReferance& add(int n)
    {
        num += n;
        std::cout << "num : " << num << std::endl;
        return *this;
    }
 
    SelfReferance& min(int n)
    {
        num -= n;
        std::cout << "num : " << num << std::endl;
        return *this;
    }
};
 
int main()
{
    SelfReferance srf(3);
    SelfReferance& ref = srf.add(2);
 
    srf.add(2);
    ref.min(2);
 
    ref.add(2).min(2).add(2).min(2);
    return 0;
}
cs


결과 :


 >> create instance

 >> num : 5

 >> num : 7

 >> num : 5

 >> num : 7

 >> num : 5

 >> num : 7

 >> num : 5


이처럼 자기 자신의 포인터를 반환함으로써, 계속 자신을 참조할 수 있습니다.


이러한 this 포인터 기능을 잘 활용해보시길 바랍니다.



참고 자료 : 열혈 c++ 프로그래밍 책

댓글