2007/10/19 - 4:45오후

  • 제가 시험관계로 조사&정리한 내용입니다.

    어떤 서브루틴이의 인자에 대한 변경이 원래 변수의 값에 영향을 미칠 call by reference라고 한다. 포인터를 이용하면 주소 값을 전달해주기 때문에 call by reference 흉내 수는 있지만 call by reference 아니다.

    포인터를 사용한 call by reference 흉내 경우 호출된 함수의 스택에 넘겨받은 주소를 보관하기 위한 로컬 변수가 생성된다. 하지만, call by reference 지원하는 언어의 경우 스택에 넘겨받은 주소를 보관하지 않는다.

    call by reference 지원하는 언어로 C++ 참조형연산자(&) FORTRAN등이 있다.

    참조형과 포인터 변수와의 차이점은 주어진 주소를 변경할 있느냐이다. 참조형 변수를 한번 선언하면 가리키고 있는 기억 장소에 대한 주소를 변경할

    없다.

    질문

    1.그럼 c++ 참조형 연사자는 데이터영역에 저장이 되나요??

    2.제가 찾은 URl(http://tpcall.tistory.com/archive/20061030)에서는 JAVA reference 타입도 call by reference라는데 맞는 얘기인가요??

    3.저희 교수님은 배열은 call by reference 동작한다는데 맞는 이야기인가요??

    1.다른 언어는

    글쓴이: chadr 작성 일시: , 2007/10/19 - 7:46오후

    1.다른 언어는 모르겠지만 c++ 경우 레퍼런스로 함수 인자를 선언했을 스택에 해당 변수의 주소가 push됩니다..

    2.자바의 경우에는 기본타입 스트링을 제외한 것은 모두 레퍼런스라고 알고 있습니다. 하지만 질문자님께서 알고 계신 "스택에 푸시 안하고 넘어가는 참조" 아닐겁니다. 동적으로 메모리에 할당 되는 데이터 값을 스택과 같은 임시 장소에 주소를 push하지 않고 참조 할려면 항상 고정된 주소가 있어야하는데, 동적이다보니 그런건 불가능하니까요.. 자세히 알아볼려면 바이트코드를 디스어셈블 해봐야 알겠지만요..

    3.c++ 경우에는 배열을 인자로 선언하고 넘겨주면 레퍼런스 형식으로 넘어갑니다. 배열의 모든 원소가 스택에 복사되지는 않습니다. 물론 여기서 레퍼런스도 "스택에 푸시 안하고 넘어가는 참조" 아닙니다.

    .. c++ 포인터를 사용한 레퍼런스입니다.

    ps. 포인터를 이용하여 구현한 레퍼런스가 아닌 경우에는 어떻게 구현하는지 저도 궁금해지는군요..:)

    -------------------------------------------------------------------------------

    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.

    »

  • 글쓴이: klutzy 작성 일시: , 2007/10/20 - 9:46오후

    call by reference 원래 변수의 위치를 파라미터로 넘기는 것이 정상입니다. C 포인터를 이용해 call by ref 구현할 있는 것이고요.

    자세히.. 변수가 가지는 값에는 L-value R-value 있습니다. L-value 변수가 존재하는 메모리 위치의 (포인터)이고, R-value 변수가 가지고 있는 실제 값입니다. 여기에서 call by value 파라미터로 R-value, call by ref L-value 넘겨줍니다. 언어 차원에서 reference 지원이 없는 C 대신 L-value 맘대로 있기 때문에 구현이 가능한 거고요. 언어 차원에서 call by ref 지원하는 경우도 내부 구현은 변수의 주소값입니다.

    배열 같은 경우도 딱히 어떤 방식이냐 따지는 것이 의미가 없어 보이네요. 그냥 배열 자체를, 여러 값들이 모여 있는 장소의 위치값을 가지는 reference value 보는 간단합니다.

    »

  •    

    C/C++에서는 배열을

    글쓴이: 익명 사용자 (미확인) 작성 일시: , 2007/10/21 - 12:02오전

    C/C++에서는 배열을 직접 매개변수로 전달할 없습니다. 함수 선언의 매개변수 부분에서 배열은 포인터로 자동 변환됩니다.

    void f(int arr[3]) // 실제로는 void f(int *arr) 된다

    {

    printf("%d", *arr++); // 배열에 ++연산자를?

    printf("%d", *arr);

    }

    배열에 ++연산자를 적용하니 안될꺼 같죠? 됩니다. 위의 코드는 100% 적법한 코드입니다. 이건 위의 코드에서 변수 arr 실제 타입이 pointer to int이기 때문입니다. 또한, 함수 내부에서 sizeof(arr) 하게 되면 int* 크기가 반환되지 배열의 크기가 반환되지는 않습니다.

    이러한 이유 때문에 C/C++에서 배열이 call by reference 전달된다고 말하는 것은 틀린 설명입니다. 프로그래머는 배열을 전달한다고 믿고 있겠지만, 실제로는 배열의 첫번째 원소를 가리키는 주소값이 call by value 함수 내부의 매개변수로 복사됩니다.

    , C++에서는 참조 연산자 & 이용해서 배열을 직접 매개변수로 전달할 있습니다. 이게 바로 진정한 call by reference 입니다. 하지만 여전히, &연산자를 사용하지 않는 경우에는 배열을 매개변수로 직접 사용할 없습니다. 변환되는 과정이 자동으로 숨겨져서 이루어지기 때문에 프로그래머가 알아채기는 쉽지 않지만 말입니다.

    자바에서는 배열이 call by reference 전달됩니다. 정확히 말하자면 기본형이 아닌 타입의 함수 매개변수는 모두 call by reference 전달됩니다. 때문에 C/C++ Java 혼동하는 사람들이 위와 같이 잘못된 설명을 하는지 모르겠습니다만, 틀린 설명입니다.

    덧붙여 말하자면, C에서는 함수의 매개변수는 모조리 call by value 전달됩니다. 포인터를 이용한 전달 방식이 간접적인 방법 또는 흉내내기는 지언정, 그렇다고 call by reference 되는 것은 아닙니다. C++에서는 참조 연산자를 이용해서 call by reference 가능하지만요.

    교수님이 말씀하셨다고요..... 교수님들이 이런 세세한 부분에서는 종종 틀리는 경우를 많이 봅니다. 전공분야가 다르거나 폭넓게 공부하다 보니 그러시는 것이겠지요. 하지만 그렇다고 교수님 틀리셨네요 하고 가서 따지는 일은 하지 마시길 바랍니다. 교수님들은 건방진 학부생이 자기 틀린부분을 파고드는 것을 매우 기분나빠합니다. 이른바 찍히는 거지요. 편하게 학부생활 하시길 바랍니다. 시험 답안지에는 교수님이 설명하신 대로 쓰십시오.

    »

  •    

    뭔가 개념이 혼동되는 같은데요?

    글쓴이: xorule 작성 일시: , 2008/12/18 - 2:48오후

    Call-By-Reference / Call-By-Value 그렇게 어려운 개념이었나요?

    Call-By-Reference 주소를 함수의 인자로 사용한다

    Call-By-Value 값을 함수의 인자로 사용한다.

    위에 쓰신분은 나름의 철학을 가지고 있겠지만 내가 보았을때는 자신만의 독창적 세계관을 구축했다고 있겠군요..

    Call-By-Reference Call-By-Value function 목적상 구별해야 하는 개념일

    구현이 어떻게 되는가를 구별해야 하는 개념은 아닙니다.

    Program 어떤 목적을 위해 짜여지는 코드지 최적화 연구를 하기 위한 tool 아니기 때문에..

    language for program 개념이 아닌 program for language 목숨거는 위에분 말은 신경쓸 필요가 없어보입니다.

    이상

    »

  • 댓글 보기 옵션

    원하시는 댓글 전시 방법을 선택한 다음 "설정 저장" 누르셔서 적용하십시오.

+ Recent posts