C++ 초급 - 7. 구조체와 클래스 (5 - this 포인터)

2025. 2. 22. 14:12프로그래밍 언어/C++

📌 7.5 this 포인터

C++에서 this 포인터클래스 내부에서 객체 자신을 가리키는 포인터이다.
모든 비정적 멤버 함수(Non-static Member Function)this 포인터를 암묵적으로 가진다.
이를 활용하면 객체 자기 참조, 멤버 변수 충돌 해결, 메서드 체이닝 구현이 가능하다.


📌 1. this 포인터 개념 및 활용

🔹 (1) this 포인터란?

  • 클래스 내부에서 객체 자신을 가리키는 포인터.
  • 객체의 주소를 저장하며, 이를 통해 멤버 변수와 지역 변수 충돌을 방지할 수 있다.
  • 정적 멤버 함수(Static Member Function)에서는 this 포인터를 사용할 수 없음.

💡 예제: this 포인터 활용

#include <iostream>

class Example {
private:
    int x;

public:
    void setX(int x) {
        this->x = x;  // 멤버 변수 x와 매개변수 x 구분
    }

    void printX() {
        std::cout << "x 값: " << this->x << std::endl;
    }
};

int main() {
    Example obj;
    obj.setX(10);
    obj.printX();  // 출력: x 값: 10

    return 0;
}

🔹 출력 결과

x 값: 10

💡 설명

  • this->x = x; → 매개변수 x와 멤버 변수 x 충돌 방지.
  • this->printX(); → 명시적으로 this 사용 가능하지만, 생략해도 문제 없음.

📌 2. 멤버 함수에서 this를 활용하는 방법

🔹 (1) 객체 주소 반환

this 포인터를 활용하면 객체 자기 자신을 반환할 수 있다.

💡 예제: this를 사용하여 객체 주소 반환

#include <iostream>

class Example {
public:
    void printThis() {
        std::cout << "객체 주소: " << this << std::endl;
    }
};

int main() {
    Example obj1, obj2;

    obj1.printThis();  // obj1의 주소 출력
    obj2.printThis();  // obj2의 주소 출력

    return 0;
}

🔹 출력 결과 (예시, 주소는 다를 수 있음)

객체 주소: 0x7ffcb8b36010
객체 주소: 0x7ffcb8b36020

💡 설명

  • this는 현재 객체의 주소를 가리키므로, 각 객체의 주소가 다르게 출력됨.

🔹 (2) 동일한 멤버 값을 가진 객체 비교

💡 예제: this를 활용한 객체 비교

#include <iostream>

class Example {
private:
    int value;

public:
    Example(int v) { value = v; }

    bool isSame(Example& other) {
        return this == &other;  // 객체의 주소 비교
    }
};

int main() {
    Example obj1(10);
    Example obj2(10);
    Example& ref = obj1;  // obj1을 참조하는 레퍼런스

    std::cout << "obj1과 obj2가 같은 객체인가? " << obj1.isSame(obj2) << std::endl;
    std::cout << "obj1과 ref가 같은 객체인가? " << obj1.isSame(ref) << std::endl;

    return 0;
}

🔹 출력 결과

obj1과 obj2가 같은 객체인가? 0
obj1과 ref가 같은 객체인가? 1

💡 설명

  • this == &other → 현재 객체(this)와 매개변수로 전달된 객체(&other)의 주소 비교.
  • obj1.isSame(ref); → ✅ 같은 객체를 참조하므로 true(1) 반환.

📌 3. 메서드 체이닝(Method Chaining)

🔹 (1) 메서드 체이닝이란?

  • 객체의 멤버 함수를 연속적으로 호출할 수 있도록 구현하는 기법.
  • 각 함수가 this 포인터를 반환하면, 연속적으로 함수 호출 가능.

💡 예제: 메서드 체이닝

#include <iostream>

class Calculator {
private:
    int result;

public:
    Calculator() { result = 0; }

    Calculator* add(int num) {
        result += num;
        return this;  // 객체 자기 자신 반환
    }

    Calculator* subtract(int num) {
        result -= num;
        return this;  // 객체 자기 자신 반환
    }

    void printResult() {
        std::cout << "결과 값: " << result << std::endl;
    }
};

int main() {
    Calculator calc;
    
    // 메서드 체이닝 적용
    calc.add(10)->subtract(3)->printResult();  // (10 - 3) = 7

    return 0;
}

🔹 출력 결과

결과 값: 7

💡 설명

  • add()와 subtract() 함수는 this 포인터를 반환하여 체이닝 가능.
  • calc.add(10)->subtract(3)->printResult(); → ✅ 연속적으로 함수 호출 가능.

📌 4. 정리

개념  설명
this 포인터 객체 자기 자신을 가리키는 포인터
객체 주소 반환 this를 사용하여 객체 주소 출력 가능
객체 비교 this == &other 로 객체 동일성 비교
메서드 체이닝 멤버 함수가 this 반환하여 연속적인 호출 가능