C++ 함수에 대한 질문입니다.

laf2004의 이미지

함수가 있다고 합시다.

int A(int a, int b)
{
return a;
}

int &A(int a, int b)
{
return a;
}

저렇게 함수가 A 와 &A가 있을경우
A함수인 경우에는 x=A( , ) 가 가능하지만 A( , )=x 는 불가능하고
&A함수인 경우에는 A( , )=x 가 가능하다고 합니다.(( , ) 빈칸은 임의의 int형 숫자입니다.)
(가능하다는 것은 호출 및 실행이 된다는 뜻이겠지요)

그 이유는 무엇이고 차이점은 무엇입니까 ?

(저는 &A 함수 자체가 이해가 안됩니다만..)

klara의 이미지

C에서는 불가능합니다.
말씀하신 두번째 함수는 C가 아니라 C++에서 가능한 레퍼런스를 반환하는 함수입니다.
함수 이름이 &A인게 아니라, 함수이름은 A이고, 반환형이 int&인 것입니다.
&가 뭔지 모르면, 차라리 C++의 레퍼런스에 대해 찾아보는게 좋을듯합니다.

참고로 두번째 함수가 코딩은 가능하지만, 임시변수의 레퍼런스를 반환하기 때문에 문제가 있습니다.

laf2004의 이미지

C에서 불가능하고 C++에서 가능하다는걸 알았습니다.
CPP로 저장하니까 되더군요 (C로 저장하면 안되고;;)
제가 알아본 결과
&는 주소연산자이고..
주소는 주로 4바이트 int형이기 때문에 &A(i,j)함수일 경우
&A(i,j) 자체에 값을 넣는게 아닌
A(i,j)의 주소값에 int형인 x를 넣어주기 때문에 이상없이 호출이 될수 있다..
이렇게 알아냈거든요.

그런데 반환형이 int&라는게 좀 이해가 안되는 군요.
레퍼런스란 참조.. call by reference 참조는 대략 알겠는데
C++의 레퍼런스라.. 잘 모르겠군요

klara의 이미지

&가 주소를 나타내는 경우는, 변수앞에 써져있을 경우입니다.

int a;
라고 되있다면 &a는 a의 주소값이지요.

간단하게 레퍼런스에 대해 이야기하면, 변수에 별명을 붙이는 셈입니다.

예를 들어,

int a;
int& b=a;
라고 하면, b는 a대신에 똑같이 쓸수 있습니다.

a=1 이라고 하면, a와 b모두 1이란 값을 가지고, b++를 하면, 둘다 2가 되며, --a를 하면 둘다 다시 1이 됩니다.

메모리상에서 설명하면, 변수란 값을 저장하는 주소에 이름을 붙이는 것인데, 같은 주소에 두개의 이름을 다는 셈입니다.

C++외에도 많은 언어가 레퍼런스를 지원하는데요, 자바의 경우는 정말로 위와같이 작동하는데요, C++에서는 컴파일시에 포인터로 변환하여 '흉내'낸다고 들었습니다.

첫번째 함수가 안되는건 아실듯 하고...두번째 함수가 가능한 이유는, 레퍼런스를 반환하였기 때문입니다.

int A(int a, intb) { return a}
이경우는 반환값은 a의 값을 복사한 임시변수입니다.

하지만
int& A(int a, int b) {return a}
이경우는 반환되는 것은 a 그자체라고 생각할 수 있습니다.

즉 A(a, b) = 3; 과 a(이 a는 A함수의 지역변수인 a입니다.) = 3; 은 등가로 생각할수 있습니다.

그런데 어차피 이경우도 a 자체가 A함수의 지역변수이므로, 결국엔 임시객체의 레퍼런스를 반환하므로, 이경우도 제대로 돌아가진 않을 것입니다.

만약에 int& A(int& a) { return a}; 라는 함수가 있다면 이경우는 레퍼런스(참조)에 의한 전달이므로,

int a;
A(a) = 3;
이라고 하는 것은

int a;
a = 3;
이라고 하는 것과 마찬가지입니다.

더 자세한건 레퍼런스에 대해 찾아보시는게 좋을것 같습니다.

laf2004의 이미지

아직 많은 부분이 이해가 되지 않지만
많은 도움이 되었습니다.
감사합니다^^

gimmesilver의 이미지

임시 객체는 l-value가 될 수 없기 때문입니다...

------------------------
http://agbird.egloos.com

------------------------
http://agbird.egloos.com

