C++에서 범위 지정 연산자(Scope Resolution Operator, ::)는 클래스의 정적(static) 멤버나 클래스 멤버에 접근할 때 사용되며, this 포인터는 지역 변수와 이름이 같은 멤버 변수가 있을 때 객체 자신의 멤버에 접근하기 위해 사용됩니다. 두 가지 모두 '이름 가림(name hiding)' 상황에서 유용하게 활용되지만, 접근 대상이 다르다는 점에서 차이가 있습니다.
1. 범위 지정 연산자(::)란?
범위 지정 연산자 ::는 클래스 외부에서 정적 멤버를 정의하거나, 함수 내부에서 지역 변수에 의해 가려진 클래스 멤버에 접근할 때 사용합니다. 특히 정적 멤버 변수는 객체에 속하지 않고 클래스 자체에 속하므로 반드시 클래스명::멤버명 형태로 접근해야 합니다.
예제 코드
#include<iostream>
using namespace std;
class AB {
static int x; // 정적 멤버 변수 선언
public:
// 지역 매개변수 'x'가 클래스 멤버 'x'를 가리지만,
// 범위 지정 연산자(::)를 사용하면 접근할 수 있습니다.
void print(int x) {
cout << "the number is:" << AB::x;
}
};
// C++에서 정적 멤버는 아래와 같이 클래스 외부에서 명시적으로 정의해야 합니다.
int AB::x = 7;
int main() {
AB ob;
int m = 6;
ob.print(m);
return 0;
}
실행 결과
the number is:7
위 예제에서 print 함수의 매개변수 x가 클래스의 정적 멤버 x를 가리고 있지만, AB::x처럼 범위 지정 연산자를 사용하면 정적 멤버 값인 7을 정확히 출력할 수 있습니다.
2. this 포인터란?
this 포인터는 멤버 함수 내부에서 해당 함수를 호출한 객체 자신을 가리키는 포인터입니다. 지역 변수나 매개변수가 멤버 변수와 같은 이름일 때, this->멤버명 형태로 작성하면 객체의 멤버 변수임을 명확하게 구분할 수 있습니다.
예제 코드
#include<iostream>
using namespace std;
class AB {
int x; // 일반 멤버 변수
public:
AB() {
x = 6;
}
// 여기서 지역 매개변수 'x'가 객체의 멤버 'x'를 가리지만,
// this 포인터를 사용하면 접근할 수 있습니다.
void print(int x) {
cout << "the number is: " << this->x;
}
};
int main() {
AB ob;
int m = 7;
ob.print(m);
return 0;
}
실행 결과
the number is: 6
이 예제에서는 매개변수 x(값 7)가 멤버 변수 x(값 6)를 가립니다. 하지만 this->x를 사용했기 때문에 생성자에서 초기화된 객체의 멤버 값인 6이 출력됩니다.
3. 핵심 차이점 요약
| 구분 | 범위 지정 연산자 (::) | this 포인터 |
|---|---|---|
| 접근 대상 | 클래스의 정적 멤버 및 클래스 멤버 | 객체 자신의 인스턴스 멤버 |
| 사용 형태 | 클래스명::멤버명 | this->멤버명 |
| 주요 용도 | 클래스 외부에서 정적 멤버 정의, 이름 충돌 시 클래스 멤버 접근 | 매개변수·지역 변수와 이름이 겹칠 때 멤버 변수 구분 |
| 객체 필요 여부 | 불필요 (정적 멤버 기준) | 필요 (객체에 바인딩됨) |
정리하면, 정적 멤버나 클래스 차원의 멤버에 접근할 때는 범위 지정 연산자(::)를, 객체 자신의 멤버 변수를 명확히 참조해야 할 때는 this 포인터를 사용하는 것이 C++의 올바른 활용 방법입니다.