C++의 매개변수 전달방식에는 call-by-value와 call-by-reference 방식이 있다.
call-by-value
call-by-value 매개변수 방식은 값에 의한 호출 값을 전달하는 방식이다.
기본적으로 앞에 아무것도 붙이지 않고 사용하면 call-by-value가 된다.
call-by-value는 a의 값을 val에 복사해와 val에 3을 넣은 후 지역변수로 사용하기 때문에 a의 값은 변하지 않는다.
call-by-reference
call-by-reference 매개변수 방식은 참조에 의한 호출 변수의 주소를 전달하는 방식이다.
변수앞에 &(앰퍼센트)를 붙여 사용한다.
call-by-reference는 a의 주소값을 가져와 그 주소값을 참조하여 변수를 사용하기 때문에 a의 값을 변경할 수 있다.
주소를 가져오기 때문에 바꾸는 것 뿐만아니라 두 변수의 자리를 바꾸는 것도 가능하다.
C++방식은 아니지만 call-by-reference를 사용하는 방식이 하나 더 있는데 포인터 방식이다.
a의 포인터를 넘긴 후 그 값을 래퍼런스하여 사용하는 방식이다.
사실 변수를 call-by-reference로 넘기는 것은 번거롭고 매개변수의 값을 변경하는 것은 옳지 않다.(에러는 아니지만) (swap은 괜찮습니다.)
call-by-reference를 사용하는 목적은 클래스와 같은 용량이 큰 변수에 사용하기 위함이다.
call-by-value는 값을 복사하여 넘겨주기 때문에 클래스를 넘길 경우 메모리의 효율성면에서 볼때 좋지 않다.
따라서 클래스는 call-by-reference를 사용하도록 한다. 그리고 보통 클래스의 경우 그 값을 변경시키지 않기 위해 const를 사용하도록 한다.
printMyClass함수가 MyClass함수를 call-by-reference로 받고 그 함수를 이용한다. 이때 MyClass의 주소값만 가져오기 때문에 값을 복사해오는 call-by-value에 비해 메모리면에서 효율적이다.
'Language, IDE > C, C++' 카테고리의 다른 글
[C++] 프렌드 함수 (0) | 2013.06.28 |
---|---|
[C++] 클래스 디폴트 접근 제어자 (0) | 2013.06.26 |
[C++] .연산자와 ::연산자 (0) | 2013.06.26 |
[C++] 디폴트 인자 (0) | 2013.06.26 |
[C++] 랜덤함수 - 난수 생성기 (7) | 2013.06.25 |