PGR21.com
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
Date 2008/12/16 18:42:21
Name Magic_'Love'
Subject c++ 레퍼런스 반환 함수의 사용 목적
책을 좀 봐도 레퍼런스 반환 함수의 사용 목적을 잘 모르겠습니다.
그리고 이게 어떻게 돌아가는건지도 잘 모르겠구요..

일단

int a = 10;

int &ref = a;   일때 ref가 a의 별명이 되고 같은 메모리 공간을 일컫는 말이라는 건 알고 있습니다.

문제는 함수인데요...

도대체 레퍼런스를 반환한다는 의미를 잘 모르겠습니다.

int a(int abc, int bcd)
{
    int sum;
    sum = abc + bcd;
    return sum;
}

이렇게 한다면 sum은 int 값이니까 반환하는게 맞는거고 이해가 되는데

int &a(int abc)
{
    abc++;
    return abc;
}

이렇게 하면 이게 도대체 무슨 의미인지 잘 모르겠습니다.
분명히 abc는 int형인데 이걸 반환하면서 앞에 &붙으니 뭘 어떻게 하라는건지...

레퍼런스 반환함수가 어떻게 돌아가는것이고 뭣때문에 쓰는건지 알려주시면 감사하겠습니다.

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
08/12/16 18:58
수정 아이콘
기능상으론 static변수와 같은 역할을 한다고 보시면 됩니다.

원래 주소값으로 하는 연산이 아니면 function이 끝나는 순간 내부 변수내용은 모두 사라지게 됩니다.

하지만 저 함수는 리턴을하고 함수가 끝나도 함수 a에서 선언된 abc란 주소는 여전히 남아있게 되고

다시 함수를 호출하면 저 값이 증가됩니다. (인수로 보내는값과 참조하여 사용한 함수 a의 변수 abc 둘다 증가)

함수로 보내실때 인수는 int& abc로 보내셔야 될겁니다.
08/12/16 19:48
수정 아이콘
레퍼런스 반환은 보통 저렇게 사용 안하죠.

C에서는 함수의 리턴값은 모두 R-value인데 c++로 확장되면서 레퍼런스 반환으로 리턴값이 L-value가 될 수도 있습니다.

이게 무슨말이나 하면

a(1)=3; //이건 c에서는 명백한 에러지만

int &a(int abc) //이렇게 레퍼런스 반환형이라면 L-value로 쓰일수 있습니다.

아래주소에서 퍼온 예제입니다.
http://web.lge.cn:8000/system/cpp/1062

#include<iostream.h>

#include<iomanip.h>

#include<conio.h>

int & max(int & x, int & y)


return (x > y)? x: y;



void main()


int a=10,b=20,z;

clrscr();

z=max(a, b); // z=20이 된다.

cout << "z= " << z << endl;

max(a, b)=0; // b=0이 된다. a의 값(10)은 변화 없다.

cout << "a= " << a << endl;

cout << "b= " << b << endl;

getch();



EZrock님// static과는 다릅니다.
아래 예제를 실행해보시면 둘다 stack에 할당된 것을 확인 하실 수 있습니다.
#include <cstdlib>
#include <iostream>

using namespace std;

int &a(int abc)

static int st;
cout<<&st<<endl; //2 함수의 정적(static)변수
abc++;
cout<<&abc<<endl; //3 함수의 지역변수
return abc;



int main(int argc, char *argv[])

int asd;
cout<<&asd<<endl; //1 main함수의 스택(지역)변수
cout<<&a(1)<<endl; //4 리턴된 지역변수
system("PAUSE");
return EXIT_SUCCESS;


출력결과입니다.
0x22ff74
0x443020
0x22ff50
0x22ff50
08/12/16 19:58
수정 아이콘
static에 비교한것은 return후 내부 변수가 사라지지 않고 그 값을 유지하는것 때문에 그렇게 설명했습니다. 기능상...
Magic_'Love'
08/12/16 20:31
수정 아이콘
으...머리가 더 어지럽네요...

그니까 int abc() 함수랑 int &abc() 함수는 똑같이 int 값을 리턴하는데 저 &를 붙이면 뭐가 달라지느냐는 건데요...
처음꺼는 그냥 int값이 반환하는건 알겠는데...

