[Java] Immutable

Hyo Kyun Lee·2024년 10월 21일
0

Java

목록 보기
52/66

1. 개요

  • 자바의 참조형 변수(객체)는 힙 영역에 할당되고, 스택 영역에 지역변수나 스레드(실행을 유발하는 동작/메소드)가 할당된다.
  • 참조형 변수, 즉 객체 생성 시 힙 영역에 데이터가 저장되며 이에 대한 참조값을 스택 영역에 저장한다.

이때 immutable object는 힙 영역에 저장된 데이터를 수정할 수 없는 객체를 의미한다.

2. 참조변수 예시

Integer i = 1;
i = 3;

힙 영역에 실제 데이터인 1이 할당되고 이를 참조변수 i가 스택 영역에서 참조받는데, 3을 할당하면 객체의 값이 변경된 것이 아니라, 힙 영역에 새로운 객체를 생성하고 이 객체에 대한 참조값을 변경한다.

그리고 기존 1을 가진 주소값은 gc에 의해 사라진다.

3. Immutable

static, final의 키워드를 사용하면 해당 객체는 불변객체, 즉 힙 영역의 데이터를 수정할 수 없는 객체로 되며 위 코드를 실행 시 컴파일 오류가 발생한다.

다만 list를 Immutable 선언해도 list.add 등 참조에 의해 값 변동이 일어날 수 있다. 이 경우 방어적 복사, 해당 객체의 복사본을 만들어 원본 참조 데이터를 수정할 수 없도록 유도해야 한다. 그렇지 않으면 Immutable이 소용없고 public 객체를 만드는 것과 다름없다.

4. 장단점

  • 장점
    -> 불변, thread safe하며 멀티스레드 환경에서 항상 동일한 값을 반환하므로 동기화를 신경쓰지 않아도 되며 성능상 이점이 존재한다.
  • 단점
    -> 방어적 복사 등 새로운 객체를 계속 생성하게 되면 gc가 되지 않고 변수가 남아있는 메모리 누수가 발생할 수 있으며, 이로 인한 성능저하가 발생할 수 있다.

5. Mmutable

  • 힙 영역의 데이터를 수정할 수 있는 객체로, 멀티 스레드 환경에서 동기화 작업이 필요하다.

6. 참고자료

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

0개의 댓글