익명 사용자의 이미지

윗분들이 잘 설명해 주셔서 충분할 것 같습니다.
더해서 제가 느낀점을 한가지 더 적겠습니다.

reference를 사용하면 pointer와 같이 Stack을 통한 대량의 복사가 일어나지 않아서 pointer를 쓸때와 동일한 성능을 갖습니다. (이건 위에서 다 설명하신 부분이고..) 또한 Pointer처럼 '*'나 '->' 연산자를 쓰지 않아서 편합니다.

그리고, 제가 가장 중요하다고 생각하는 것은 Pointer를 쓸 때 만큼 위험하지 않기때문입니다.
왜냐하면 reference를 쓰려면 규칙상 반드시 해당 type의 instance가 생성된 후에 그것에만 사용할 수 있기 때문입니다.
반면에, pointer의 경우 적절하게 초기화 되지 않아도 참조가 가능하게 되어 실행시점에서나 access violation등의 유무를 알 수 있는 경우가 생기는 문제가 있을 수 있습니다.
다시한번 정리하면, reference는 반드시 초기화된 후에 해당 객체(?)에 대한 참조가 가능하며, 잘못된 경우 compile시 문제를 알 수 있으므로, 상대적으로 안전하다고 생각합니다.

하지만, 여전히 편리한 STL등을 쓸때는 pointer등을 써야할 때도 있고... pointer를 안 쓸수도 없으므로 잘 알고 써야겠지요..

언제한번 시간 나시면, "Effective C++"와 "More Effective C++"등의 책들 보시면 급격히 많은 공력이 쌓이실 것 입니다. 질문하시는 것을 보니 충분히 금방 고수가 되실 것 같습니다.

-유진아빠-

익명 사용자의 이미지

윗분들이 잘 설명해 주셔서 충분할 것 같습니다.
더해서 제가 느낀점을 한가지 더 적겠습니다.

reference를 사용하면 pointer와 같이 Stack을 통한 대량의 복사가 일어나지 않아서 pointer를 쓸때와 동일한 성능을 갖습니다. (이건 위에서 다 설명하신 부분이고..) 또한 Pointer처럼 '*'나 '->' 연산자를 쓰지 않아서 편합니다.

그리고, 제가 가장 중요하다고 생각하는 것은 Pointer를 쓸 때 만큼 위험하지 않기때문입니다.
왜냐하면 reference를 쓰려면 규칙상 반드시 해당 type의 instance가 생성된 후에 그것에만 사용할 수 있기 때문입니다.
반면에, pointer의 경우 적절하게 초기화 되지 않아도 참조가 가능하게 되어 실행시점에서나 access violation등의 유무를 알 수 있는 경우가 생기는 문제가 있을 수 있습니다.
다시한번 정리하면, reference는 반드시 초기화된 후에 해당 객체(?)에 대한 참조가 가능하며, 잘못된 경우 compile시 문제를 알 수 있으므로, 상대적으로 안전하다고 생각합니다.

하지만, 여전히 편리한 STL등을 쓸때는 pointer등을 써야할 때도 있고... pointer를 안 쓸수도 없으므로 잘 알고 써야겠지요..

언제한번 시간 나시면, "Effective C++"와 "More Effective C++"등의 책들 보시면 급격히 많은 공력이 쌓이실 것 입니다. 질문하시는 것을 보니 충분히 금방 고수가 되실 것 같습니다.

-유진아빠-

익명 사용자의 이미지

윗분들이 잘 설명해 주셔서 충분할 것 같습니다.
더해서 제가 느낀점을 한가지 더 적겠습니다.

reference를 사용하면 pointer와 같이 Stack을 통한 대량의 복사가 일어나지 않아서 pointer를 쓸때와 동일한 성능을 갖습니다. (이건 위에서 다 설명하신 부분이고..) 또한 Pointer처럼 '*'나 '->' 연산자를 쓰지 않아서 편합니다.

그리고, 제가 가장 중요하다고 생각하는 것은 Pointer를 쓸 때 만큼 위험하지 않기때문입니다.
왜냐하면 reference를 쓰려면 규칙상 반드시 해당 type의 instance가 생성된 후에 그것에만 사용할 수 있기 때문입니다.
반면에, pointer의 경우 적절하게 초기화 되지 않아도 참조가 가능하게 되어 실행시점에서나 access violation등의 유무를 알 수 있는 경우가 생기는 문제가 있을 수 있습니다.
다시한번 정리하면, reference는 반드시 초기화된 후에 해당 객체(?)에 대한 참조가 가능하며, 잘못된 경우 compile시 문제를 알 수 있으므로, 상대적으로 안전하다고 생각합니다.

