오늘은 얕은 복사와 깊은 복사에 대해 알아보려한다.
C++과 Java를 사용해왔기 때문에, 즉 객체지향 언어들을 사용해왔기 때문에 항상 주의해야하던 부분이기도 하다.
각각의 언어의 얕은 복사와 깊은 복사, 그리고 그 의미에 대해 알아보자.
얕은 복사(Shallow Copy)란?
간단히 말해서 동일한 클래스의 객체를 만들어서, 기존 객체가 가리키고 있는 지점을 동시에 가르키도록 만드는 것이다.
(얕은 복사된 객체와, 원본 객체는 동일한 메모리 공간을 참조하고 있는 것이다)
일반적으로 객체를 복사할 때, 동일한 클래스의 새 인스턴스를 만들고, 모든 필드(변수/함수)들을 새 인스턴스에 복사하고 반환하게 된다.
이것은 얕은 복사에 해당한다. 자바에서는 Clone 함수를 사용하게 되면 얕은 복사가 일어난다.
얕은 복사는 객체의 참조값(주소값)을 복사한다.
깊은 복사(Deep Copy)란?
깊은 복사는 얕은 복사와 달리 각각의 객체(복사 후의 객체, 원본 객체)가 자신의 메모리 공간을 가지고 동일한 내용을 갖도록 만드는 것이다.
만약 깊은 복사를 하고자 한다면, Clone 함수를 직접 구현해야 한다.
깊은 복사는 객체의 실제 값를 복사한다.
C++에서의 얕은 복사와 깊은 복사
#include <iostream>
using namespace std;
class Person
{
public:
int age;
string name;
public:
Person(int age, string name)
{
this.age = age;
this.name = name;
}
void printInfo() {
cout << this.age << " " << this.name << endl;
}
};
void main()
{
Person A(24, "yeon");
Person B = A;
B.age = 28;
A.printPerson(); // 28 yeon
B.printPerson(); // 28 yeon
}
C++에서 클래스를 선언하고, 다음과 같이 복사할 경우 얕은 복사가 진행되어 A, B 둘의 값을 변경하면 서로 영향을 끼치게 된다. 이를 해결하기 위해(깊은 복사를 하기 위해) 클래스 내의 복사생성자를 작성하여 새로운 메모리를 할당하도록 만들어줘야 한다.
Javascript에서의 얕은 복사와 깊은 복사
const a = 1;
let b = a;
b = 2
console.log(a); // 1
console.log(b); // 2
*원시값은 복사를 할 때 다른 메모리에 값을 할당한다. 따라서 원래 값에 복사 값이 영향을 미치지 않는다.
원시값 : JavaScript에서 원시 값(primitive, 또는 원시 자료형)이란 객체가 아니면서 메서드도 가지지 않는 데이터
const a = {number: 1};
let b = a;
b.number = 2
console.log(a); // {number: 2}
console.log(b); // {number: 2}
하지만 참조 값은 변수가 객체의 주소를 가리키는 값이기 때문에 같은 값을 가리키게 된다. (얕은 복사)
참고자료
lesslate.github.io/cpp/얕은복사-깊은복사/
'IT > Teckweek' 카테고리의 다른 글
www.도메인.com 을 치면 일어나는 일 (1) | 2020.11.22 |
---|---|
싱글톤 패턴 (Singleton Pattern) (0) | 2020.10.26 |
최단 경로 문제 (0) | 2020.10.12 |
객체지향 프로그래밍이란? (0) | 2020.10.05 |
안드로이드 액티비티 생명주기 (0) | 2020.09.21 |
댓글