인프런 커뮤니티 질문&답변

wlfansdl님의 프로필 이미지
wlfansdl

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문

this와 *this

해결된 질문

작성

·

213

0

안녕하세요
강의를 거의 다 듣다가 헷갈리는 개념이 있어서 복습중입니다.
 
this와 *this에 대해서 잘 이해가 안되는 부분이 있어서 질문 드립니다.
아래와 같이 예시 클래스를 만들어 봤을 때
(멤버변수들은 제가 메모리에서 쉽게 찾아보려고 연속되게 넣은거고 의미 없습니다)
class Simple
{
public:
	Simple& operator=(const Simple& rhs)
	{
		if (this == &rhs)
			return *this;
	}

private:
	int mNum = 1;
	int mNum2 = 2;
	int mNum3 = 3;
	int mNum4 = 4;
	int mNum5 = 5;
};
궁금한 점은 *this는 객체 자신이다 라는게 과연 정확히 뭘까가 의문입니다.
 
this는 자신이 속한 객체의 포인터인것은 이해가 가지만
*this 객체를 자신을 넘긴다는게 어떻게 가능한지 어떤 의미인지 의문입니다.
 
시작주소 + 어떠한 객체에 대한 헤더정보가 넘어가는것인가요 ?
 
제가 헷갈리는 이유는 예를 들어서
 
	int num = 3;
	int* ptr = #
	cout << *ptr << endl;

	int arr[10] = { 0 };
	int* arrptr = arr;
	cout << *arrptr << endl;
 
변수와 배열에 대해서 포인터를 만들었을 때
여기서 *ptr은 값 3이고,
 
*arrptr은 첫번째 원소의 값 0이지
int arr[10]이거나 arr의 첫번째 원소의 주소가 아니기 때문에
 
*this가 객체 자신을 넘긴다 ?라는게 어떤 의미일지 이해가 잘 안갑니다.
결국 return 값으로 넘길수 있는것은 뭔가 한개일테고 데이터멤버 첫번째가 값이 아니면 시작주소 아닐까 싶은데.
 
만약에 단순히 시작주소라면 this ==&rhs 이 문장은 *this == &rhs로 바꿔도 똑같을테고요..
 
결론적으로 질문은 *this가 객체 자신을 가리킨다는것이 어떤 의미인지 ?? 입니다.
객체는 일대일 대응이 안되다보니 가리킨다 라는 개념이 안 와닿습니다.
시작주소라고 하면 ? 그냥 포인터랑 다른점이 없는거 같구요. 뭔가 헤더 정보를 가지고 있는것인가요.
 
+ 구조체로 테스트 해보려고하면
C++ 이러한 피연산자와 일치하는 연산자가 없습니다. 피연산자 형식이 std::ostream << myStruct입니다.
아예 되지가 않습니다.
조사식으로 *strptr == my인 것은 확인했습니다. 여전히 어떻게 가능한지? 잘 이해는 안되네요 ㅠ
	struct myStruct my;
	struct myStruct* strptr = &my;
	cout << *strptr << endl;

답변 1

1

Rookiss님의 프로필 이미지
Rookiss
지식공유자

1)

int number = 3;
int* ptr = &number;
라면 ptr은 int* 포인터 (주소 + int타입)이기 때문에
*ptr을 하면 역참조를 해서 실제로 3이라는 값을 의미합니다.

마찬가지로,
Simple a;
Simple* ptr = &a;
라면 ptr은 Simple* 포인터 (주소 + Simple 타입)이기 때문에
*ptr을 하면 역참조를 해서 실제로 Simple 이라는 구조체 값을 의미합니다.

딱 1개의 시작값이 아니라, Simple을 구성하는 int 5개가 모두 포함되는 풀박스 그 자체가 되는 것이죠.
마찬가지로 this는 Simple* 이기 때문에 그냥 주소값이고
*this를 하면 Simple 타입입니다.
오해하신 것처럼 [데이터멤버 첫번째 값 or 시작주소]가 아니며
[모든 데이터 멤버를 합친 Simple이라는 타입] 그 자체입니다.

Simple a;
Simple& b = a; // 참조
Simple c = a;  // 복사

위는 사용법은 간단하죠? 사실 이거와 동일합니다.

Simple a; 대신 *this라고 생각하시면 됩니다.
Simple& b = *this;를 하면 복사가 되진 않고 참조를 하게 될 것이고
Simple b = *this;를 하면 실제 값을 복사하게 되겠죠.

2)
ostream operator<<에 대해 overloading이 필요한데 그건 일단 넘어가시기 바랍니다.

wlfansdl님의 프로필 이미지
wlfansdl

작성한 질문수

질문하기