이때 immutable object는 힙 영역에 저장된 데이터를 수정할 수 없는 객체를 의미한다.
Integer i = 1;
i = 3;
힙 영역에 실제 데이터인 1이 할당되고 이를 참조변수 i가 스택 영역에서 참조받는데, 3을 할당하면 객체의 값이 변경된 것이 아니라, 힙 영역에 새로운 객체를 생성하고 이 객체에 대한 참조값을 변경한다.
그리고 기존 1을 가진 주소값은 gc에 의해 사라진다.
static, final의 키워드를 사용하면 해당 객체는 불변객체, 즉 힙 영역의 데이터를 수정할 수 없는 객체로 되며 위 코드를 실행 시 컴파일 오류가 발생한다.
다만 list를 Immutable 선언해도 list.add 등 참조에 의해 값 변동이 일어날 수 있다. 이 경우 방어적 복사, 해당 객체의 복사본을 만들어 원본 참조 데이터를 수정할 수 없도록 유도해야 한다. 그렇지 않으면 Immutable이 소용없고 public 객체를 만드는 것과 다름없다.
Mmutable : https://choiblack.tistory.com/m/47
java 힙/스택 : https://m.blog.naver.com/heartflow89/220954420688
방어적 복사(*추후에 추가 공부 필요) : https://www.google.com/search?q=%EB%B0%A9%EC%96%B4%EC%A0%81+%EB%B3%B5%EC%82%AC&sca_esv=3830138d5daf0584&sxsrf=ADLYWII0xQDyBMAxRPSP2F4G1xU4Fd58FA%3A1729516154863&source=hp&ei=elIWZ4ScLt6Svr0P18_16AI&iflsig=AL9hbdgAAAAAZxZgiuO-wCkuyAny2EHcTdkBEVbpWAOY&ved=0ahUKEwiEwabgxZ-JAxVeia8BHddnHS0Q4dUDCBc&uact=5&oq=%EB%B0%A9%EC%96%B4%EC%A0%81+%EB%B3%B5%EC%82%AC&gs_lp=Egdnd3Mtd2l6IhDrsKnslrTsoIEg67O17IKsMgUQABiABDIIEAAYgAQYogQyCBAAGIAEGKIEMggQABiiBBiJBUjQGFAAWIcXcAl4AJABApgB4wKgAfIXqgEIMC4xOS4xLjG4AQPIAQD4AQGYAhagAt0QqAIKwgIIEAAYgAQYsQPCAgcQABiABBgKwgILEAAYgAQYsQMYgwHCAggQLhiABBixA8ICBBAAGAPCAgkQABiABBgKGCrCAgcQLhiABBgKwgILEC4YgAQYsQMYgwHCAhEQLhiABBixAxjRAxiDARjHAcICGhAuGIAEGLEDGIMBGJcFGNwEGN4EGOAE2AEBwgIFEC4YgATCAgcQIxgnGOoCwgIGEAAYHhgPmAMDugYGCAEQARgUkgcIOS4xMC4yLjGgB5qhAQ&sclient=gws-wiz