참조 변수와 임시 변수의 관계 ... 에 대한 질문 ㅠㅠ

naddolki의 이미지

참조 변수에 ..
참조할 대상으로 L-Value 가 아닌 것이나, 형변환 가능한 이종 타입의 R-Value 를 지정했을 때 ..
컴파일러는 임시 변수를 생성해 참조하게끔 만드는 걸로 알고 있는데요 .

궁금한 점 1 : "에러" 를 내지 않고, 굳이 임시 변수를 둬 가면서까지, 참조가 가능하게끔 하는 이유는 무엇일까요 .

궁금한 점 2 : 임시 변수를 참조하는 경우 .. 이에 대한 접근을 읽기 전용(const int)으로만 가능토록 ..
제한을 둔 이유가 무엇일까요 .

ex) const int & ci = 34 ; // 컴파일러가 임시 변수를 생성해 34를 저장하고,

// 해당 임시 변수를 ri 가 참조하게 함 .

ex) int & i = 34; // 오류

교재를 보니깐,..

임시 변수에 대한 '쓰기' 시도는 ..
아무런 의미가 없기 때문에, 근래에 들어서는 "임시 변수는 const 타입의 참조로만 가능하도록" ..

문법이 바뀌었다던데요 ..
(즉, '쓰기' 시도가 원본 데이터의 변경과는 .. 아무런 관련이 없기 때문 ..)

하지만, 임시 변수에 '쓰기'를 시도하는 것은 ..

따져보면 .. 뭔가 오류를 낼 만한 상황이라기보다는 ..
그냥 무의미한 시도일 뿐인 것 같은데 ..

무의미한 시도를 할 것인지, 이를 피할 것인지는 .. 프로그래머의 몫일 뿐 ..

굳이 그러한 시도를 오류로 간주하거나 ..

그러한 시도를 막기 위해 const 로만 참조하도록 하는 것은 ..

"의미적인(simantic)" 차원에서 볼 문제에까지 ..

지나치게 규제하는 건 아닐까요 ? ㅡㅡ ;;

교재의 설명이 .. 제겐 어렵게 느껴져서요 ..

질문드린 두 가지를 정확히 이해하질 못했습니다 .

두 가지 질문에 명확하게 답변해 주실 수 있는 분이 혹시 계시는지요 ;;

도와주셔요 ㅠㅠ

chadr의 이미지

소스내에 하드코딩된 상수는 특정한 데이터 영역에 들어가게 됩니다.
이곳 영역은 읽기 전용이고 쓰기를 할 경우 프로그램이 죽기도 합니다.

무의미한 시도하고는 좀 거리가 있을것 같네요. 일단 시도했다가는 프로그램이
죽지 않고 데이터만 바뀌지 않는다거나 하는 행동은 안하니 말이지요.

const int & ci = 34 ;

이것의 경우에는 const를 앞에 붙여 반드시 읽기만 한다는 것을 컴파일러에게 명시적으로
알려줍니다. 따라서 특별히 포인터를 이용한 접근이 아닌 나중에 ci = 3;을 하게 되면 컴파일러가
에러를 내게 됩니다. 그렇기 때문에 상수에 대해서 참조를 허용하게 됩니다.

int & i = 34;

이것의 경우에는 상수를 참조하게 되어있습니다. 간단히 생각해서 참조도 포인터라고 생각하시면 간단합니다.
참조는 따로 메모리영역을 가지고 데이터를 저장하는 것이 아닌 이미 데이터를 가지고 있는 메모리영역을
가르키는 alias입니다. 그렇기 때문에 상수를 참조를 하게 되면 나중에 i = 2;와 같이 변경을 하면 상수가
저장되어있는 메모리 영역에 쓰기가 됩니다.

이렇게 때문에 상수를 참조자로 캐스팅을 불허하게 됩니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

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

naddolki의 이미지

헌데, 임시 변수를 사용하는 이유는 무엇일까요 .
결국 참조 변수는 .. 이미 마련된 공간에 앨리어스만 추가하는 건데 ..
초기화 할 때, 마련된 공간을 지정하지 않는 경우 ..
오류를 내는 방법이 있을 수 있는데 ..
왜 그러지 않고 ..
임시 변수를 생성하는지 .. ;;
잘 모르겠어요 ㅠㅜ

