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

C++ 점(.) 연산자와 화살표(->) 연산자의 차이 완벽 정리

C++의 점(.) 연산자와 화살표(->) 연산자란?

C++에는 점(dot) 연산자(.)화살표(arrow) 연산자(->) 두 가지가 있으며, 둘 다 클래스의 멤버에 접근하는 데 사용됩니다. 두 연산자의 차이는 사용되는 상황에 있습니다. C++에서 class, struct, union으로 선언된 타입은 모두 "클래스 타입(class type)"으로 간주되기 때문에, 아래의 설명은 이 세 가지 타입 모두에 해당합니다.

1. 점(.) 연산자: 객체의 멤버 접근

a.b는 b가 객체 a(또는 객체에 대한 참조)의 멤버일 때만 사용할 수 있습니다. 즉, a.b에서 a는 항상 실제 객체이거나 객체에 대한 참조(reference)여야 합니다.

2. 화살표(->) 연산자: 포인터가 가리키는 객체의 멤버 접근

a->b는 본질적으로 (*a).b의 축약 표현입니다. 즉, a가 객체를 가리키는 포인터라면, a->b는 그 포인터가 가리키는 객체의 멤버 b에 접근하는 것과 같습니다.

연산자 오버로딩 관련 주의 사항

중요한 점은 .(점 연산자)는 오버로딩이 불가능하다는 것입니다. 반면 ->는 오버로드 가능한 연산자이므로, 이 연산자가 사용될 때 호출될 함수(operator->())를 직접 정의할 수 있습니다. 따라서 a가 operator->를 오버로드한 클래스의 객체라면(대표적인 예로 스마트 포인터(smart pointer)반복자(iterator)가 있습니다), 그 동작 방식은 해당 클래스 설계자가 구현한 내용에 따라 결정됩니다.


[참고] 참조(reference)는 의미상 객체의 별칭(alias)이므로, 엄밀히 따지면 "포인터에 대한 참조"도 함께 언급하는 것이 맞습니다. 다만 포인터에 대한 참조(T*&)는 실무에서 거의 사용되지 않아 오히려 혼란을 줄 수 있다고 판단하여 본문에서는 생략했습니다.

예제 코드

다음 예제는 점 연산자와 화살표 연산자를 사용해 동일한 멤버 변수에 접근하는 방법을 보여줍니다.

#include<iostream>
class A {
    public: int b;
    A() { b = 5; }
};
int main() {
    A a = A();
    A* x = &a;
    std::cout << "a.b = " << a.b << "\n";
    std::cout << "x->b = " << x->b << "\n";
    return 0;
}

실행 결과

위 코드를 컴파일하고 실행하면 다음과 같은 출력을 확인할 수 있습니다.

a.b = 5
x->b = 5

객체 a에 대해 점 연산자를 사용하든, 객체를 가리키는 포인터 x에 대해 화살표 연산자를 사용하든, 같은 멤버 변수 b의 값 5에 접근하는 것을 알 수 있습니다. 정리하면, 실제 객체에는 점(.), 객체를 가리키는 포인터에는 화살표(->)를 사용한다고 기억하면 됩니다.