[완료] C++ Reference type 에 대한 의문점...

liveeasily의 이미지

안녕하세요,

C++ 중 Reference type 에 대한 의문점이 생겨서 도움을 구합니다.

  1 #include <stdio.h>
  2 
  3 int main(int argc, char *argv[])
  4 {
  5     int temp = 0; // reference 선언과 동시에 초기화를 위해 임시변수 사용
  6     int *p = NULL;
  7     int &r = temp;
  8     {
  9         int a = 10;
 10         p = &a;
 11         r = a;
 12         printf("a addr = %p\n", &a);
 13         printf("r = %d\n", r);
 14         printf("*p = %d\n\n\n",  *p);
 15     }   
 16     r = 5;
 17     //*p = 100;
 18     //printf("a = %d\n", a); // error
 19     printf("r = %d\n", r);
 20     printf("p = %p\n",  p);
 21     printf("*p = %d\n",  *p);
 22 }

[결과]
a addr = 0xbfac09f4
r = 10
*p = 10

r = 5
p = 0xbfac09f4
*p = 10

==============================================

reference type 을 그냥 포인터와 유사하다 정도로만 여기고 살아왔습니다
그래서 r 이라고 지칭되고 있는 메모리공간에는 실제 a 의 주소가 저장되었을 것이라고 제 멋대로 생각하고 있었습니다.
reference 가 사용될 때는 저장된 주소에 있는 값이 쓰이는 구나 라고 여겼습니다.

하지만 위의 소스를 실행해보니 그게 아니라는 생각이 드는군요.
만약 그랬더라면 두 번째 *p 의 값도 "5" 가 나왔을테니까요.

1. reference type 변수에 실제 저장된 값은 어떤 종류인가요?
2. 위의 소스처럼 reference 의 target 이 먼저 소멸되버린다면 어떤 일이 벌어질까요?

reference 의 정확한 개념이 잘 서질 않네요..

liveeasily의 이미지

Important note: Even though a reference is often implemented using an address in the underlying assembly language, please do not think of a reference as a funny looking pointer to an object. A reference is the object. It is not a pointer to the object, nor a copy of the object. It is the object.

하지 말라는 짓을 하고 있었나 봅니다...

jick의 이미지

r을 포인터로 본다면, 11번째 줄은 그 포인터의 값을 바꾸는 것이 아니라 포인터가 가리키는 곳을 바꾸는 것입니다.
즉 p = &a에 대응하는 게 아니라 *p = a에 대응합니다. 레퍼런스는 한번 만들면 가리키는 곳을 나중에 바꿀 수 없습니다.

즉, (r을 포인터로 보는 관점에서) r은 temp의 주소를 저장한 포인터로 만들어져서 끝까지 그 주소값을 유지하고 있는 것입니다.
(그리고 맨 마지막의 *p는 이미 날아가버린 a라는 변수를 참조하고 있으므로 사실 잘못된 코드입니다. 그 시점에서 쓰레기값이 나오거나 프로그램이 죽을 수 있습니다.)

gazam의 이미지

참조체는 초기화후 값 대입한 다음에는 다른 변수로 옮겨탈 수 없습니다.
위의 코드는 r=a 에서 결국 temp = a 한것과 같은 효과입니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.