//=========================================
6. C 언어에서 함수 호출 시 매개변수 전달 방법에는 값에 의한 호출(call by value)과 참조에 의한 호출(call by reference)이 있다. C 프로그램 코드가 다음과 같을 때 설명으로 옳지 않은 것은? [22년 국가 9급]
-------------------------------------------
int get_average(int score[], int n) {
int i, sum;
for(i = 0; i < n; i++) sum += score[i];
return sum / n;
}
void main(void) {
int score[3] = { 1, 2, 5 };
printf(“%d\n”, get_average(score, 3));
}
-------------------------------------------
① 전달할 데이터의 양이 많을 경우에는 참조에 의한 호출이 효율적이다.
② 값에 의한 호출로 전달된 데이터는 호출된 함수에서 값을 변경하더라도 함수 종료 후 해당 함수를 호출한 상위 함수에 반영되지 않는다.
③ 값에 의한 호출은 함수 호출 시 데이터 복사가 발생한다.
④ 위의 프로그램에서 함수 get_average()를 호출하는 데 사용한 매개변수 score는 값에 의한 호출로 처리된다.
//=========================================
매개변수 전달에서
겂(r-value)을 전달하면 값에 의한 호출(call by value)이 되고
주소(l-value)를 전달하면 무조건 참조에 의한 호출(call by reference)인가?
매개변수 전달에서 핵심은 다음 2가지 입니다.
1. 함수 사이에 기억공간을 공유하느냐? 공유하지 않느냐?
2. 부작용이 발생하느냐? 발생하지 않느냐?
값에 의한 호출은 함수 사이에 매개변수 기억공간을 공유하지 않고, 별도의 기억공간을 확보한다.
참조에 의한 호출은 함수 사이에 매개변수 기억공간을 공유한다.
여기서, C 언어에서 매개변수 전달 방식은 무엇인가?
매개변수 전달이 포인터가 아닌 일반변수이면, 당연 값에 의한 호출이다.
그러면, C 언어에서 포인터(주소)를 전달하면 어떻게 되는가?
주소가 전달되지만, 함수 사이에 매개변수 기억공간을 공유하지 않고, 별도의 기억공간을 확보한다.
즉, C 언어에서 포인터를 전달하면 값에 의한 호출과 참조에 의한 호출이라는 2가지 특징을 다 가진다.
그렇다면, 이런 내용이 시험에 출제되었을 때 둘 중에 하나를 선택해야 한다면
C 언어에서 포인터를 전달하면 값에 의한 호출과 참조에 의한 호출 중에서 답을 무엇이라고 해야 하느냐?
지금까지 이 내용에 대한 과거 시험 역사에서 많은 논란이 되었을 뿐이다.
만약, 이 문제에 대해서 이의신청을 한다면
1. 유명한 교재 Aho, Sethi, Ullman의 "컴파일러" 530쪽에 다음처럼 기술되어 있다.
문제에서 주어진 프로그램과 유사한 프로그램에 대해
값에 의해 호출된 프로시저에서 포인터를 사용한 프로그램
즉, 포인터를 전달하지만 값에 의해 호출이라는 것이다.
2. 프로그래밍언어론에서 유명한 교재인 Sebesta 교재에는 다음처럼 되어 있다.
C는 값-전달을 사용한다.
결론
매개변수 전달 방법은 5가지가 있다.
각종 언어에서 매개변수 전달은 5가지 중에서 단순하게 오직 하나를 사용하는 것은 드물다.
만약 시험 출제에서 논란을 발생시키지 않으려면 단순하게 오직 하나를 사용하는 것은 제시해야 한다.
그런데 주어진 문제는 논란을 발생시키는 C 언어를 제시하여 질의한 것이다.
추가로 적으면
매개변수 전달 문제가 다른 시험에서 출제되면 위에 적은 내용을 잘 고려하여 최적의 답을 선택해야 한다.
또 다른 시험을 위해 정리하는 관점에서 적었습니다.
아무튼
이 문제는 이의신청을 해도 받아 들여지지 않을 가능성이 높습니다.
틀린 분이 있다면, 참고하시기 바랍니다.
첫댓글 일단 저도 선생님 말씀에 감히 첨언을 해보자면, 애초에 문제 자체에 오류가 있다고 보는게 맞는거 같습니다. C++은 몰라도 C언어 자체는 사실 공식적으로 Call by Reference를 지원하는 것이 아님에도 불구하고 Call by Value와 Call by Reference가 있다고 문제에서 단정을 지어버렸으니까요. 다만 저런 식으로 구현을 한다고 문제에서 처음부터 단정을 지어버린 상태에서라면(= 분명 Call by Value지만 주소값을 넘겨 Call by Reference로 구현하는 식으로 '순수한 Call by Value'와 구분을 짓는다면) 답이 4번밖에 성립하지 않는지라 이의신청 여부는 저도 선생님 말씀처럼 애매하다고 생각합니다.
선생님 글과 댓글에서 전혀 몰랐던 부분 배워갑니다 감사합니다!
번거롭게 질문드려 먼저 죄송합니다. 이의신청 기간이 지나 의미가 없을 수 있는 얘기지만 말씀해주신 컴파일러 책 해당 페이지가 맞는지 알 수 있을까요?? 도서관에서 해당 책을 보고 있는데 말씀해주신 페이지에 기술되어 있는 것이 없어서 그렇습니다. 2009년 개정2판 기준인가요??