2025. 4. 29. 18:03ㆍProgramming Language/C++
1. this 포인터
this 포인터는 C++에서 클래스의 멤버 함수 내부에서 자신을 가리키는 포인터로 멤버 함수 안에서 this를 사용하면그 함수를 호출한 객체 자신의 주소를 반환한다.
class Car {
private:
int speed;
public:
void setSpeed(int speed) {
this->speed = speed;
}
};
이렇게 사용이 되는데 여기서 this는 Car* 타입으로 해당 객체를 가르키는 포인터로 this -> speed는 멤버함수 speed를 의미하고 보통 speed = speed; 처럼 매개변수의 이름과 멤버함수의 이름이 같을때, 자기 자신의 주소를 리턴할 때, 자기자신(객체)를 반환하려고 할 때, 자기 자신과 다른 객체 비교할 때 this를 사용한다.
그리고 이 this는 클래스의 멤버 함수 내부에서만 사용이 가능하고 정적함수(static)의 경우는 프로그램이 켜지면서 생성되기에 객체가 존재하지 않기에 this로 해당 객체의 주소값을 저장할 수 없기에 사용이 불가능하다.
1) 매개변수의 이름과 멤버함수의 이름이 같을때
void setName(std::string name) {
this->name = name; // 왼쪽은 멤버 변수, 오른쪽은 매개변수
}
2) 자기 자신의 주소를 리턴할 때
class Dog {
public:
Dog* getSelf() {
return this; // 자신의 주소를 리턴
}
void bark() {
std::cout << "Woof!" << std::endl;
}
};
int main() {
Dog d;
Dog* ptr = d.getSelf(); // ptr은 d의 주소를 가짐
ptr->bark(); // d와 동일한 객체
}
this는 객체 d를 가리키는 포인터이므로 d.getSelf()는 &d와 동일한 객체로써 수행된다
즉, this를 반환하게 되면 객체 자신의 주소값(위에선 Dog* 타입)을 반환하게 된다
3) 메서드 체이닝 (자기 자신을 반환)
메서드 체이닝이란건 객체 자신의 참조를 반환하여 여러 메서드를 연속으로 호출 가능하게 하는 패턴을 말하는데
class Point {
private:
int x, y;
public:
Point& setX(int x) {
this->x = x;
return *this; // this → Point* 이므로 *this → Point&
}
Point& setY(int y) {
this->y = y;
return *this;
}
void print() {
std::cout << "(" << x << ", " << y << ")" << std::endl;
}
};
int main() {
Point p;
p.setX(10).setY(20).print(); // 체이닝
}
setX()의 return *this;는 객체 자신을 참조로 반환하고 (this => Point* 타입 , *this => Point& 타입) Point&는 원본 객체를 수정 가능한 참조이기 때문에 이어지는 setY()도 같은 객체에 동작하기에 setX의 반환이 Point p의 참조라 setY를 그대로 부르고 setY의 반환도 동일하게 p의 참조이기에 동일하게 p의 print()를 부르게 되는 것임.
4) 자기 자신과 다른 객체 비교
두 객체가 실제로 같은 메모리 주소를 가리키는지 확인(같은 인스턴스인지)하는데 사용되며
class Person {
public:
bool isSame(const Person& other) {
return this == &other;
}
};
int main() {
Person p1;
Person p2;
Person& p3 = p1; // p3는 p1의 별칭
std::cout << std::boolalpha;
std::cout << "p1 vs p2: " << p1.isSame(p2) << std::endl; // false
std::cout << "p1 vs p3: " << p1.isSame(p3) << std::endl; // true
}
this == &other는 객체의 주소값을 비교하는데 p1.isSame(p2) → 서로 다른 인스턴스 → false가 출력되고 p3는 p1의 참조이기에 p1.isSame(p3) → 같은 주소 → true가 출력된다
'Programming Language > C++' 카테고리의 다른 글
Part2::Ch 01. 클래스 - 08. 정적 멤버 (0) | 2025.04.29 |
---|---|
Part2::Ch 01. 클래스 - 07. const (0) | 2025.04.29 |
Part2::Ch 01. 클래스 - 05. 선언과 정의의 분리 & 전방 선언 (0) | 2025.04.29 |
Part2::Ch 01. 클래스 - 04. 파괴자(Destructor) (0) | 2025.04.29 |
Part2::Ch 01. 클래스 - 03. 생성자(Constructor) (0) | 2025.04.29 |