✍️ JavaScript 객체와 불변성이란 ?
기본형 타입(Primitive type)
종류: 논리형(boolean), 정수형(int), 실수형(double), 문자형(char)
참조형 타입(Reference type)
종류: 배열(Array), 클래스(Class), 인터페이스(Interface)
불변 객체
이름 그대로 '변하지 않는 객체' 즉, 이미 할당된 객체가 변하지 않는다 (수정도 X)
불변 객체 만드는 방법
1. 맴버변수에 private final을 붙인다.
2. getter가 있다고 setter를 무조건 만들지 말자.
3. final class로 선언하여 상속을 막자.
4. 혹은 모든 생성자를 private로 제한하고, 정적 팩토리 메소드를 통해서만 객체를 생성할 수 있게 하자.
5. 생성자의 인자로 Reference Type을 받을 때는 Deep Copy를 해서 맴버변수에 저장하자.
6. getter를 통해서 Reference Type의 맴버를 반환할 때는 Deep Copy후 반환하자.
얕은 복사(Shallow Copy)
객체를 복사할 때, 해당 객체만 복사하여 새 객체를 생성
복사된 객체의 인스턴스 변수는 원본 객체의 인스턴스 변수와 같은 메모리 주소를 참조
따라서, 해당 메모리 주소의 값이 변경되면 원본 객체 및 복사 객체의 인스턴스 변수 값은 같이 변경됨
깊은 복사(Deep Copy)
객체를 복사 할 때, 해당 객체와 인스턴스 변수까지 복사하는 방식
전부를 복사하여 새 주소에 담기 때문에 참조를 공유하지 않음