본문 바로가기

C++/C, C++, STL

자기 자신을 나타내는 this 포인터

this 포인터

여러 프로그래밍 언어에서는 클래스가 자기 자신의 객체(인스턴스)를 찾기 위한 키워드를 제공합니다.

C++에서는 this 키워드가 제공되며 Javathis 키워드와 유사하지만 또 다른 특징을 갖습니다.

#include <iostream>

class Hello
{
    private:
        int world;

    public:
        Hello(int _world)
        {
            setWorld(_world);
        }

        void setWorld(int _world)
        {
            world = _world;
        }

        int getWorld()
        {
            return world;
        }
};

int main()
{
    Hello helloWorld(100);
    helloWorld.setWorld(200);

    std::cout << helloWorld.getWorld() << std::endl;
    return 0;
}

예시 코드의 Line 28에서 helloWorld.setWorld(int _world)라는 멤버 함수는 helloWorld라는 이름의 객체에서 호출됩니다.

따라서 함수 내부의 world = _worldhelloWorld.world = _world를 의미합니다.

helloWorld.setWorld(200);       // helloWorld.world = 200

setWorld(int _world) 멤버 함수는 int _world라는 하나의 인자만을 정의하고 있습니다.

하지만  실제로는 두 개의 인자를 갖게 되는데, 코드를 컴파일하면 다음과 같습니다.

void setWorld(const Hello* this, int _world)
{
    this->world = _world;
}

C++에서 멤버 함수는 컴파일 과정에서 this를 인자로 추가합니다.

void setWorld(const Hello* this, int _world)
{
    this->world = _world;	// helloWorld.world = 200
}

결과적으로 컴파일 이후 함수 내부에서는 helloWorld.world = _world가 실행됩니다.

더보기

C++에서는 모든 멤버 함수가 함수를 호출하는 자기 자신의 객체를 가리키는 this 포인터를 갖게 됩니다.

this는 자기 자신에 대한 포인터(Pointer)

this는 일종의 포인터(Pointer)입니다. Javathis가 인스턴스인 것과는 대조되는 특징입니다.

따라서 다음과 같은 코드는 컴파일 오류가 발생하며

class Hello
{
    public:
        Hello getThis()
        {
            return this;
        }
};

이를 정정하면 아래와 같이 Hello*를 리턴하도록 작성해야 합니다.

class Hello
{
    public:
        Hello* getThis()
        {
            return this;
        }
};

그리고 this 포인터를 출력하면 Hello 클래스에 대한 인스턴스의 시작 주소 값을 나타냅니다.

// print 0x61ff0c
std::cout << helloWorld.getThis() << std::endl;

정리 및 복습

  • this 포인터는 자신에 대한 객체의 시작 주소 값을 나타내는 포인터입니다.
  • 이는 자신에 대한 객체를 반환하는 Javathis와 대조되는 특징입니다.
  • C++에서는 모든 멤버 함수가 함수를 호출하는 자기 자신의 객체를 가리키는 this 포인터를 갖습니다.
  • 이는 C++의 컴파일 과정에서 자동으로 처리됩니다.