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

C++ 범위 지정 연산자(::)와 this 포인터의 차이점 완벽 정리

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++의 올바른 활용 방법입니다.