About C++ – “포인터 객체, 화살표(‘->’ 간접참조연산자) 연산자, 직접참조연산자란?”
About C++ – “포인터 객체, 화살표(‘->’ 간접참조연산자) 연산자, 직접참조연산자란?”
11월 13, 2021
포인터 복습
#include <iostream>
int main(void) {
int x = 100; // 정수형 변수 x를 선언하고, 100을 대입했습니다.
int y; // 정수형 변수 y를 선언했습니다.
int *PointerX; // 포인터형 변수 PointerX를 선언했습니다.
PointerX = &x; // PointerX 안에 X의 주소를 대입했습니다.
y=*PointerX; // 참조 연산자(*)를 사용하여 포인터의 주소로 가서 값을 가져왔습니다.
std::cout << y;
return 0;
}
포인터를 간단히 https://www.gdsanadevlog.com/668 에 정리해두었습니다. 위의 코드를 이해하시기는 어렵지 않을 것입니다.
포인터 객체로 알아보는 직접참조연산자, 간접참조연산자란?
클래스에서도 포인터 객체를 만들 수 있습니다. 위의 코드에서 int형의 포인터객체 PointerX를 만든 것과 같은 맥락입니다.
#include <iostream>
using std::cout;
class Fish{
private:
float length;
public:
float getLength(){return length;}
void setLength(float a){length = a;}
};
Fish클래스 정의부분인데, 위의 코드는 전혀 이해하기 어렵지 않을 것입니다.
main함수를 자세히 살펴보겠습니다.
int main()
{
Fish discus, *pdiscus;
pdiscus = &discus;
discus.setLength(15.3452);
// cout<<discus.getLength(); 이면,
// error: member reference type 'Fish' is not a
// pointer; did you mean to use '.'?
// 포인터 객체가 아니므로 '.' 직접참조연산자를 사용해야 한다는 오류 메시지가 나옵니다.
cout<<discus.getLength();
cout<<"\n";
pdiscus->setLength(11.5);
//pdiscus.setLength(11.5); 이면,
//error: member reference type 'Fish *' is a pointer;
//did you mean to use '->'?
//포인터 객체이므로 '->' 간접참조연산자를 사용해야 한다는 오류 메시지가 나옵니다..
cout<<pdiscus->getLength();
return 0;
}
Fish클래스의 일반객체인 discus와 포인터객체 pdiscus를 만들었습니다. 다음 줄에서, 주소값을 저장할 수 있는 포인터객체인 pdiscus에 discus의 주소값을 대입한 것을 알 수 있습니다.
discus.setLength(15.3452);
는 직접참조연산자인 ‘.’를 이용한 예시입니다. 일반객체인 discus가 멤버에 접근하기 위해서 직접참조연산자를 사용한 것을 볼 수 있습니다. 다음줄인 cout<<discus.getLength();
에서도 직접참조연산자를 사용한 것을 확인할 수 있습니다.
이번엔 pdiscus->setLength(11.5);
의 경우를 살펴봅니다. pdiscus는 포인터 객체이므로 간접참조연산자인 ‘->’를 사용하여 멤버에 접근한 것입니다. 당연히 다음줄에서도 포인터객체가 멤버에 접근하기 위해서 간접참조연산자를 사용한 것을 알 수 있겠습니다.
간접참조연산자( ‘->’ ) vs 직접참조연산자( ‘.’ )
- 간접참조연산자는 포인터 객체가 멤버에 접근하기 위해 사용합니다.
- 직접참조연산자는 일반 객체가 멤버에 접근하기 위해 사용합니다.