C++에서 ::(범위 지정 연산자, scope resolution operator)는 변수 스코프(유효 범위)에 의해 가려진 이름, 즉 숨겨진 이름에 접근하기 위해 사용됩니다. 이 연산자는 단항(unary)과 이항(binary) 두 가지 형태로 모두 사용할 수 있습니다.
단항 범위 지정 연산자는 블록(block)이나 클래스 내부에서 동일한 이름의 선언으로 인해 네임스페이스 스코프 또는 전역 스코프의 이름이 가려졌을 때 사용합니다. 예를 들어, 전역 변수 my_var와 지역 변수 my_var가 동시에 존재한다면, 전역 변수에 접근하려면 반드시 범위 지정 연산자를 사용해야 합니다.
예제 1: 전역 변수와 지역 변수 구분하기
#include <iostream>
using namespace std;
int my_var = 0;
int main(void) {
int my_var = 0;
::my_var = 1; // 전역 my_var를 1로 설정
my_var = 2; // 지역 my_var를 2로 설정
cout << ::my_var << ", " << my_var;
return 0;
}실행 결과
1, 2
main 함수 내에서 선언된 my_var는 전역 네임스페이스 스코프에 선언된 정수형 my_var를 가립니다. 따라서 ::my_var = 1; 문장은 전역 네임스페이스 스코프에 선언된 변수에 접근하는 것이고, 연산자 없이 작성된 my_var = 2;는 지역 변수에 접근하게 됩니다.
예제 2: 클래스 이름과 클래스 멤버 접근하기
범위 지정 연산자는 클래스 이름이나 클래스 멤버 이름에도 활용할 수 있습니다. 클래스 멤버의 이름이 가려져 있을 때, 클래스 이름과 범위 지정 연산자를 앞에 붙여 해당 멤버에 접근할 수 있습니다.
#include <iostream>
using namespace std;
class X {
public:
static int count;
};
int X::count = 10; // static 데이터 멤버 정의
int main() {
int X = 0; // 클래스 타입 X를 가림
cout << X::count << endl; // 클래스 X의 static 멤버 사용
}실행 결과
10
위 예제에서 main 함수 내의 지역 변수 X가 클래스 타입 X를 가리고 있지만, X::count처럼 범위 지정 연산자를 사용하면 클래스 X의 정적(static) 멤버인 count에 문제없이 접근할 수 있습니다.
이처럼 범위 지정 연산자는 이름 충돌 상황에서 전역 변수, 네임스페이스 요소, 클래스 멤버를 명확하게 구분해 주는 C++의 필수 도구입니다.