👩🏻‍💻기초지식/C++

[C++] LValue와 RValue, 얕은 복사와 깊은 복사

공대 컴린이 2023. 9. 6. 20:43
728x90

L-Value

int a = 3; 에서 a에 해당하는 것처럼 참조(&) 연산자를 통해 주소값을 취할 수 있는 값을 LValue라고 합니다.

LValue는 표현식의 왼쪽과 오른쪽 모두에 올 수 있습니다.

R-Value

int a = 3; 에서 3은 주소값을 취할 수 없습니다. 또한 표현식을 연산할 때 잠깐 존재하고, 연산 후에는 사라지는 값입니다. 즉, 이렇게 실체가 없어서 주소 값을 취할 수 없는 값을 RValue라고 합니다.
RValue는 표현식의 오른쪽에만 올 수 있습니다.


얕은 복사 (Shallow Copy)

얕은 복사는 의존적인 복사로, 값을 복사하는 것이 아니라, 값을 기리키는 포인터를 복사하는 것입니다. 즉, 동적 할당 받은 변수의 주소값까지 공유합니다.

얕은 복사는 객체가 가진 멤버들의 값을 새로운 객체로 복사하는데, 만약 객체가 참조타입의 멤버를 가지고 있다면 참조값만 복사하게 됩니다. 따라서 복사한 대상자가 바뀌면 복사한 객체도 같이 변하게 됩니다.

 

이러한 얕은 복사는 대입연산자를 이용해 대입에서 구현됩니다.

 

깊은 복사 (Deep Copy)

깊은 복사는 객체 전체를 복사하는 것으로, 객체가 가진 모든 멤버를 복사하는 것을 말합니다.

객체가 참조 타입의 멤버를 포함하는 경우 참조값의 복사가 아닌, 참조된 객체 자체가 복사됩니다. 따라서 동적할당 받은 변수가 있다면 주소값을 공유하는 것이 아니라, 새로운 동적할당을 받고 원본의 데이터를 복사하게 됩니다.

 

이러한 깊은 복사는 복사생성자를 이용한 대입에서 구현됩니다.

728x90