설연희 입니다 ^ ㅡ^ㅋ

설연희 입니다 ^ ㅡ^ㅋ

chadr의 이미지

임시변수라는 설명이 좀 애매하겠네요.

임시변수라는 말이 우리가 일반적으로 사용하는 변수를 의미하는게 아닙니다.
변수는 변할수 있는 수인데 사실 상수가 저장되는 공간은 변할수가 없습니다.
그래서 상수입니다.

상수도 데이터이기 때문에 메모리 어딘가에 저장이 되어야합니다. 그게 위에서 말씀드린
읽기 전용 영역이구요. 책에서 설명하는 것은 상수도 메모리의 어느공간에 저장이 된다는
것을 의미하는것 같습니다. 변수라는 용어 선택이 잘못된거 같네요.

프로그래머가 상수를 참조자에서 가르키게 했으므로 const의 경우에는 이런 기능이 충분히 가능합니다.
const가 상수를 의미하는 지시자이니까 상수 참조자가 상수를 가르키는건 전혀 이상하지 않습니다.
그러기 때문에 허용을 안할 필요는 없습니다. 상수도 이미 마련된 공간이 있습니다. 코드에 상수를
기록하는 순간 메모리 어딘가에 저장이 됩니다.

책에서 설명된 대로 임시라면 사실 그공간에 뭔가 데이터를 넣는다는건 무의미 합니다.
말그대로 임시이며 프로그래머가 사용할 수 있는 공간이 아니기에 언제 사라질지도 모릅니다.

그런데 상수 영역은 말씀드린데로 쓰기가 원천적으로 불가능 한 공간입니다.
해보시면 알겠지만 프로그램이 죽습니다.

이러한 이유 때문에 const지시자가 붙을 경우에는 에러가 나지 않고 참조가 가능합니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

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

naddolki의 이미지

좋은 의견 진심으로 감사드립니다 .

답변자님의 말씀의 요지는 ..
임시 변수는 애당초 읽기 전용의 상수 공간이기 때문에 ..
'const 참조' 의 대상이 되는 게 이상하지 않다는 말씀이시지요 ?

근데, 궁금한 게요 ..

'참조'를 사용하는 건 .. 하나의 공간에 접근하는 수단으로 두 개의 이름을 ..
이용할 수 있기 때문인데요 (그런 이유에서 call by reference 는 굉장히
효율적이라 할 수 있잖습니까 ?)

하지만, 임시 변수를 참조하는 경우에는 .. 하나의 공간에 하나의 이름만 ..
존재하게 되는데, 이는 결국 보통의 변수를 사용하는 것과 아무런 차이가 없고 ..
그렇게 따지면 .. '참조' 를 사용하는 게 무의미하지 않을까요 ?
(그 부분에 대해서 아랫 분께서는 "직관적인 호출" 이 가능하다 ..
고 답해주셨는데요)
그런 차원에서 ..
왜 오류를 내지 않고, 임시 변수를 생성해 "계속 사용할 수 있게" 하는지 궁금하네요 ..
혹시, 이 부분에 대한 .. 어떤 의견을 가지고 계신다면 ..
좀 부탁드립니다 ;; (바쁘신데 자꾸 부탁드려서 죄송합니다 ㅠㅠ)

그리고, 말씀드리기 좀 뭐하지만 .. ^^ ;;
답변이 .. 부분적으로 제가 알고 있는 바와.. 조금 ..
다른 부분이 있는 것 같아서요 .. 그 부분에 대해 코멘트를 조금 남겨도
될런지 모르겠어요 ^^ ;;
(혹시, 결례라면 .. 부디 너그러이 용서하셔요 ;)
답변 달아 주신 성의를 무시하는 건 아니고요 .
서로의 의견을 들어보면서 해결책을 찾아 보고자 하는 차원에서 ..
남겨봅니다 ;;

일단 ..
임시 변수가 읽기 전용의 '상수' 공간은 아닌 걸로 압니다 .
또한, 참조 대상으로 지정한 '상수' 자체가 임시 변수인 것도 아닌 것 같고요 .

제가 아는 바로는 ..

