call-by-value와 call-by-reference를 모르셔서 하는 말인거 같내요.
우선 call-by-value는 값에 의한 호출이라 합니다. 말은 그럴싸한데 한번 풀어보죠.
void main()
{
int num = 0;
}
현재 int num이라는 정수형 변수와 값을 0으로 초기화 했습니다. 그런데 우리가 하고 싶은 것은 num을 함수의 인자로 넘겨서 num의 값을 변경하고 싶은것입니다. 그럼 일단 한번 해보죠.
void Increment(int num)
{
num = num+1;
}
void main()
{
int num = 0;
Increment(num); // Increment함수를 호출하는데 함수의 인자로 main함수의 num을 넘겨줍니다.
printf("%d\n", num);
}
여기에서 Increment함수를 호출하는데 Increment함수는 함수의 인자로 받은 값을 +1을 해줍니다.
과연 main함수에서 num값을 출력하면 1이 나올까요? 실행해보면 알겠지만 0이 나옵니다. 왜냐하면 현재 Increment(int num)은 값에 의한 호출이기 때문이죠. 무슨말이냐 Increment(num)이라고 해서 함수를 호출하면 Increment(int num) 의 인자로 main함수의 num의 값인 0이 복사가 되어집니다. 그래서
void Increment(int num)
{
num = num + 1; //여기에서는 Increment함수안에서만 유요한 int num이라는 지역변수가 생성이 되고 그 지역변수에 값을 1로 바꾼후에 Increment함수가 종료가 되면 지역변수 num도 사라지게 되고 함수가 끝이 납니다.
}
이게 바로 call-by-value입니다. 왜냐하면 값을 복사를 했기 때문이죠. 그렇다면 우리가 정말로 원하는 Increment함수를 호출해서 main함수의 int num값이 바뀌도록 하려면 어떻게 해야 할까요?
void Increment(int * num)
{
*num = *num + 1;
}
void main()
{
int num = 0;
Increment(&num);
printf("%d\n", num);
}
이렇게 함수의 인자를 포인터로 받게 하여 main함수의 변수를 참조하도록 만들면됩니다. 이게 바로 call-by-reference입니다. 그런데 이전 문제에서 학생성적들에 관련된걸 제가 call-by-reference와 call-by-value를 섞어서 답을 해드렸습니다. 이유는 바로 call-by-reference가 필요한곳이 있고 필요하지 않은 곳의 차이점을 알려드리기 위해서입니다. 이걸 완전히 다 call-by-value로 바꿀순 없습니다. 하지만 완전히 다 call-by-reference로는 바꿀수있죠. 이유는 위에서처럼 main함수의 변수를 다른 함수의 인자로 호출후 돌아왔을 때 그 값이 변해야 되는데 그럴려면 call-by-reference가 필요하기 때문이죠. 따라서 따로 따로 하는것은 불가능합니다. 혹시나 전역변수로 다 두고 call-by-value로 할 수 있냐라고 생각할수도 있겠지만 그것은 call-by-value가 아니라 그냥 인자가 없는 일반적인 함수 호출입니다. 즉 예를 들면 이렇게 할 수 있죠.
int num = 0;
void Increment()
{
num = num+1;
}
void main()
{
Increment();
printf("%d\n", num);
}
이렇게 전역변수를 두고 하는데 이것은 call-by-value도 아니며 call-by-refence도 아닙니다. 따라서 질문자분이 원하는 답이 아닌것이죠. 섞어 쓰는게 맞습니다.
'Algorithm' 카테고리의 다른 글
STABLE SORT (0) | 2014.11.13 |
---|---|
STL 벡터 리스트 (0) | 2014.11.13 |
STL이란 (0) | 2014.11.13 |
round off, truncation error (0) | 2014.10.29 |
정렬 시간복잡도 (0) | 2014.10.17 |