면접 준비

Call by Value vs Call by Reference

꾸준함. 2020. 6. 12. 16:47

면접에서 아이스 브레이킹 차원으로 자주 나오는 문제였습니다.

 

면접 질문: Call by Value와 Call by Reference의 정의와 함께 장단점을 설명해주세요.

 

C, C++에서 함수는 두 가지 방법으로 호출될 수 있습니다.

 

1. Call by Value

2. Call by Reference

 

그리고 함수에 전달되는 매개변수를 실제 매개변수라고 부르고 함수가 전달받은 매개변수를 형식 매개변수라고 부릅니다.

Call by Value

  • 이 매개변수 전달 방법에서, 실제 매개변수의 값은 형식 매개변수에 복사되고 두 유형의 매개변수는 서로 다른 메모리에 저장됩니다.
  • 따라서 함수 내에서의 변경은 실제로 전달된 실제 매개변수에 반영되지 않습니다.

장점

  • 복사하여 처리하기 때문에 매개변수로 전달된 값이 보존이 되고 안전합니다.

단점

  • 복사를 하기 때문에 메모리 사용량이 늘어납니다.

 

C/C++ 예시

#include <stdio.h> 
  
void swap(int x, int y); 
  
int main() 
{ 
    int a = 10, b = 20; 
  
    swapx(a, b); 
  
    printf("a=%d b=%d\n", a, b); 
  
    return 0; 
} 

void swap(int x, int y) 
{ 
    int temp; 
  
    temp = x; 
    x = y; 
    y = temp;
    
    printf("x=%d y=%d\n", x, y); 
} 

출력값

x=20 y=10
a=10 b=20

 

Call by Reference

  • 실제 매개변수와 형식 매개변수 모두 동일한 메모리를 참조하므로 함수 내에서 변경한 내용이 실제로 전달된 실제 매개변수에 반영됩니다.

장점

  • 복사하지 않고 직접 참조를 하기 때문에 실행속도가 빠릅니다.

단점

  • 장점이자 단점인데 직접 참조를 하기 때문에 원래의 값이 영향을 받습니다.

 

C언어 예시

#include <stdio.h> 
  
void swap(int*, int*); 
  
int main() 
{ 
    int a = 10, b = 20; 
  
    swapx(&a, &b); 
  
    printf("a=%d b=%d\n", a, b); 
  
    return 0; 
} 
  
void swap(int* x, int* y) 
{ 
    int temp;
  
    temp = *x; 
    *x = *y; 
    *y = temp; 
  
    printf("x=%d y=%d\n", *x, *y); 
} 

출력값

x=20 y=10
a=20 b=10

 

C++ 예시

#include <iostream>
using namespace std;
  
void swap(int &, int &); 
  
int main() 
{ 
    int a = 10, b = 20; 
  
    swapx(&a, &b); 
  
    printf("a=%d b=%d\n", a, b); 
  
    return 0; 
} 
  
void swap(int &x, int &y) 
{ 
    int temp = x; 
    x = y; 
    y = temp; 
  
    printf("x=%d y=%d\n", x, y); 
} 

출력값

x=20 y=10
a=20 b=10

 

표로 정리하자면 아래와 같습니다.

Call by ValueCall by Reference
함수를 호출할 때, 변수의 값을 전달합니다.함수를 호출할 때, 변수의 값을 전달하는 대신,
변수의 메모리 주소를 전달합니다.
함수로 전달된 매개변수 값이 함수의
dummy 변수에 복사됩니다.
함수로 전달된 매개변수의 주소가 함수의
dummy 변수에 복사됩니다.
함수 내 dummy 변수에 대한 변경은
함수로 전달된 매개변수의 값에 영향을 미치지 않습니다.
주소를 사용하면 함수로 전달된 매개변수에
접근할 수 있고 따라서 함수 내 변경이 반영됩니다.

 

* Java 의 경우 항상 call by value 입니다. 자바는 객체를 메서드로 넘길 때 참조하는 지역변수의 실제 주소를 넘기는 것이 아니라 그 지역변수가 가리키고 있는 힙 영역의 객체를 가리키는 새로운 지역변수를 생성하여 그것을 통하여 같은 객체를 가리키도록 하는 방식입니다.
call by value는 메모리의 저장값, call by reference 는 메모리의 주소값을 보내는데 java 의 경우 인자값을 받아서 해당값을 변경하더라도 호출했던 class 내에서의 객체가 변경되지는 않습니다.

* Python의 경우 mutable, immutable 객체에 대해 모두 Call by Assignment 형식입니다. 

 

[출처]

https://www.geeksforgeeks.org/difference-between-call-by-value-and-call-by-reference/

https://www.geeksforgeeks.org/g-fact-31-java-is-strictly-pass-by-value/

반응형