Call By Reference

함수 호출 시 인자의 참조(주소)를 직접 전달하는 방식으로, 함수 내부에서 값을 변경하면 원본에도 영향을 줍니다.

핵심 구조

[Call By Value]
원본: a = 10
복사본: x = 10  ← 복사본만 변경, 원본 유지

[Call By Reference]
원본: a = 10
참조: x → a    ← x를 변경하면 원본 a도 변경

주요 특징

항목내용
전달 방식변수의 메모리 주소(참조) 전달
원본 영향O 함수 내 변경이 원본에 반영
메모리복사본 생성 없이 같은 공간 공유

C++ 예시 (Call By Reference 지원 언어)

void change(int &x) {  // & → 참조 전달
    x = 100;
}

int main() {
    int a = 10;
    change(a);
    cout << a;  // 100 → 원본 변경됨
}

Java는 Call By Reference가 없다

// Java는 참조형도 참조값(주소)을 복사하여 전달
// → 엄밀히 Call By Reference가 아님

public static void reassign(int[] arr) {
    arr = new int[]{100, 200}; // 복사된 주소를 바꾼 것
}

public static void main(String[] args) {
    int[] arr = {1, 2, 3};
    reassign(arr);
    System.out.println(arr[0]); // 1 → 원본 주소는 그대로
}

Call By Value vs Call By Reference

Call By ValueCall By Reference
전달값 복사주소 직접 전달
원본 영향XO
메모리별도 공간공유
지원 언어Java, Python 등C++, C#(ref) 등

Java는 Call By Reference처럼 보이는 경우가 있지만, 실제로는 참조값을 복사한 Call By Value입니다. 진정한 Call By Reference는 C++의 & 참조자처럼 변수 자체를 공유하는 방식입니다.

CSLOG에서 보기