* Call-by-value & Call-by-reference - Call-by-value : 값을 인자로 전달하는 함수의 호출방식 - Call-by-value 함수
Call-by-value의 형태로 정의된 함수의 내부에서는, 함수외부에 선언된. 변수에 접근이 불가능하다.
위 결과는 val1과 val2가 값이 바뀌지 않고 있다. 두 개의 주소값을 받아서, 그 주소 값이 참조하는 영역에 저장된 값을 직접 변경하고 있다.
* 참조자를 이용한 Call-by-reference - call-by-reference의 가장 큰 핵심은 함수 내에서 함수 외부에 선언된 변수에 접근할 수 있다는 것이다.
-> SwapByRef2()에 선언된 두 참조자 &ref1과 &ref2는 함수 호출시 넘어가는 val1과 val2에 의해 초기화가 진행된다. * SwapByRef2(23, 45); 의 형태로 사용하게 되면 컴파일 에러가 발생한다. * 참조자를 이용한 Call-by-reference의 황당함과 const 참조자 int num=24; -> 위
코드는 C언어 관점에서는 100% 24가 출력된다. 그러나 C++에서는 얼마가 출력될지 알 수 없다. void HappyFunc(int prm) {...} 다음과 같이 정의되어 있다면, 참조자를 이용해 num의 저장된 값을 변경할 수도 있다. void HappyFunc(int &ref) {...} ** 코드를 분석하는 과정에 있다면, 함수의 호출문장만 보고도 함수의 특성을 어느 정도 판단할 수 있어야 한다. 이는 const 키워드를 이용하면, 이러한 단점을 어느 정도는 극복할 수 있다. void HappyFunc(const int *ref) { .... } -> 함수 HappyFunc 내에서 참조자 ref를 이용한 값의 변경은 하지 않겠다. * 함수 내에서, 참조자를 통한 값의 변경을 진행하지 않을 경우, 참조자를 const로 선언해서, * 반환형이 참조자인 경우
int num1 = 1; ->num1과 num2의 출력은 모두 4로 나타난다. 아래와 같이 num2를 일반 변수로 호출하게 되면, int num1 = 1; -> 결과는 num1은3, num2는 102가 출력된다. * 이렇듯 반환형이 참조형인 경우, 반환 값을 무엇으로 저장하느냐에 따라서 그 결과에 차이가 있다. * 잘못된 참조 반환
-> 위의 함수에서는 지역변수 num에 저장된 값을 반환하지 않고, 참조의 형태로 반환하고 있다. int &ref=RetuRefFunc(10); 지역변수 num에 ref라는 또 하나의 이름이 붙게 된다. 하지만 함수가 반환이 되면, 함수의 지역변수인 num은 소멸된다. * const 참조자 const int num = 20; -> const 선언을 통해서 num을 상수화했는데, 참조자 ref를 통해서 값을 변경하고
있다. const int &ref=num; * 참조자의 상수 참조 참조자는 변수만 참조가 가능하고 상수는 참조가 불가능하다. const int &ref = 50; -> int num = 20+30; 덧셈 연산을 위해서는 20, 그리고 30 둘다 메모리 공간에 저장되어야 한다. 하지만 저장되었다고 해서 재 참조가 가능한 값은 아니다. const int &ref = 30; * '임시변수'를 이용해 상수 참조를 가능하게 한 이유 -> 위와 같이 정의된 함수에 인자의 전달을 목적으로 변수를 선언한다는 것은 매우
번거롭다. |