[열혈C++] 임시객체와 임시변수

Yoons·2023년 8월 8일
0
post-thumbnail

❗️Notice❗️

저의 velog에 작성된 글은 모두 저의 주관적인 생각 및 이해를 바탕으로 작성된 글이므로 
정확하지 않은 내용을 있을 수 있음을 알립니다.

[교재] 윤성우 열혈 C++ 프로그래밍

Intro

언어를 배우다가 임시객체, 임시변수와 관련된 개념을 알게되었다. 오늘은 임시객체, 임시변수가 뭔지와 더불어 관련된 개념을 소개하고자 한다.

사실 임시변수는 다른 포스트에서 잠깐 언급했던 적이 있다. 오늘은 임시객체에 포커스를 맞춰 소개할 예정이며, 임시변수와 임시객체 개념은 유사하므로 참고하고 글을 읽기 바란다!

임시변수에 대한 약간의 언급 - 2. 어떻게 가능한가?? 중..


1. 임시객체와 임시변수

임시객체는 말 그대로 "임시로 생기는 객체"이다. 근데 이 개념이 어디에 쓰일까??

예제를 들어보겠다.

Myobj MyFunc(Myobj ob){
	return ob;
}

int main(){
	Myobj obj(10);
    cout << MyFunc(obj) << endl;

간단한 예제라 코드는 충분히 이해할 수 있을거라고 생각한다.

위의 코드를 보고 질문에 답해보기를 바란다!

객체의 메모리 할당은 총 몇 번 일어나는가?

정답은 3번이다! 조금 당황한 독자들이 있을 거라고 생각한다. 왜 3번인지 이유에 대해 설명해보겠다.

  1. obj 객체 생성 시 메모리 할당
  2. MyFunc(Myobj ob)에서 ob 객체를 위한 메모리 할당
  3. MyFunc 함수에서 ob 객체 반환 시 메모리 할당

1, 2는 그렇다 쳐도 3은 뭔가..? 하는 생각이 들거라고 생각한다. 사실 저것이 바로 임시객체이다.

사실 생각해보면 이해가 되기도 한다. 함수에서 값을 반환하는데 "어디로 반환한다는 거야?" 라는 의문이 들 수 있다. 하지만 성공적으로 반환을 한다는 얘기는 해당 값(객체, 변수)에 대한 메모리 할당이 성공적으로 진행됐음을 의미한다.

임시객체에 대한 존재를 알았으니, 임시객체는 언제 생성되고, 언제 소멸되는지 알아보도록 하자!


2. 임시객체의 생성과 소멸

임시객체의 생성은 위에서 언급한 바와 같이 return문을 실행할 때 생성된다. 그렇다면 소멸은 언제 일어날까?? 결론을 이야기 해주자면 다음 행으로 넘어가면 사라진다. 예제를 통해서 확인해보자.

class SoSimple{
private:
	int num;
public:
	SoSimple(int n) : num(n) {
    	cout << "New object: " << this << endl;
    } // 생성자
    
    SoSimple(const SoSimple& copy) : num(copy.num){
    	cout << "New Copy obj: " << this << endl;
    } // 복사생성자
   	
    ~SoSimple() {
    	cout << "Destroy obj: " << this << endl;
    } // 소멸자
};

SoSimple SimpleFunc(SoSimple ob) { // 함수호출 시 ob 객체 생성
	cout << "Parm ADR: " << endl;
    return ob; // 임시객체 생성
}

int main(){
	SoSimple obj(7);
    SimpleFuncObj(obj); // return ob를 통해 객체를 반환받음. 다음 행으로 넘어가면 임시 객체 소멸
    
    return 0;
}

위의 코드를 실행해보면 다음과 같은 출력을 얻을 수 있다.

New Object: 0012FF54 // obj 객체 생성
New Copy obj: 0012FE38 // ob 객체 생성
Parm ADR: 0012FE38 // SimpleFunc 함수 실행
New Copy obj: 0012FE64 // ob 임시 객체 생성
Destroy obj: 0012FE38 // SimpleFunc 함수를 나가면서 ob 객체 소멸
Destroy obj: 0012FE64 // 임시 객체 소멸

임시 객체 소멸은 다음행으로 넘어가면 소멸된다고 언급했다. 출력 결과를 보면 '다음행'이라는 것은 SimpleFunc 함수에서의 다음행이 아니라, main 함수에서의 다음행이라는 것을 알 수 있다.


Outro

오늘은 다소 생소한 개념일 수도 있는 임시객체와 임시 변수에 대한 이야기를 해보았다. 임시변수에 대해서는 크게 언급하지 않았지만, 임시객체의 개념을 이해하고 생성과 소멸을 임시변수에 적용하여 변수의 메모리 할당과 해제를 연관지으면 이해하는데 큰 어려움이 없을 것이다!

profile
모든 글은 저의 눈물을 머금으며 작성한 글이니..재밌게 봐주세요 :) 깃헙 맞팔@

0개의 댓글