[출처] Java , C , C++에서의 Call by Value, Call By Reference | 작성자 착한 늑대

Java

동작은 크게 기본형(primitive types)과 참조형(reference types)에 따라서 구분할 수 있습니다. 기본형은 boolean, byte, int 등의 직접적으로 값을 갖는 데이터 형이고, 참조형은 클래스에서 생성된 인스턴스들과 배열(array)입니다.


자바에서 기본형은 무조건 Call by value로 동작합니다. 즉, 메소드 호출 시 복사된 값이 넘어갑니다. 그러나, 참조형의 경우에는 무조건 Call by ref로 동작합니다. 일단 클래스에서 인스턴스화된 객체가 메소드를 통해 전달될 경우에는 값이 복사되지 않고 인스턴스의 레퍼런스 정보가 전달되는 것입니다.


자바에서 레퍼런스 정보는 C/C++에서 처럼 단지 메모리 상에서의 객체의 주소만을 의미하지는 않습니다.


가비지 컬렉션을 위한 참조 카운터가 모든 레퍼런스에 함께 포함되어 있습니다. 최초 인스턴스 생성시 참조 카운터는 1로 설정됩니다. 만약 참조 카운터가 0이 되면 해당 인스턴스는 어떤 참조 변수에서도 참조하지 않고 있으므로 가비지 컬렉션 대상에 추가됩니다.

C

C의 경우에는 기본형(primitive types), 복합형(complex types - 구조체와 공용체), 주소형(addressing types)에 관계없이 무조건 값이 복사됩니다. C에서 Call by reference가 지원되는 것은 함수의 전달인자에 주소형이 사용되기 때문입니다. 이 경우도 기계적으로 보자면 주소 자체가 복사되는 것이므로 call by value로 볼 수 있으나, 의미적으로 call by reference로 동작하기 때문에 일반적으로 그냥 call by reference라고 부릅니다.


함수를 만들 때, 전달 인자에 전달될 데이터 형의 포인터 차원을 지정해 주지 않으면 어떤 경우에든 값이 직접 복사됩니다. (Call by value) 심지어, 구조체의 경우 구조체의 모든 멤버 변수들이 다 복사됩니다. 만약 구조체의 크기가 수 킬로바이트 정도로 크다면 끔찍한 일이 발생할겁니다. -_-;


요약하자면, C 언어에서의 함수 인자 전달은 원칙적으로 모두 call by value이지만, 포인터를 사용하여 의미적으로 call by reference를 지원할 수 있습니다.


C++

C++은 C와 다르게 참조형을 지원합니다. (C언어는 & (address-of) 연산자와 * (dereference; 역참조) 연산자를 통한 포인터 개념만을 지원합니다. 그러나 C++ 언어에서는 & 기호를 변수 선언시에 사용할 경우 해당 변수는 참조형 변수가 됩니다.)


C++의 참조형은 데이터 형이 기본형이든 복합형이든, 주소형이든 간에 변수 선언시에 & 기호를 사용하여 정의할 수 있습니다. 포인터 변수와의 차이점은 주어진 주소를 변경할 수 있느냐의 여부가 될것입니다. 참조형 변수를 한번 선언하게 되면 가리키고 있는 기억 장소에 대한 주소를 변경할 수 없습니다. 이것은 포인터 변수에 const 지정자를 사용한 것과 같은 효과를 갖습니다.


C++에서 함수(또는 클래스의 멤버 메소드) 간의 데이터 전달은 C와 기본적으로 같지만, 언어 차원에서 참조형을 지원한다는 것에 차이가 있습니다. C++에서의 참조형은 기본적으로 자바와 동일하게 동작합니다. 그러나 차이가 있다면, 자바에서는 기본형에 대한 참조를 가질 수 없는 데, C++에서는 기본형에 대해서도 참조를 사용할 수 있다는 점입니다. (자바에서 기본형에 대한 참조를 사용하려면 포장 클래스(wrapper class)를 이용하여 객체 인스턴스 단위로 다루어야만 합니다.)


정리하자면 C++의 경우에는 기본형, 복합형, 주소형 모두 기본적으로 call by value로 동작(기억장소의 복사)하며, 주소형은 의미적으로 call by reference가 됩니다. 그리고 참조형은 다루는 데이터의 형태에 상관없이 무조건 call by reference로 동작합니다.


(출처 : 'Call by Value, Call By Refference , Java , C , C++' - 네이버 지식iN)