ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C/C++] 함수의 호출 방식 - Call by what?
    Language/C, C++ 2019. 6. 7. 02:17

    프로그램에서 함수를 호출할 때 매개변수(Parameter)의 종류에 따라 호출 방식을 분류할 수 있습니다.

    C언어와 C++에서 사용하는 함수 호출 방식은 다음과 같습니다.

     

    이 중 Call by Reference(참조에 의한 호출)는 C언어에는 존재하지 않습니다.

    Call by Reference는 C++에서 참조(Reference) 개념이 도입된 이후부터 가능하게 되었습니다.

     

    코드를 통해 각 호출 방식의 차이점을 알아보겠습니다.

     


    Call by Value

    Call by Value는 에 의한 호출로서, 함수가 매개 변수를 전달받을 때 을 전달받는 개념입니다.

    void plus(int a) {
    	a++; // 새로운 변수 a에 ++연산
    }
    
    int main() {
    	int a = 10;
    	plus(a); // 함수 호출
    
    	return 0;
    }

    다음과 같이 함수 plus에 매개변수로 int a를 전달하면, 함수 plus는 새로운 변수 공간을 만들어 전달받은 값 10을 복사합니다.

    그리고 값 10이 복사된 새로운 변수 a에 ++ 연산을 수행합니다.

     

    plus 함수에서 새로운 변수를 생성했기 때문에 main 함수의 a와 plus 함수의 a는 만 같을 뿐, 다른 변수입니다.

    따라서 함수의 호출 이후, 실인자 a의 값은 변하지 않습니다.

     

    Call by Address

    그렇다면 함수를 호출한 영역의 인자, 즉 실인자(actual parameter)를 외부 함수에서 제어할 수는 없을까요?

     

    값에 의한 호출이 아닌 주소에 의한 호출(Call by Address)을 사용하면 가능합니다.

    void plus(int *a) { // 포인터로 전달 받음
    	(*a)++;
    }
    
    int main() {
    	int a = 10;
    	plus(&a); // 주소를 전달
    
    	return 0;
    }

    위의 코드처럼 함수의 매개변수에 주소를 전달하는 방식이 바로 Call by Address입니다.

    주소를 전달받기 때문에 받는 쪽은 포인터로 받아야 합니다.

     

    여기서 한 가지 주의할 점은 Call by Address 또한 Call by Value와 동작 방식이 같다는 점입니다.

     

    호출 측에서 주소 값을 전달하면 함수 영역에서는 새로운 포인터 변수를 생성하여 넘겨받은 주소를 복사합니다.

    즉, 실인자의 주소를 알고 있기 때문에 외부 영역에서 실인자에 접근이 가능한 것입니다.

     

    Call by Reference

    Call by Reference(참조에 의한 호출)는 C++에 참조 개념이 도입되면서 사용 가능해진 방식입니다.

    void plus(int &a) { // 참조 매개변수
    	a++;
    }
    
    int main() {
    	int a = 10;
    	plus(a); // Call by Value 처럼 사용
    
    	return 0;
    }

    받을 때 & 연산자를 사용함으로써 실인자의 참조를 전달받습니다.

    이 방식 역시 함수에서 실인자의 주소를 알고 있기 때문에 실인자의 값을 변경할 수 있습니다.

     

    결과는 Call by Address와 동일하지만 상대적으로 실수할 가능성이 적고 가독성에도 유리합니다.

     

     

    'Language > C, C++' 카테고리의 다른 글

    [C++] 얕은 복사(shallow copy) vs 깊은 복사(deep copy)  (0) 2019.07.04

    댓글