2023년 1월 2일
카테고리 : 가변과 불변이론
조회 : 833|2분 읽기
가변(mutable)과 불변 (Immutable) - 2
얕은 복사와 깊은 복사
가변과 불변을 말할때 얕은 복사와 깊은 복사와 함께 말한다.
얕은 복사는 객체의 주소 값을 복사하고, 깊은 복사는 객체의 실제 값을 복사한다.
얕은 복사
그러면 얕은 복사를 할때 해당하는 주소값의 데이터가 변경되면 복사했던 값도 변할까?
맞다. 같은 주소값을 가지고 있다면 해당하는 값이 주소가 같지만 다른 변수에 의해 변경된다면 같이 변경된다.
javascript1let a = [1,2,3]; 2let b = a; 3 4b[1] = 10; 5console.log(b); // [1,10,3] 6console.log(a); // [1,10,3] 7 8a[1] = 20; 9console.log(b); // [1,20,3] 10console.log(a); // [1,20,3]
얕은 복사라는 이름에 맞게 주소만을 복사해서 사용할 수 있게된다.
가변을 사전에 얘기하는 이유는 얕은 복사가 데이터 영역을 따로 독립되어 사용하지 않고 같은 주소를 사용하여 메모리 공간을 절약할 수 있지만 가변적이기 때문에 사용하는데 데이터를 조작할 때 주의가 필요하다.
리액트의 상태관리에서 불변성을 지켜야하는 이유와 같다.
만약 상태가 함수(setter)에 의해서가 아닌 다른 요인에 의해서 불변성을 유지하지 못하고 가변적으로 계속 바뀌게 된다면 상태에 대한 값을 보장할수 없기 때문에 불변성을 꼭 지켜야한다.
깊은 복사
얕은 복사와 달리 주소값을 참조하지 않고 아예 객체 자체를 다른 독립된 데이터 영역에 할당하여 생성한다.
새로운 객체를 생성해서 참조하기 때문에 값은 같을지 몰라도 완전히 다른 값이 된다.
JS에서는 JSON Object를 이용해서 깊은 복사가 가능하다.
javascript1let origin = { 2 a: 'a', 3 b: { c: 'c' } 4}; 5 6let copy = JSON.parse(JSON.stringify(origin)); 7copy.b.c = 'cc'; 8 9console.log(origin.b.c === copy.b.c); //false
JAVA에서는 clone이라는 메서드를 제공해준다.
java1String a = "abc"; 2String b = a.clone(); 3 4System.out.println(a==b) // false;
결론
프로그래밍에서의 가변, 불변의 개념과 언어마다 다른 방식으로 불변에 대해 정의를 하고 있다는 것을 알게되었다.
프로그래밍에서 가변과 불변은 중요한 요소다.
결국은 가변과 불변은 얕은 복사와 관련이 있다고 생각한다.
코드를 작성할때 깊은 복사를 사용하는 경우는 없었다. 가변값이나 불변값을 얕은 복사로 이용하기 때문이다.
그리고 얕은 복사에서 가변값을 바꿀때도 JS에서 const가 재할당을 막아줘 가변값을 불변값 같이 사용하고 let으로 재할당을 바로 해버려 개념이 얕아지기도 했다.
불변값(성)에 묻는다면 변하지 않는 값이며 읽기전용이지만 변수에 재할당을 통해 값을 바꿀 수 있는 값(성질)
얕은 복사는 데이터에 대한 주소값을 복사하는 것이며 복사된 값과 원본이 같은 주소값을 가지고 값은 양쪽 다 가변적이다.
깊은 복사는 데이터에 대해 독립된 데이터 영역을 줘 복사된 값과 원본이 같은 값이지만 새로운 주소값과 데이터 영역을 가지고 있게된다.