Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++에 범위 지정 연산자(::)가 필요한 이유와 사용법

범위 지정 연산자란?

C++에서 ::(범위 지정 연산자, Scope Resolution Operator)는 변수 스코프로 인해 가려진(hidden) 이름에 다시 접근할 수 있도록 도와주는 연산자입니다. 같은 이름의 변수가 서로 다른 스코프에 존재할 때, 특정 스코프의 이름을 명확하게 지정해야 하는 상황에서 필수적으로 사용됩니다.

이 연산자는 크게 단항(unary) 형태와 이항(binary) 형태, 두 가지 방식으로 활용할 수 있습니다.

1. 단항 범위 지정 연산자 — 전역 변수 접근하기

블록이나 클래스 내부에서 같은 이름으로 변수를 선언하면, 네임스페이스 스코프 또는 전역 스코프에 있던 기존 이름은 가려지게 됩니다. 이때 단항 범위 지정 연산자를 앞에 붙이면 가려진 전역 이름에 다시 접근할 수 있습니다.

예를 들어, 전역 변수 my_var와 main 함수 안의 지역 변수 my_var가 동시에 존재하는 경우, 전역 변수에 접근하려면 반드시 ::my_var처럼 연산자를 붙여야 합니다.

예제 코드

#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 = 2; 문장은 지역 변수를 수정하고, ::my_var = 1; 문장은 전역 네임스페이스에 선언된 변수에 접근하여 값을 변경합니다.

2. 이항 범위 지정 연산자 — 클래스 이름 및 멤버 접근하기

범위 지정 연산자는 클래스 이름이나 클래스 멤버 이름에 접근할 때도 사용됩니다. 클래스 멤버의 이름이 다른 선언에 의해 가려졌다면, 클래스 이름과 함께 :: 연산자를 붙여 해당 멤버를 사용할 수 있습니다.

예제 코드

#include <iostream>
using namespace std;

class X {
public:
    static int count;
};

int X::count = 10; // 정적 데이터 멤버 정의

int main() {
    int X = 0;                // 클래스 타입 X를 가리는 지역 변수
    cout << X::count << endl; // 클래스 X의 정적 멤버 사용
}

실행 결과

10

위 예제에서 지역 변수 X가 클래스 타입 이름 X를 가리고 있지만, X::count처럼 작성하면 클래스 X의 정적 멤버 count에 문제없이 접근할 수 있습니다. 이처럼 범위 지정 연산자는 이름 충돌 상황에서도 코드의 의도를 명확하게 표현할 수 있게 해주는 C++의 핵심 문법 요소입니다.