미소를뿌리는감자의 코딩

call by reference, call by value 본문

강의수강/[자료구조|알고리즘]

call by reference, call by value

미뿌감 2024. 4. 4. 16:54
728x90

call by value와 call by reference는 인자를 전달해주는 방식에 차이를 두고 있습니다.

우선 call by value는 함수에 인자를 전달해 줄 때, 인자를 복사해서 전달해주는 방식을 의미합니다.

이에 메모리 또한 추가적으로 사용한다는 점이 있습니다.

하지만, 함수에서 값을 변경하더라도 원본에는 영향을 미치지 않기 때문에 상대적으로 안전하다고 할 수 있습니다.

 

반대로 call by reference는 함수에 인자를 전달해 줄 때, 참조값을 전달해주는 것을 의미합니다.

즉, 인자로 전달하고자 하는 변수의 주소값을 전달해주는 것을 의미합니다.

따로 메모리를 사용하여 변수를 할당하지 않아도 되기 때문에, 메모리를 추가적으로 사용하지 않아도 된다는 장점이 있습니다.

 

 

오랜만에 call by reference와 call by value에 대해서 되짚어 보기 위해서 C언어를 다시 살펴보았다.

 

C언어야 말로 call by reference를 잘 나타낸다고 생각한다.

https://programist.tistory.com/entry/C-%EC%96%B8%EC%96%B4-Call-by-Value%EA%B0%92%EC%97%90-%EC%9D%98%ED%95%9C-%ED%98%B8%EC%B6%9C-Call-by-Reference%EC%B0%B8%EC%A1%B0%EC%97%90-%EC%9D%98%ED%95%9C-%ED%98%B8%EC%B6%9C%EC%9D%98-%EC%9D%B4%ED%95%B4

 

C 언어 Call-by-Value(값에 의한 호출) & Call-by-Reference(참조에 의한 호출)의 이해

포인터를 학습하고 난 뒤, 첫번째로 겪게 되는 어려움 중 하나가 Call-by-Value(값에 의한 호출) & Call-by-Reference(참조에 의한 호출) 일 것이다. C++ 언어에서는 레퍼런스 혹은 참조자(&)라는 개념이 따

programist.tistory.com

이 분의 글을 참조해서 작성해보았다.

 

우선 call by value에 대한 예시를 살펴볼 것이다.

int swap(int, int)

int main()
{
  int a = 10;
  int b = 20;
  
  swap(a, b);
}

void swap(int a, int b)
{
  temp = a;
  a = b;
  b = temp;
}

 

해당 코드는 a값과 b값을 서로 바꾸기 위해서 짠 코드이지만, 실제로는 값이 바뀌지 않는다.

따로 메모리에서 할당을 하고, 따로 할당된 메모리에서 값을 바꾼 것이기 때문에, 실제 main에서 정의되고 있던 a와 b에는 값에 영향이 없다.

때로는 이런 부분에 있어서 call by value가 이점이 있다고 말한다.

 

다음으로 call by reference에 대한 예시를 살펴볼 것이다.

int swap(int *, int * );

int main() 
{
  int a = 10;
  int b = 20;
  
  swap(&a, &b);
}

void swap(int *a, int *b)
{
  int temp;
  
  temp = *a;
  *a = *b;
  *b = temp;
}

 

이 코드의 경우 간접 연산자, 포인터 (*)와

주소 연산자 &, ampersand 를 이용해서 call by reference로 함수에 값을 전달해준다.

 

swap(&a, &b) 는 각 변수의 주소값을 함수에 전달해 주기 때문에, 주소값을 받기 위해 포인터 변수로 받았음을 확인할 수 있다.

포인터 a와 b를 통해 실제 a와 b를 참조하여 값을 바꿔준다.

그렇게 때문에 확인해보면 실제 a와 b의 값이 바뀐 것을 확인할 수 있다.

 

728x90