하지만, 여전히 편리한 STL등을 쓸때는 pointer등을 써야할 때도 있고... pointer를 안 쓸수도 없으므로 잘 알고 써야겠지요..

언제한번 시간 나시면, "Effective C++"와 "More Effective C++"등의 책들 보시면 급격히 많은 공력이 쌓이실 것 입니다. 질문하시는 것을 보니 충분히 금방 고수가 되실 것 같습니다.

-유진아빠-

익명 사용자의 이미지

윗분들이 잘 설명해 주셔서 충분할 것 같습니다.
더해서 제가 느낀점을 한가지 더 적겠습니다.

reference를 사용하면 pointer와 같이 Stack을 통한 대량의 복사가 일어나지 않아서 pointer를 쓸때와 동일한 성능을 갖습니다. (이건 위에서 다 설명하신 부분이고..) 또한 Pointer처럼 '*'나 '->' 연산자를 쓰지 않아서 편합니다.

그리고, 제가 가장 중요하다고 생각하는 것은 Pointer를 쓸 때 만큼 위험하지 않기때문입니다.
왜냐하면 reference를 쓰려면 규칙상 반드시 해당 type의 instance가 생성된 후에 그것에만 사용할 수 있기 때문입니다.
반면에, pointer의 경우 적절하게 초기화 되지 않아도 참조가 가능하게 되어 실행시점에서나 access violation등의 유무를 알 수 있는 경우가 생기는 문제가 있을 수 있습니다.
다시한번 정리하면, reference는 반드시 초기화된 후에 해당 객체(?)에 대한 참조가 가능하며, 잘못된 경우 compile시 문제를 알 수 있으므로, 상대적으로 안전하다고 생각합니다.

하지만, 여전히 편리한 STL등을 쓸때는 pointer등을 써야할 때도 있고... pointer를 안 쓸수도 없으므로 잘 알고 써야겠지요..

언제한번 시간 나시면, "Effective C++"와 "More Effective C++"등의 책들 보시면 급격히 많은 공력이 쌓이실 것 입니다. 질문하시는 것을 보니 충분히 금방 고수가 되실 것 같습니다.

-유진아빠-

youjin2k의 이미지

윗분들이 잘 설명해 주셔서 충분할 것 같습니다.
더해서 제가 느낀점을 한가지 더 적겠습니다.

reference를 사용하면 pointer와 같이 Stack을 통한 대량의 복사가 일어나지 않아서 pointer를 쓸때와 동일한 성능을 갖습니다. (이건 위에서 다 설명하신 부분이고..) 또한 Pointer처럼 '*'나 '->' 연산자를 쓰지 않아서 편합니다.

그리고, 제가 가장 중요하다고 생각하는 것은 Pointer를 쓸 때 만큼 위험하지 않기때문입니다.
왜냐하면 reference를 쓰려면 규칙상 반드시 해당 type의 instance가 생성된 후에 그것에만 사용할 수 있기 때문입니다.
반면에, pointer의 경우 적절하게 초기화 되지 않아도 참조가 가능하게 되어 실행시점에서나 access violation등의 유무를 알 수 있는 경우가 생기는 문제가 있을 수 있습니다.
다시한번 정리하면, reference는 반드시 초기화된 후에 해당 객체(?)에 대한 참조가 가능하며, 잘못된 경우 compile시 문제를 알 수 있으므로, 상대적으로 안전하다고 생각합니다.

하지만, 여전히 편리한 STL등을 쓸때는 pointer등을 써야할 때도 있고... pointer를 안 쓸수도 없으므로 잘 알고 써야겠지요..

언제한번 시간 나시면, "Effective C++"와 "More Effective C++"등의 책들 보시면 급격히 많은 공력이 쌓이실 것 입니다. 질문하시는 것을 보니 충분히 금방 고수가 되실 것 같습니다.

-유진아빠-

youjin2k의 이미지

아... 이거 참나 로긴 하기 구찬아서.. 그냥 올렸느데.. 계속 안 올라간 것 처럼 되어서 몇 번 해 봤더니.. 도배가 되어 있군요..
담에는 잘 할 수 있겠네요 ㅎㅎ 관리자님... 혹시 지워주시면 안될까요?
죄송합니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.