나중 것은 int값에 &를 붙여서 반환되는 건가요..??

int &abc(int &a)

...........
return a; // a가 10이라고 하면...


요건 a에 &를 붙여서 반환하는 건가요? 즉 &a 이렇게 말입니다.
그렇다면 a의 주소값을 반환한다는 건데.... 레퍼런스 함수가 이걸 의미하는건 아니지 않습니까?

int z = abc(a);

일때 abc함수가 a를 반환하면 z = &a 이렇게 되는거는 아닌것 같은데요..

이걸 도대체 어떻게 생각해야 하는건지 모르겠습니다.
08/12/16 20:51
수정 아이콘
Magic_'Love'님// 간단하게 정리하면 레퍼런스 리턴은
abc(a)=0;
이런 코드 때문에 쓰는 겁니다.

int z = abc(a);
이런 형태에서는 레퍼런스 리턴은 필요가 없습니다.

전체코드를 보여주셔야 알겠지만 제시하신 코드는 잘못 작성한 코드 같네요.

ps. local변수는 함수 밖에서 레퍼런스하거나 포인팅하면 안됩니다. return후에 다른 함수가 호출되면 값이 덮어쓰기 됩니다.
Magic_'Love'
08/12/16 21:49
수정 아이콘
Memex님// 질문을 잘못한것 같아서...

제가 궁금한건

레퍼런스 반환 함수 <======= 이놈의 개념 그 자체입니다.



int abc()

int a;
.......
return a;


이건 아무런 문제가 없습니다.

근데

int &abc()

int a;
.......
return a;


이렇게 함수 반환형에 &가 붙으면 이걸 어떻게 이해해야 하느냐는 것 입니다.

그냥 int반환형 함수면 a = 25 일때 a를 리턴하면 함수를 호출한곳에 25를 넘겨주겠죠..
그런데 int&반환형 함수에 a = 25 일때 a를 리턴하면 함수를 호출한곳에 25를 넘겨주는건지 &a가 되어서 a의 주소값을 주는건지
아니면 어떤 작용이 일어나는건지.... 이걸 모르겠습니다.

레퍼런스 반환함수라고 하는데.... 그 레퍼런스 반환함수가 뭘 하는 놈인지 모르겠다는 것입니다.

레퍼런스 반환이라는 개념 그 자체를 모르겠습니다....ㅜ.ㅡ;;;
08/12/16 22:20
수정 아이콘
return 3;
이러면 3이 리턴됩니다.

return a;
하면 보통 a의 값이 리턴됩니다.

하지만 int &func();
이렇게 함수를 레퍼런스 리턴형으로 하면
return a;
하면 a라는 변수 자체가 리턴됩니다.

레퍼런스라는 개념은 포인터와 비슷합니다. 포인터는 포인터 변수가 메모리주소라는 값을 갖고 그 메모리를 통해서 변수를 제어합니다.
레퍼런스 변수는 레퍼런스 변수 자체가 참조 당하는 변수와 같은 주소 공간을 공유합니다.

레퍼런스 리턴이나 값의 리턴이나 개념적으로 비슷하지만 값의 리턴은 R-value로만 사용되지만 레퍼런스 리턴은 L-value로도 사용가능합니다.(L-vaule는 =연산자에서 왼쪽에 위치하는게 L-value입니다. 오른쪽은 R-value입니다. L-value는 변수, R-value는 변수나 상수가 가능합니다.)

일반적인 return은 변수의 값을 리턴합니다. 하지만 레퍼런스 리턴은 변수 자체를 리턴하기 때문에 변수를 직접 제어할 수 있습니다.
포인터 리턴으로 동일하게 구현하려면 리턴된값에 *(value of)를 넣어 주면됩니다.

int &abc()

int a;
.......
return a;

이 함수는 a라는 변수의 레퍼런스를 만들어서 그걸 리턴하는 기능을 하게 됩니다. 포인터식으로 바꾸자면
int *abc()

int a;
.......
return &a;

