본문 바로가기
Computer Science

[C언어] call-by-reference vs call-by-value

by DuncanKim 2022. 7. 4.
728x90

[C언어] call-by-reference vs call-by-value

 

 

정말 배우면 배울 수록 멱살을 잡고 흔들어 재끼고 싶은 C언어.

포인터 변수 / 포인터 상수 / 상수 포인터 등등등 무슨 비슷한 말은 많고 뜻은 전혀 다르고 처음들어보고...

하지만 살살살 알아가는 것이 공부의 재미 아니겠나...

 

이번 포스팅은 저번에 scanf를 다루다가 알게된 call-by 시리즈에 대해 알아보고자 한다.

 

 

✏️ call by value는 값에 의한 호출이라고 하며, ‘인자’로 받은 값을 ‘복사’하여 처리한다.
✏️ call by reference는 참조에 의한 호출이며, ‘인자’로 받은 값의 주소를 참조하여 직접 값에 영향을 준다.

 

그림으로 쉽게 보는 두 가지 개념

 

 

 

Call by value(값에 의한 호출)

실제 인자의 복사본이 각각 형식적인 인자로 전달되어 실제 인자의 값은 변하지 않는다.

대부분의 C 계열 프로그래밍 언어에서 기본 기능으로 사용된다.

 

  • 장점 : 복사하여 처리하기 때문에 안전하다. 원래의 값이 보존이 된다.
  • 단점 : 복사를 하기 때문에 메모리가 사용량이 늘어난다.
<value>
#include <stdio.h>

void swap(int num1, int num2)
{
    int temp = num1; // 새롭게 생성된 변수의 값만 바꾼다.
    num1 = num2;
    num2 = temp;
}
void main()
{
    int a = 20, b = 60;
    swap(a, b);
    printf("a: %d, b: %d", a, b);
}

 

 

Call by reference(참조에 의한 호출)

실제 인자의 위치/주소가 형식적인 인자로 전달되어 실제 인자의 값이 변한다.

형식적인 인자로 실제 인자의 주소가 전달되면 형식적인 인자에서 뜻하지 않게 변화가 발생할 수 있다. 주의해야 한다.

대부분의 언어에서 지원되지만, 기본적으로 사용되지는 않는다.

 

  • 장점 : 복사하지 않고 직접 참조를 하기에 빠르다.
  • 단점 : 직접 참조를 하기에 원래 값이 영향을 받는다.(리스크)
<reference>
#include <stdio.h>

void swap(int &num1, int &num2)
{
    int temp = num1; // 주소값을 바꿔버린다.
    num1 = num2;
    num2 = temp;
}
void main()
{
    int a = 20, b = 60;
    swap(a, b);
    printf("a: %d, b: %d", a, b);
}

 

 

 

728x90

댓글