Call by value와 reference 이해하기

Kang Chang Hwan·2024년 5월 14일

Computer Science

목록 보기
1/5
post-thumbnail
#include <stdio.h>

void add(int a, int b) 
{
  a = a + 1;
  b = b - 1;
}

int main() 
{
  int x = 1;
  int y = 2;
  add(x, y);
  
  printf("x: %i\n", x);
  printf("y: %i\n", y);
  
  return 0;
}

위 코드를 실행하면 x와 y에는 어떤 숫자가 들어있을까?

이번 포스팅은 함수의 인자에 값을 전달하는 방식인 Call by value와 Call by Reference에 대해서 다뤄보려고 한다.

개념 이해하기

Call by value란?

함수 인자에 값을 전달하는 방식으로 함수 인자에 전달된 값은 함수가 메모리 Stack 영역에서 실행될 때 복사된 값(인자)으로 계산하게 되고 함수 실행이 끝나는 순간 stack에서 pop되므로 실제 메모리 location에 저장된 값이 바뀌지 않게 된다.

따라서 다음 코드의 출력 결과를 살펴보면

#include <stdio.h>

void add(int a, int b) 
{
  a = a + 1;
  b = b - 1;
}

int main() 
{
  int x = 1;
  int y = 2;
  add(x, y);
  
  printf("x: %i\n", x);
  printf("y: %i\n", y);
  
  return 0;
}

Call by value 실행 결과

x(1)와 y(2)의 값을 넘겨 +1, -1 연산 결과인 2, 0이 출력이 되는 것이 아니라 원래 값인 1, 2가 그대로 출력되는 것을 볼 수 있다.

Call by Reference란?

#include <stdio.h>

void add(int *a, int *b) 
{
  (*a) = (*a) + 1;
  (*b) = (*b) - 1;
}

int main() 
{
  int x = 1;
  int y = 2;
  add(&x, &y);
  
  printf("x: %i\n", x);
  printf("y: %i\n", y);
  
  return 0;
}

Call by Value에서 봤던 코드에서 위처럼 변경하게 될 시 x, y를 출력해보면 어떤 값이 나올까요?

출력 결과

위와는 어떤 차이가 있길래 다른 결과가 나타난 걸까?

void add(int *a, int *b)

함수의 인자는 a, b로 포인터 변수 즉, 값이 저장된 memory location의 address를 값으로 받고 있다.

add(&x, &y);

이렇게 포인터 변수 a에는 변수 x에 저장되어 있는 1의 주소인 0x01이 전달되고 b에는 0x02가 할당된다.

(*a) = (*a) + 1;
(*b) = (*b) - 1;

따라서 해당 변수에 저장되어 있는 주소를 참조하여 물리적인 위치에 있는 값을 변경하게 되므로 메모리 Stack에서 add함수의 실행이 끝나면서 pop되도 실제 메모리 location의 값이 수정되게 되는 것이다.

Call by Value, Call by Reference 언제 사용할까?

각 approach마다 장단점이 있으므로 이를 염두에 두고 case별로 사용하면 된다.

Call by value

  • 장점
    • 원본 데이터를 보호할 수 있음.
  • 단점
    • 대량의 데이터를 복사한다고 생각해보면 성능 저하의 원인이 될 수 있음.

Call by Reference

  • 장점
    • 대량의 데이터를 효율적으로 처리할 수 있음.
  • 단점
    • 원본 데이터를 조작할 수 있는
profile
아쉬움 없이 살자. 모든 순간을 100%로!

2개의 댓글

comment-user-thumbnail
2024년 5월 29일

덕분에 Call by value와 Call by reference 차이를 바로 이해했습니당😊 좋은 글 감사합니다 !

1개의 답글