가 됩니다. 사용할 때는 위의 코드는 abc()=123; 아래의 코드는 *abc()=123
물론 저렇게 지역변수를 포이팅하거나 레퍼런스 하는 것은 매우 안좋은 코딩입니다. 리턴되는 시점에 값은 그대로 남아 있지만 이미 스택영역 밖의 데이터가 됩니다.
Magic_'Love'
08/12/16 22:27
수정 아이콘
Memex님// 그렇다면 레퍼런스 반환 함수를 사용하는 이유가 L-value로 쓰기 위해서 인가요..??

즉 R-Value로 쓰일때는 굳이 레퍼런스 반환함수로 할 필요가 없지만 L-value로 쓰기 위해 레퍼런스 반환 함수가 존재하는 것인가요?
08/12/16 22:47
수정 아이콘
다른 쓰임도 있지만 L-value가 대표적입니다.
값만 필요할때는 레퍼런스 리턴은 필요가 없습니다.
Magic_'Love'
08/12/16 23:40
수정 아이콘
Memex님// 아...네...;; 뭔가 알듯말듯 하네요...크

하여튼 대답해 주셔서 감사합니다.

다른 분들도 답변해 주셔서 감사합니다...
08/12/17 14:42
수정 아이콘
어지간해서는 레퍼런스 반환 함수를 쓸 필요는 없을것 같습니다.

저도 과제하면서 혹은 프로젝트하는 친구들의 내용물을 봐도 저런걸 쓰는 사람은 한번도 본적이 없는데

레퍼런스로 보내주기만 하면 리턴받을 필요 없이 조작이 다 되는데...저런식의 함수를 쓸 필요가 있을까 싶은 생각이 드네요.

그래서 저는 쓰지 않습니다-_-)乃
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
46825 경찰서에서 전화가 왔습니다. [완료] [5] 영혼2084 08/12/16 2084
46824 남녀 노는거에 대해 하나만 질문드립니다. [6] 한마 유지로2118 08/12/16 2118
46822 24일 어떻게 놀아야 보람차게 보낼 수 있을까요?(보기 있습니다) [19] 한마 유지로2141 08/12/16 2141
46820 엑셀 질문 드립니다. [1] 허접플토1574 08/12/16 1574
46819 [도움 요청] 게임 관련한 번역을 하고 있습니다... [5] 볼드모트1557 08/12/16 1557
46817 일본에서 노트북 구입. [6] 트리티2782 08/12/16 2782
46816 Lg 컬러메일 --> Sk수신 질문 드립니다. [3] 군계일학2208 08/12/16 2208
46815 c++ 레퍼런스 반환 함수의 사용 목적 [11] Magic_'Love'6371 08/12/16 6371
46814 USB 메모리중에 쓰기방지탭 있는 메모리는 없나요? [2] 고래의꿈2190 08/12/16 2190
46813 수능 비교내신 계산하는 사이트 [2] 영웅의물량1912 08/12/16 1912
46812 약 10년전 TV프로그램을 찾습니다 [8] 수험생2094 08/12/16 2094
46810 운전면허질문요^^ [7] Art Of Life1786 08/12/16 1786
46809 독어해석 좀 부탁드릴게요~ [2] 칼빵한개구리1442 08/12/16 1442
46808 24인치 lcd모니터 추천부탁드립니다. [4] 뇌공이2077 08/12/16 2077
46807 유가환급금 에 대해 질문합니다. [5] 타치바나1597 08/12/16 1597
46806 한자능력시험관련해서 질문합니다.. [1] Wr.C-YuJI1512 08/12/16 1512
46805 Message-Driven Architecture 에관해서요 [1] Terran초짜zerg1629 08/12/16 1629
46804 공유기쓰는데요... [3] 오월2094 08/12/16 2094
46803 닌텐도 DS 에 관해 질문입니다 . [2] Dean & Sam2024 08/12/16 2024
46802 09학년도 예비대학생입니다. 꼭 알아야할 정시지원전략 몇가지를 알려주세요. [3] UUUUU1730 08/12/16 1730
46801 질개에 어울리는 뜨거운 이성문제입니다...^^ [19] Rainism2126 08/12/16 2126
46800 신문사 주필에 대한 질문입니다. [2] BuyLoanFeelBride4163 08/12/16 4163
46798 노래제목 질문드려요 종이칼1551 08/12/16 1551
목록 이전 다음
댓글

+ : 최근 6시간내에 달린 댓글
+ : 최근 12시간내에 달린 댓글
맨 위로