일단 가장 간단히 ..
역사적인 관점에서 보더라도 ..
임시 변수를 참조 하게 되는 경우, "const 참조" 만 가능하도록 ..
제한하게 된 것은 .. 비교적 최근의 일인데요 .
뒤집어 본다면 ..
여지껏 '참조' 를 통해 임시 변수를 읽고, 쓰는 것 .. 두가지 모두 ..
가능했다는 게 될 것 같네요 .. ^^ ;;

그리고, 참조 대상으로 지정한 '상수' 자체가 .. 임시 변수(용어에 오해의 소지가 있다면 ..
"임시 상수" 쯤 ..)는 아닌 것 같고요 .
임시 변수는 대상으로 지정한 상수의 복사본을 두기 위해 생성되는 공간이 아닐까 생각합니다 .

" C++ can generate a temporary variable if a target doesn’t match a reference "

가령, "일부 상수 리터럴" 이나 "표현식의 결과값" 등의 경우엔 ..
어셈블리 코드로 변환된 결과를 보면, .TEXT 섹션에 코드의 일부로 ..
존재하는 즉치이기 때문에 .. 데이터를 위한 공간이라고 보기 힘들기 때문에 ..
C/C++ 에서는 접근조차 불가능한데도 ..
(함수포인터를 이용해 무식하게 삽질하다보면 어떻게든 접근이 가능할 수도 있을런지 모르겠습니다만,
최소한 의미 있는 접근은 아닐 거라 생각합니다 ..)

참조 대상으로는 .. 지정할 수가 있는데요 ..

이처럼, 마련되어 있지 않은 공간을 참조 대상으로 지정하는 경우 ..
그들에 최소한 "읽기 전용" 이상의 접근이 가능해 지려면 ..
필연적으로 "(접근을 위한)별도의 공간" 을 마련해, 그 곳에 ..
그들을 복사해 넣는 과정이 필요한데요 .

그 별도의 공간은 "임시 변수" 이고, 이는 .. '변수' 로 보는 게 맞는 것 같습니다 .
직접 값의 변경을 시도해 보았는데, 임시 변수의 값은 변경이 가능하더라구요 .
다만, '참조' 를 통해 접근할 때만 읽기 전용인 것 같습니다 .

오류로 처리하지 않고, 임시 변수를 참조하게 하는 이유로 ..
"직관적인 호출이 가능하다" 는 점 외에는 ..
없을까요 ... ;;

답변 다시느라 귀중한 시간 빼앗아 버린 것 같아서 ..
정말 죄송하다는 생각이 듭니다 .. ^^ ;;
죄송합니다 .

설연희 입니다 ^ ㅡ^ㅋ

설연희 입니다 ^ ㅡ^ㅋ

etension의 이미지

저도 복잡한건 잘 모르겠지만
참조자를 사용하게 되는 경우 중 가장 많은 비중을 차지하는 경우가
파라미터로 값전달 이나 포인터 대신 이용하는 경우란 것을 잘 알고 계실겁니다.

일단 원론적인 부분 부터 생각해보면

int &i = 34;

라는 코드 자체가 무의미 합니다.
참조자의 특성상 어떤 다른 변수의 이름과 동등하게 사용하는 것인데
위 처럼 코드상의 상수 값을 굳이 참조할 필요 가 없죠.
그냥 상수 변수를 쓰시면 되겠죠.

하지만 const를 사용해서 굳이 상수를 참조 할수 있도록 한 이유는
함수의 파라미터로 참조자가 사용될 경우 범용성을 위해서 라고 생각할 수 있습니다.

void func(const int& var);

위와 같은 함수의 경우 어떤 정수값을 가지는 변수를 파라미터로 넘겨줘야 하겠지만
func(34); 와 같이 상수값을 어떤 변수의 인스턴스 네임을 만들지 않고 직관적으로 바로
넘겨줄 수도 있습니다.

naddolki의 이미지

그럴 수도 있겠네요 .
직관적이라는 부분이 포인트이군요 ?

답변 진심으로 감사합니다 .
많은 도움이 되었습니다 .

설연희 입니다 ^ ㅡ^ㅋ

설연희 입니다 ^ ㅡ^ㅋ

댓글 달기

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