[문과 코린이의 IT 기록장] C,C++ - 함수 반환형 (Return by Value, Return by Address, Return by Reference)
기억할 사항 )
int a = 10; // Rvalue인 10을 복사해서, a에 저장한다. (이동하는게 아님)
[ivalue와 rvalue]
- lvalue : 단일 표현식 이후에도 없어지지 않고, 지속되는 객체. 즉, 이름을 가지는 객체
ex ) const타입을 포함한, 모든 변수는 lvalue라고 할 수 있음, ++x
- Rvalue : 표현식이 종료된 후에는 더 이상 존재하지 않는 암시적인 값
ex ) 상수, 임시객체, x++
cf ) 둘 다 증가된 값을 리턴하지만, ++x는 증가된 x 자신을 리턴하기 때문에 lvalue인 반면에, x++는 증가된 복사본을 리턴하기 때문에, Rvalue이다.
cf )
이해하기 어려우면, 함수의 이름 부분 int A(), int *A(), int &A() 부분과, return 뒤의 값을 연결해서, 함수의 매개변수에 대해 공부하던 것 처럼 보자.
ex)
int A() = return value; // 값으로 반환
int *A() = return &value; // value는 반환되는 값이며, A는 value의 주소값을 담는다. (즉 value를 가리킴)
int &A() = return value; // value의 값은, A라는 이름의 참조되어 반환된다.
1. 값으로 반환 (Return by Value)
: 값이 반환되면, 복사본이 호출자에게 반환된다. ( 값으로 전달처럼 리터럴(5), 변수 표현식(x+1) 등을 반환 가능하다.)
: return 뒤의 '객체를 복사하여(이름을 가지지 않은 임시객체형태로)' 반환한다.
[ 값으로 반환을 사용해야 하는 경우 ] |
2. 주소로 반환 (Return by address)
: 호출자에게 변수의 주소를 반환한다.
[ 주소로 반환을 사용해야 하는 경우 ] - 주소로 전달된, 매개변수를 반환할 때 - 동적 할당된 메모리를 반환할 때 |
-그러나 함수 안에서 선언된, 지역 변수의 주소를 반환하고자 하면, 프로그램에서 정의되지 않은 동작이 발생한다.
주소가 호출자에게 반환된 직후, value가 소멸하는 현상이 보인다.
이는 최종적으로 할당되지 않은 메모리(dangling pointer)이기 때문에, 사용하면 문제가 생길 수 있다.
따라서, 주소로 반환을 하는 경우에는, 반환하는 주소가 유효한 변수가 되도록 하는 것이 중요하다.
- 주소로 반환은 동적 할당된 메모리를 호출자에게 반환하는데도 사용한다.
3. 참조로 반환(Return by reference)
: 참조자를 반환하게 되면, return 뒤의 '실제 객체(이름을 가진 실체)' 그 자체를 반환하게 된다.
: 즉, 참조로 반환을 사용하면, 변수에 대한 참조가 호출자에게 반환된다는 것이며, 이 다음 호출자는 이 참조를 사용해서 변수를 계속 수정할 수 있다.
[ 참조로 반환을 사용해야 하는 경우 ] - 참조 매개 변수를 반환할 때 - 함수에 전달된 배열의 요소를 반환할 때 - 함수의 끝에서 소멸하지 않는 구조체나 클래스를 반환할 때 |
1) 그러나 리턴하는 것이 지역변수이면, 소멸시점에 주의해야 한다.
이런 방식으로 사용하는 것은, 좋은 방법이 아니다. (뜻하지 않은 결과를 초래할 수 있다.)
따라서 반환형이 참조형인 것을 사용하고자 한다면, 매개변수도 참조형이여야 한다.
2) 참조 매개 변수를 반환하는 예시
* 유의사항 - 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다. - 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다. - 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :) |