728x90

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도 아닙니다. 따라서 질문자분이 원하는 답이 아닌것이죠. 섞어 쓰는게 맞습니다.

출처 : http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=140737196&qb=Q0FMTCBCWSBWQUxVRSBSRUZFUkVOQ0U=&enc=utf8&section=kin&rank=2&search_sort=0&spq=1&sp=1&pid=SbfOFwpySD8sstY1%2FAhsssssssC-509757&sid=VGSdnwpyVl8AABv15XI

728x90

'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

+ Recent posts