reference:
"명품 C++ Programming" / 황기태
"전문가를 위한 C++" / 마크 그레고리
1) 값에 의한 호출(call by value)
호출하는 코드에서 넘겨주는 실인자 값이 함수의 매개 변수에 복사되어 전달하는 방식.
- 함수 내에서 실인자를 손상시킬 수 없는 장점이 있다. 그러므로 함수 호출에 따른 부작용이 없다.
- 값에 의한 호출 시 매개변수가 객체 타입이라면 "복사(복제) 생성자"가 호출된다. 컴파일러는 클래스에 복사 생성자가 작성되어 있지 않는 경우, 실인자 객체의 멤버 변수를 1:1로 매개변수 객체에 복사하는 디폴트 복사(복제) 생성자를 자동으로 삽입한다.
컴파일러가 생성한 이 디폴트 복사 생성자는 데이터 멤버가 기본 타입이라면 똑같이 복사하고, 객체 타입이라면 그 객체의 복제 생성자를 호출한다.
디폴트 복사 생성자를 통해 객체 복사가 이루어지면 얕은 복사가 일어날 수 있다(객체 멤버에 포인터 변수가 있을 시). 따라서 복사 생성자를 직접 작성하여 깊은 복사를 유도할 수 있다.
얕은 복사 vs 깊은 복사
- 얕은 복사: 멤버 변수에 포인터 변수가 있다면 복사 과정에서 포인터 주소를 그대로 복사하게 됨. 이에 따라 복사된 객체와 함께 같은 메모리 공간을 공유하게 되는 문제가 발생한다.
- 깊은 복사: 별개의 메모리 공간을 할당받고, 그 공간에 값만 복사한다.

2) 주소에 의한 호출(call by address)
주소를 직접 포인터 타입의 매개변수에 전달하는 방식. 함수 호출 시 배열이 전달되는 경우, 배열의 이름(배열의 이름은 '포인터 상수')이 전달되므로 자연스럽게 '주소에 의한 호출'이 일어난다.
- 실인자의 주소를 넘겨주어 의도적으로 함수 내에서 실인자의 값을 변경하고자 할 때 사용된다.
- 값에 의한 호출에 비해 원본 객체를 복사하는 시간 소모가 없다.
- 참조에 의한 호출(call by reference)
c++에서는 이들 외에 참조에 의한 호출이 추가된다.
아래 설명..
참조(reference)
c++에서 참조는 다음과 같이 활용된다.
- 참조 변수
- 참조에 의한 호출
- 함수의 참조 리턴
참조 변수
참조 변수는 이미 선언된 변수(원본 변수)에 대한 별명으로서, 참조자(&)를 이용하여 선언하며, 선언 시 반드시 원본 변수로 초기화 해야한다.
3) 참조에 의한 호출
c++에서 참조는 '참조에 의한 호출'에서 많이 사용된다.
함수의 매개변수를 참조 타입으로 선언하여 실인자와 공간을 공유하도록 하는 인자 전달 방식이다. 참조 타입으로 선언된 함수의 매개변수를 참조 매개변수라 한다.
참조 매개변수라는 이름만 존재하며 스택에 공간을 할당받지 않는다.
참조에 의한 호출의 장점
- 주소에 의한 호출은 포인터 타입으로 매개변수를 선언하므로, 호출하는 쪽에서 주소를 전달하기 위해 &(엠퍼센드 주소 연산자)를 사용해야 하고, 함수의 코드에서는 *(참조연산자)를 반복적으로 사용함에 따라, 실수의 가능성과 가독성이 떨어진다는 단점이 있다.
그러나 참조 매개변수를 사용하면 간단히 변수를 넘겨주기만 하면되고, 함수 내에서도 참조 매개변수를 보통 변수처럼 사용하기에 작성하기 쉽고, 가독성이 좋게 된다.