[문과 코린이의 IT 기록장] C,C++ - 임시객체(임시객체 기초, 임시객체 정의, 임시객체 특징, 임시객체 사례)
1. 임시객체 기초
임시객체란?
: 실행 도중에 잠깐만 사용되는 객체로, 소스 코드에도 없는 힙 이외의 공간에 생성되는 것이 임시객체이다.
ex )
main함수에서, A함수에 n을 인자로 넘겨주면, A함수의 통용범위에서만 사용가능한 int a라는 임시객체를 생성하게 된다. 임시객체 a는 n의 값인 1을 담게 되는데 이 때 복사가 일어난다. 이를 값에 의한 복사(Call by value)라고 한다. 마찬가지로, return a를 할 때도, 리턴 값은 int형 임시객체를 생성하고 담게 된다.
int A() : 값 리턴, 임시객체가 생성된다.
int & A() : 참조 리턴, 리턴용 임시객체를 만들지 말라는 의도를 말한다.
// 임시객체는 성능저하를 유발하는 원인이 되기 때문에, 참조에 의한 복사(Call by reference)를 해주는 것이 좋다.
2. 임시객체 정의
a. 생성자 객체 생성 : Temporary Tem(100); // 객체 이름 존재 O.
b. 임시객체 생성 : Temporary(100); // 객체 이름 존재 X.
3. 임시객체 특징
1) 임시객체는 주소연산자로 주소를 구할 수 없다.
ex ) Temporary *t1 = &Temporary(100); // 에러 발생.
2) 임시객체는 Ivalue가 될 수 없다. ( =의 왼쪽에 올 수 없다.)
ex ) Temporary(100) = 10; // 에러 발생
3) 임시객체는 일반적인 참조가 불가능하다. 그러나, 상수 참조는 가능하다.
ex ) Temporary &ref = Temporary(100); // 에러 발생
const Temporary & ref = Temporary(100); // 실행 가능, 즉 ref가 파괴될 때까지 임시객체는 존재한다.
4) 임시객체는 다음 행으로 넘어가면, 바로 소멸되게 된다. 그러나 참조자에 참조되는 임시객체는, 바로 소멸되지 않는다.
[ 클래스의 외부에서, 객체의 맴버함수를 호출하기 위해 필요한 것은 다음 세 가지 중 하나이다. ] 1) 객체에 붙여진 이름 2) 객체의 참조 값 (객체 참조에 사용되는 정보) 3) 객체의 주소 값 |
4. 임시객체 예시
ex 1 )
Temporary(100);
// 임시객체를 생성하는 방법. Temporary(int n):num(n)에서 임시객체가 생성되었다가, 다음 행으로 넘어갈 때 소멸된다.
Temporary(200).ShowTempInfo();
// 임시객체 생성, 이어서 임시객체의 참조 값이 반환되면, ShowTempInfo()를 실행시킨 후, 다음 행으로 넘어갈 때 소멸시킨다.
Const Temporary & ref = Temporary(300);
// 임시객체를 생성한 후, 참조자 ref로 임시객체를 참조하고 있다. 이 참조자는 다음 행에서도 사용할 수 있다.
ex 2 )
Int main(){
SoSimple obj(7);
// 생성자로 obj 객체 생성, New Object
SimpleFuncObj(obj);
// SimpleFuncObj함수호출로 인한, 매개변수 ob의 생성, New Copy Obj
// 함수 다음 코드 실행, Parm ADR
// return ob로 인한 임시객체 생성, New Copy Obj
// 매개변수 ob의 소멸, Destroy obj
// 임시객체 소멸, Destroy obj
cout<<endl;
SoSimple tempRef = SimpleFuncObj(obj);
// SimpleFuncObj함수호출로 인한, 매개변수 ob의 생성, New CopyObj
// 함수 다음 코드 실행, Parm ADR
// return ob로 인한 임시객체 생성. 이 값의 이름은 tempRef, New Copy Obj
// 매개변수 ob의 소멸, Detroy obj
cout<<"Return obj "<< &tempRef<<endl;
return 0;
// tempRef가 참조하는, 임시객체 소멸, Destroy obj
// obj객체 소멸, Destroy obj;
}
* 유의사항 - 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다. - 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다. - 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :) |