reference 와 pointer 의 차이점을 알고 싶습니다.

vudghkzm의 이미지

너무 기초적인 질문인가요? :D

특정 언어에 구애받지 않은, 일반적인 reference와 pointer의 차이점을 알고 싶습니다.
(특정 언어에 구애받지 않은... 이라고 했지만, C/C++ 을 빼놓고, 저 둘을 얘기할 순 없겠지만요.)

언듯 보기엔 비슷해 보이는데... 막상 다른 사람이 물어보면 차이점을 명쾌히 설명해주기가 힘드네요. 내공이 부족한가 봅니다.

kuaaan의 이미지

원리는 비슷합니다만...

1. reference는 pointer보다 사용하기가 편합니다.

2. reference는 생성과 동시에 초기화되어야 하며, 포인터처럼 값을 변경할수 없습니다.

3. C에서는 reference를 지원하지 않는 것으로 알고 있습니다.

4. 음... 또...? ^^;;

----------------------------------------------
한번뿐인 인생....
미친듯이 살아보자!
----------------------------------------------

doldori의 이미지

이어받아서... ^^;

4. null pointer는 있지만 null reference라는 것은 없죠. 즉 포인터는 null pointer에
의해 유효한 개체를 가리키지 않는다는 것을 나타낼 수 있는 반면, 참조형은 반드시
유효한 개체를 참조한다는 뜻을 갖고 있습니다.

참고로 C++에 포인터와 참조형이 같이 존재하는 이유는

Why does C++ have both pointers and references?

chadr의 이미지

doldori wrote:
이어받아서... ^^;

4. null pointer는 있지만 null reference라는 것은 없죠. 즉 포인터는 null pointer에
의해 유효한 개체를 가리키지 않는다는 것을 나타낼 수 있는 반면, 참조형은 반드시
유효한 개체를 참조한다는 뜻을 갖고 있습니다.

참고로 C++에 포인터와 참조형이 같이 존재하는 이유는

Why does C++ have both pointers and references?

레퍼런스가 반드시 유효한 객체를 가르키지는 않습니다. 아래와 같은 코드에서 그렇습니다.

int *pINT = NULL;
  int &refINT = *pINT;

  refINT = 100; //꽥!!

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

doldori의 이미지

chadr wrote:
레퍼런스가 반드시 유효한 객체를 가르키지는 않습니다. 아래와 같은 코드에서 그렇습니다.

int *pINT = NULL;
  int &refINT = *pINT;

  refINT = 100; //꽥!!

참조형의 유효성과 관련해서 자주 나오는 예지요. 저는 이것을 반례로 생각하지 않습니다.
널 포인터를 역참조하는 것부터 잘못 되었으니 refINT의 초기화도 제대로 될 리가 없고,
따라서 "꽥!!"은 두번째 줄에 위치해야 하는 것이죠. 참조형의 초기화는 대상 개체가
유효한 경우에만 가능합니다.

아, 이런 경우도 있겠군요.

int& f()
{
    int i;
    return i;
}

int& r = f();

이것도 반례라고 생각하신다면 저는 gg입니다. ^^;
goodfiend의 이미지

reference는 그냥 alias라고 보시면 됩니다.
같은 메모리 영역을 a라는 변수이름으로도 참조하고 b라는 변수이름으로도 참조할 수 있죠.

chadr의 이미지

doldori wrote:
널 포인터를 역참조하는 것부터 잘못 되었으니 refINT의 초기화도 제대로 될 리가 없고,

초기화는 제대로 될리 없지만 그 정상적이지 않는 초기화가 컴파일 타임에 문제를 일으키지 않고 정상적으로 컴파일이 되는게 문제같습니다 :)

ps. 혹시나해서 미리 말씀드리지만 꽥!!하고 오리님하고는 전혀 관계가 없습니다 !! 8)

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 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>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 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>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 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>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.