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 반환하여 연속적인 호출 가능 |
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ 초급 - 8. 객체지향 프로그래밍 (1 - 캡슐화(Encapsulation), 상속(Inheritance), 다형성(Polymorphism)) (0) | 2025.02.22 |
---|---|
C++ 초급 - 7. 구조체와 클래스 (6 - const 멤버 함수) (0) | 2025.02.22 |
C++ 초급 - 7. 구조체와 클래스 (4 - 접근 지정자 (private, public, protected)) (0) | 2025.02.22 |
C++ 초급 - 7. 구조체와 클래스 (3 - 생성자와 소멸자 (Constructor & Destructor)) (0) | 2025.02.22 |
C++ 초급 - 7. 구조체와 클래스 (2 - 클래스 (class vs struct)) (0) | 2025.02.22 |