CS 면접에서 자주 나오는 개념이다.

위 두 가지는 함수 호출 방식의 차이점을 이해하는데 핵심적인 역할을 한다.

**본문에서는 가독성을 위해 Call by Value = CbV, Call by Reference = CbR 이라고 지칭하겠습니다.

 

Call by Value와 Call by Reference란?

프로그램에서 함수를 호출할 때, 인자를 전달하는 방식에는 'Call by Value(값에 의한 호출)'와 'Call by Reference(참조에 의한 호출)' 두 가지가 있다. 이 두 방식은 함수가 인자를 처리하는 방법에 있어서 근본적인 차이가 있다.

 

Call by Value (값에 의한 호출)

Call by Value는 함수가 호출될 때 실제 인자의 값이 복사되어 함수의 매개변수로 전달되는 방식이다.

이는 인자의 원래 값이 아닌, 그 값의 복사본을 사용하기 때문에 함수 내에서 매개변수의 값이 변경되더라도 원래의 인자에는 아무런 영향을 미치지 않는다.

 

C언어 (CbV)

#include <stdio.h>

void modifyValue(int x) {
    x = 20;
    printf("Inside function: x = %d\n", x);
}

int main() {
    int a = 10;
    modifyValue(a);
    printf("After function call: a = %d\n", a);
    return 0;
}
//출력 결과
Inside function: x = 20
After function call: a = 10

C++ (CbV)

#include <iostream>
using namespace std;

void modifyValue(int x) {
    x = 20;
    cout << "Inside function: x = " << x << endl;
}

int main() {
    int a = 10;
    modifyValue(a);
    cout << "After function call: a = " << a << endl;
    return 0;
}
//출력 결과
Inside function: x = 20
After function call: a = 10

Java (CbV)

public class Main {
    public static void modifyValue(int x) {
        x = 20;
        System.out.println("Inside function: x = " + x);
    }

    public static void main(String[] args) {
        int a = 10;
        modifyValue(a);
        System.out.println("After function call: a = " + a);
    }
}
Inside function: x = 20
After function call: a = 10

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

Call by Reference는 함수가 호출될 때 인자의 참조가 전달되는 방식이다

즉, 함수는 인자의 주소를 전달받아 그 주소를 통해 원래 데이터에 접근하고 변경할 수 있다.

따라서 함수 내에서 매개변수의 값을 변경하면 원래의 인자도 영향을 받게 된다.

 

C언어 (CbR)

#include <stdio.h>

void modifyValue(int *x) {
    *x = 20;
    printf("Inside function: x = %d\n", *x);
}

int main() {
    int a = 10;
    modifyValue(&a);
    printf("After function call: a = %d\n", a);
    return 0;
}
//출력 결과
Inside function: x = 20
After function call: a = 20

C++ (CbR)

#include <iostream>
using namespace std;

void modifyValue(int &x) {
    x = 20;
    cout << "Inside function: x = " << x << endl;
}

int main() {
    int a = 10;
    modifyValue(a);
    cout << "After function call: a = " << a << endl;
    return 0;
}
//출력 결과
Inside function: x = 20
After function call: a = 20

Java (CbR)

class Number {
    int value;
}

public class Main {
    public static void modifyValue(Number num) {
        num.value = 20;
        System.out.println("Inside function: num.value = " + num.value);
    }

    public static void main(String[] args) {
        Number a = new Number();
        a.value = 10;
        modifyValue(a);
        System.out.println("After function call: a.value = " + a.value);
    }
}
Inside function: num.value = 20
After function call: a.value = 20

CbV vs CbR 비교

  • 복사 vs 참조: Call by Value는 인자의 값을 복사하여 전달하고, Call by Reference는 인자의 주소를 전달
  • 원본 데이터 변경: Call by Value에서는 함수 내에서 인자의 복사본을 변경하므로 원본 데이터는 변경되지 않지만, Call by Reference에서는 원본 데이터를 직접 변경 가능
  • 안정성: Call by Value는 원본 데이터가 보호되므로 안전합니다. Call by Reference는 직접 데이터에 접근하므로 주의가 필요

언어별 요약

  • C/C++: 기본적으로 Call by Value를 사용하지만, 포인터를 이용하여 Call by Reference를 구현할 수 있다.
  • Java: 모든 원시 타입(primitive type)은 Call by Value로 전달되고, 객체 참조 타입(object reference type)은 Call by Reference처럼 동작하지만 실제로는 참조 값이 Call by Value로 전달된다.

반응형