⚠️ 차이점 (값이 바뀌는 경우 vs 안 바뀌는 경우)
class B {
int x;
public:
void SetX(int b) { x = b; } // 멤버 변수 x 에 직접 저장
};
x는 객체 내부 변수이고SetX()는 this->x = b; 로 바꾸는 함수니까void SetX(int b) {
b = 100; // ❌ 매개변수만 바뀌고 x는 그대로
}
x = b;가 없고b = 100;만 바꿨기 때문에 x는 아무 영향 없음void Modify(int x) {
x = 100; // ❌ 복사본만 바뀜
}
int main() {
int a = 5;
Modify(a);
std::cout << a; // 여전히 5
}
int x는 a의 복사본a는 그대로void Modify(int& x) {
x = 100;
}
int main() {
int a = 5;
Modify(a);
std::cout << a; // 🔥 100
}
x는 a의 별명 (alias)x = 100; 하면 a도 바뀜void Modify(int* p) {
*p = 100;
}
int main() {
int a = 5;
Modify(&a);
std::cout << a; // 🔥 100
}
*p = 100; → a의 주소를 통해 값을 바꿈| 상황 | 원본 값 바뀌나? |
|---|---|
멤버 함수에서 x = b; | ✅ 바뀜 |
함수 매개변수만 바꿈 (b = 100;) | ❌ 안 바뀜 |
일반 매개변수 (int x) | ❌ 안 바뀜 |
참조 매개변수 (int& x) | ✅ 바뀜 |
포인터 사용 (int* p) | ✅ 바뀜 |
void SetX(int b) {
x = b; // ⬅️ 이건 parameter b의 값을 멤버 변수 x에 복사해서 저장
}
b는 단순한 입력값일 뿐이고x = b;는 this->x에 값을 복사하는 작업입니다.👉 b가 복사든 참조든 상관없이,
👉 b의 값만 사용해서 x에 넣는 것이므로 전혀 문제 없음이에요!
멤버 변수 수정에는 참조가 필요 없다.
멤버 함수는 this 포인터를 통해 자기 객체의 멤버 변수에 직접 접근하므로,
별도로 참조를 쓰지 않아도 내부 데이터를 수정하거나 읽을 수 있습니다.
예: x = b;는 this->x = b;와 같으며, 이는 객체의 실제 멤버를 수정하는 것입니다.
단, 외부 값을 수정하려면 그 외부 값을 참조나 포인터로 받아야 합니다. (예: void SetX(int& b))