본문 바로가기
정상을향해/Languages

참조자(Reference)와 함수

by 사이테일 2013. 11. 10.

C언어에서는 함수의 두 가지 호출 방식이 존재한다.

 

Call-by-value           값을 인자로 전달하는 함수의 호출방식

Call-by-reference    주소 값을 인자로 전달하는 함수의 호출방식 

 

C언어에서 말하는 Call-by-reference는 다음의 의미를 지닌다.

 

"주소 값을 전달받아서, 함수 외부에 선언된 변수에 접근하는 형태의 함수호출"

 

즉, 주소 값이 외부 변수의 참조도구로 사용되는 함수의 호출을 뜻한다.

 

다시 말하면 주소 값이 전달되었다는 사실이 중요한 게 아니라, 주소 값이 참조의 도구로 사용되었다는 사실이 중요한 것이며,

 

이 것이 Call-by-value와 Call-by-reference를 구분하는 기준이 된다.

 

C++에서는 두 가지 방식으로 Call-by-reference의 함수정의가 가능하다. (Call-by-address라며 구분해서 표현하기도 한다.)

 

 

1. 참조자를 이용한 Call-by-reference

 

 

 

참조자는 선언과 동시에 변수로 초기화되는 것이 맞다.

 

하지만 매개변수는 함수가 호출되어야 초기화가 진행되는 변수들이기 때문에,

 

함수호출시 전달되는 인자로 초기화를 하겠다는 의미의 선언이다.

 

즉 다음과 같이 호출 가능하다.

 

 

결과적으로 val1과 val2의 교환으로 이어질 것이다.

 

 

여기서 생각해봐야 할 것이 한 가지 있다.

 

int num =24;

Func(num);

cout << num << endl;

 

위와 같은 코드가 있을 때, C에서는 100% 24가 출력되지만 C++에서는 얼마가 출력될지 알 수 없다.

 

참조자를 이용해서 num에 저장된 값을 변경하는 것이 가능하기 때문이다.

 

참조자의 이런 단점을 해결하기 위해서 const를 이용하는 방법이 있다.

 

(C++ 프로그래머 중에서는 이런 단점 때문에 참조자를 아예 사용하지 않는 경우도 있다.)

 

void Func(const int &ref) { }

 

이런식의 const 선언을 추가하여,

 

함수 Func 내에서 참조자 ref를 이용한 값의 변경은 하지 않겠다고 선언해주면,

 

굳이 내부를 확인하지 않는다 하더라도 위 코드의 결과를 예상할 수 있는 것이다.

 

 

 

출처 : 열혈 C++ 프로그래밍 (윤성우 저)

 

'정상을향해 > Languages' 카테고리의 다른 글

상속 (Inheritance)  (0) 2013.11.11
얕은복사와 깊은복사  (0) 2013.11.11
멤버 이니셜라이저를 이용한 멤버 초기화  (0) 2013.11.11
C++에서의 파일분할  (7) 2013.11.10
[C] 포인터 : 배열명  (0) 2011.04.16
[C] 포인터 : *의 의미  (0) 2011.04.16