멤버 연산자


멤버 연산자

멤버 연산자는 주로 구조체(struct), 공용체(union), 클래스(class) 내의 멤버 또는, 배열에 접근하기 위해 사용한다.


직접 멤버 연산자

직접 멤버 연산자 .는 일반적인 멤버에 접근할 때 사용된다.

예시

struct Test
{
    int X = 0;
    int Y = 0;
};

int main()
{
    Test t;

    printf("t.X = %d, t.Y = %d\n", t.X, t.Y);

	t.X = 20;
	t.Y = 30;

	printf("t.X = %d, t.Y = %d\n", t.X, t.Y);

    return 0;
}


간접 멤버 연산자

간접 멤버 연산자 ->는 포인터 멤버 연산자로, 포인터로 선언된 것의 멤버에 접근할 때 사용된다.

예시

struct Test
{
	int X = 0;
	int Y = 0;
};

int main()
{
	Test* t = new Test();

	printf("%d, %d\n", t->X, t->Y);

	t->X = 20;
	t->Y = 30;

	printf("%d, %d\n", t->X, t->Y);

	delete t;
	t = nullptr;

	return 0;
}

활용

직접 멤버 연산자와 간접 멤버 연산자의 큰 차이로는 접근 시에 포인터로 접근하느냐 아니냐의 차이라고 볼 수 있다.

그럼 직접 멤버 연산자로는 포인터로 접근할 수 없는가라고 묻는다면, 그렇지 않다.

직접 멤버 연산자인 .도 포인터로 접근이 가능하다.

방법은 간단하다. 우리가 포인터로 접근할 때는 * 연산자를 사용하는데, 이를 활용하면 직접 멤버 연산자로도 포인터 접근이 가능하다.

간단한 예시로 알아보자

예시

struct Test
{
	int X = 0;
};

int main()
{
	Test* t = new Test();

	printf("%d\n", t->X);   //0
	printf("%d\n", (*t).X); //0

	t->X = 20; // = (*t).X = 20;

	printf("%d\n", t->X);   //20
	printf("%d\n", (*t).X); //20

	delete t;
	t = nullptr;

	return 0;
}