(5) 불변 객체
- 불변 객체의 정의개념은 알겠는데, 그 개념이 왜 필요한지 알겠나요? 아래 예시를 통해서 “불변하다”. 혹은, ‘불변객체’의 개념이 왜 필요한지를 한번 알아보도록 합시다 🐱
- 우리는 앞선 과정에서, **가변하다**와 **불변하다**의 개념을 배웠습니다. 다시 살짝 정리해서 객체를 예로 들면, 객체의 속성에 접근해서 값을 변경하면 가변이 성립했었죠. 반면, 객체 데이터 자체를 변경(새로운 데이터를 할당)하고자 한다면 기존 데이터는 변경되지 않습니다. 즉, 불변하다라고 볼 수 있습니다.
- 불변 객체의 필요성
- 다음 예시는 객체의 가변성에 따른 문제점을 보여주고 있어요 🙄
- 👍가변한다는 불변성// 그러나, 데이터 많은 경우 하드코딩 곤란 >> 얕은복사 방법 차용
- 위 방법이 과연 최선일까요?
- changeName 함수는 새로운 객체를 만들기 위해 변경할 필요가 없는 gender 프로퍼티를 하드코딩으로 입력했어요 ⇒ 만일 이러한 속성이 10개라면? 🥲
- 따라서, 다음 제시하는 **얕은 복사**의 방법을 제시할게요!
- 안타깝지만, 그렇진 않아요. 다음과 같은 문제점이 있기 때문입니다.
- 더 나은 방법 : 얕은 복사
- 패턴과 적용
- 얕은 복사 vs 깊은 복사
- 중첩된 객체에 대해서는 완벽한 복사를 할 수 없기 때문이에요. 이것이 얕은 복사의 한계입니다.
- 얕은 복사 : 바로 아래 단계의 값만 복사(위의 예제) 문제점 : 중첩된 객체의 경우 참조형 데이터가 저장된 프로퍼티를 복사할 때, 주소값만 복사
- 깊은 복사 : 내부의 모든 값들을 하나하나 다 찾아서 모두 복사하는 방법
- 중첩된 객체에 대한 얕은 복사 살펴보기
- ✓ 이 패턴도 여전히 문제가 있을까요?
- 결국, ser.urls 프로퍼티도 불변 객체로 만들어야 해요.
- 중첩된 객체에 대한 깊은 복사 살펴보기
- 6. 결론 : 객체의 프로퍼티 중, 기본형 데이터는 그대로 복사 + 참조형 데이터는 다시 그 내부의 프로퍼티를 복사 ⇒ 재귀적 수행!
- 패턴과 적용
재귀적으로 수행한다? ⇒함수나 알고리즘이 자기 자신을 호출하여 반복적으로 실행되는 것을 말합니다 😎
[결론]을 적용한 코드 —> 완벽히 다른 객체를 반환하네요.
이렇게 되면, 우리가 그토록 원하던 ‘깊은 복사’를 완벽하게 구현할 수 있습니다.
- 마지막 방법! JSON(=JavaScript Object Notation)을 이용하는 방법도 존재합니다. 하지만 완벽한 방법은 아니에요. 간략히 장/단점을 정리해드리니, 내용만 참고해주세요 😉
- JSON.stringify() 함수를 사용하여 객체를 문자열로 변환한 후, 다시 JSON.parse() 함수를 사용하여 새로운 객체를 생성하기 때문에, 원본 객체와 복사본 객체가 서로 독립적으로 존재합니다. 따라서 복사본 객체를 수정해도 원본 객체에 영향을 미치지 않습니다.
- JSON을 이용한 깊은 복사는 다른 깊은 복사 방법에 비해 코드가 간결하고 쉽게 이해할 수 있습니다.
- JSON을 이용한 깊은 복사는 원본 객체가 가지고 있는 모든 정보를 복사하지 않습니다. 예를 들어, 함수나 undefined와 같은 속성 값은 복사되지 않습니다.
- JSON.stringify() 함수는 순환 참조(Recursive Reference)를 지원하지 않습니다. 따라서 객체 안에 객체가 중첩되어 있는 경우, 이 방법으로는 복사할 수 없습니다.
- 장점:
- JSON.stringify() 함수를 사용하여 객체를 문자열로 변환한 후, 다시 JSON.parse() 함수를 사용하여 새로운 객체를 생성하기 때문에, 원본 객체와 복사본 객체가 서로 독립적으로 존재합니다. 따라서 복사본 객체를 수정해도 원본 객체에 영향을 미치지 않습니다.
- JSON을 이용한 깊은 복사는 다른 깊은 복사 방법에 비해 코드가 간결하고 쉽게 이해할 수 있습니다.
- JSON을 이용한 깊은 복사는 원본 객체가 가지고 있는 모든 정보를 복사하지 않습니다. 예를 들어, 함수나 undefined와 같은 속성 값은 복사되지 않습니다.
- JSON.stringify() 함수는 순환 참조(Recursive Reference)를 지원하지 않습니다. 따라서 객체 안에 객체가 중첩되어 있는 경우, 이 방법으로는 복사할 수 없습니다.
'Javascript' 카테고리의 다른 글
실행컨텍스트(스코프, 변수, 객체, 호이스팅)_v3.6 (0) | 2023.12.16 |
---|---|
undefined vs null_v3.5 (0) | 2023.12.16 |
변수선언 데이터 할당_v3.3 (0) | 2023.12.15 |
변수 선언과 데이터 할당_v3.2 (0) | 2023.12.15 |
데이터 타입&메모리_v3.1 (0) | 2023.12.15 |