Search
📁

call-by-value, call-by-reference 쌍둥이세요?

call-by-value, call-by-reference

Call-by-valueCall-by-reference는 함수나 메서드에 인자를 전달하는 두 가지 기본적인 방식이다.

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

함수에 인자를 전달할 때, 인자의 실제 값을 복사하여 함수의 매개변수에 할당한다.
함수 내부에서 매개변수의 값을 변경해도, 원본 인자의 값에는 영향을 미치지 않는다.
void addTen(int number) { number += 10; } int x = 5; addTen(x); // 여기서 x의 값은 여전히 5이다.
Java
복사
x의 값이 addTen 함수에 복사되어 전달되므로, 함수 내부에서 number 값을 변경해도 x의 값에는 영향을 주지 않는다.

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

함수에 인자를 전달할 때, 인자의 메모리 주소를 전달한다.
이 때문에 함수 내에서 매개변수의 값을 변경하면, 그 변경사항이 원본 인자에도 반영된다.
myArray의 메모리 주소가 updateArray 함수에 전달되므로, 함수 내에서 배열의 첫 번째 요소를 변경하면 원본 배열에도 그 변경사항이 적용된다.
void updateArray(int[] arr) { arr[0] = 10; } int[] myArray = {1, 2, 3}; updateArray(myArray); // myArray[0]은 이제 10이다.
Java
복사

주의할 점

언어에 따라서 call-by-valuecall-by-reference를 구현하는 방식이 다를 수 있다.
예를 들어, 자바는 기본적으로 모든 인자를 call-by-value로 전달한다.
하지만 객체의 경우, 객체의 참조(메모리 주소)를 값으로 복사해서 전달하기 때문에, call-by-reference처럼 작동하는 것처럼 보일 수 있다. 실제로는 객체 참조의 복사본을 전달하는 것이므로, 정확히는 call-by-value의 한 형태라고 볼 수 있다.
이러한 차이를 이해하는 것은 함수나 메서드를 통해 데이터를 조작할 때 중요하다. 값에 의한 호출은 데이터를 보호할 수 있지만, 참조에 의한 호출은 보다 효율적인 데이터 처리를 가능하게 할 수 있다.