[ 프로그래밍 기초 ] 값에 의한 참조 (Call by Value), 주소에 의한 참조 (Call by Reference)

THIST·2024년 7월 17일

오늘은 프로그래밍을 배우는 분들이라면 꼭 알아두어야 할 중요한 개념인
"Call by Value(값에 의한 호출)"와 "Call by Reference(참조에 의한 호출)"에 대해 설명해 보고자 한다.

이 두 개념은 함수나 메서드 호출 시 인수(argument)가 어떻게 전달되는지를 이해하는 데 매우 중요한 역할을 하기에, 꼭 짚고 넘어가보자.

이전에 C언어 공부를 했던 사람이라면 들어봤을법한 내용이다.

  • Call by Value
  • Call by Reference

혹시 두 함수의 호출방식에 대해서 기억하고 있는가?

Call by Value(값에 의한 호출)값을 인자로 전달하는 함수 호출방식이며,
Call by Reference(주소에 의한 호출)주소를 인자로 전달하는 함수 호출방식이다.

이 차이를 알기 위해, 단순히 Swap하는 예제를 통해 알아보도록 하자.

사용언어: C++

// 값에 의한 참조 ( Call by Value )

int main(void) {
    int num1 = 10;
    int num2 = 20;

    cout << " 변경 전 결과: " << num1 << ' ' << num2 << endl;
    Swap(num1, num2);
    cout << " 변경 후 결과: " << num1 << ' ' << num2 << endl;

    return 0;
}

void Swap(int Val1, int Val2) {
    int Temp;

    Temp = Val1;
    Val1 = Temp;
    Temp = Val2;

    return;
}

num1에 10을, num2에 20을 넣고 Swap함수를 통해 인자 두개를 전달한 다음, Print했을 때,
결과가 어떻게 나올까?

값이 바뀌지 않았다.

왜 그럴까?

이는 Swap함수에서 매개변수들이 num1과 num2의 인자값들만 받았기 때문이다.

따라서 매개변수 Val1과 Val2는 함수외부에 선언된 변수의 접근이 불가능하다.

결국, 다음과 같이 함수를 정의하면 Swap을 할 수 없게된다.

그러면 어떻게 하면 함수외부에 있는 값들에 대해 접근할 수 있을까?

바로 주소를 전달해서 바꾸는 방법이다.

그것이 곧 Call by Reference(주소에 의한 참조)이다.

※ 이 내용은 포인터(Pointer)에 대한 선행을 필요로 합니다.

// 주소에 의한 참조 ( Call by Reference )

int main(void) {
    int num1 = 10;
    int num2 = 20;

    cout << " 변경 전 결과: " << num1 << ' ' << num2 << endl;
    Swap(&num1, &num2);
    cout << " 변경 후 결과: " << num1 << ' ' << num2 << endl;
    
    return 0;
}

void Swap(int* Val1, int* Val2) {
    int temp;

    temp = *Val1;
    *Val1 = *Val2;
    *Val2 = temp;
    
    return;
}

실행결과는 다음과 같다.

방금 전 예제와 달리, 값이 바뀌었다는 것을 우리눈으로 확인할 수가 있다.

이는,

포인터 변수 Val1과 Val2에 num1과 num2의 주소값을 받았기 때문이다.

그리고, 임시변수 temp를 활용해 주소에 "참조된 값만 바꾸는 형태"로 Swap이 진행되었다.

값만 바뀌었을 뿐, 둘의 주소는 바뀌지 않았다! ( 매우 중요! )


정리하자면 다음과 같다.

값에 의한 호출 (Call-by-value)

  • 인자의 값이 함수에 전달된다.
  • 함수 내부에서 인자를 변경해도 원래 변수에는 영향을 미치지 않는다.

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

  • 인자의 값이 들어있는 주소가 함수에 전달된다.
  • 함수 내부에서 인자를 변경하면 원래 변수도 변경된다.
profile
하고 싶은 개발을 지향하는 삶을 추구합니다:D

0개의 댓글