코딩못하는사람

Immutable,mutable 객체 본문

자바 메모장/개념 및 문법

Immutable,mutable 객체

공부절대안함 2021. 2. 10. 14:54

자바의 객체의 타입에는 Immutable 타입과 mutable타입이 있다.

객체들은 기본적으로 heap영역에 할당되고 stack영역에  래퍼런스 값을 갖는 참조 변수들로 접근 가능하다.

 

immutable(불변) 객체

이름에서 알 수 있듯이 변경 불가능,바뀌지 않는 객체이다.

immutable 객체의 종류에는 대표적으로 String, Boolean, Integer, Float, Long 등이 있다.

(객체이므로 String을 제외하면 primitive의 래퍼타입이다).

이제 immutable 객체의 불변이라는 개념을 자세히 보자.

new 연산자로 객체를 생성하면 heap영역에 객체가 생기고 래퍼런스 값을 가지는 변수가 stack에 생길 것이다. 불변 객체라는 것은 이 객체의 값을 heap 영역에서 바꿀 수 없다는 뜻이다.

우리는 오직 새 객체를 만들어 래퍼런스 값을 주는 재 할당만이 가능하다. 예를 들어보자.

 

String a = "Star";

a = a.concat("Craft");

System.out.println(a); 라는 코드가 있다고 생각해보자.

처음 a변수에 Star의 주소가 할당된다.

그 후 a에 Craft를 이어 주면 a는 StarCraft로 출력이 될 것이다.

a가 불변객체인데 변한 것 처럼 보일 수 있다.

하지만 변한 것이 아니고 StarCraft라는 새로운 객체를 만들어서 a에 재 할당 된것이다.

 

 

https://limkydev.tistory.com/68

첫째 줄에 a는 1000을 가르킨다. 하지만 a에 Craft를 이어주게 되면

불변객체인 String a는 새로운 StarCraft 문자열 객체를 만들어서 2000의 값을 a에 다시 할당해준다.

메모리 1000에 Star은 stack에 참조변수가 없어지는 것이다.

 

 

 

 

어떻게 불변객체를 만들까?

불변객체들 Integer,String등의 API를 살펴보면

public final class Integer, public final class String으로 구성되어 있었다.

final을 선언해 줌 으로써 변경 불가능하게 만들어져 있었다.

내가 만드는 Class를 불변객체로 만들고자 한다면

  • 멤버변수를 final로 설정해준다.

  • setter 메서드를 구현해주지 않으면 된다.

  • class를 상속하지 못하도록 선언 (class를 final로 선언하거나 생성자를 private로 선언)

  • 모든 field 변수가 final이 아닐때 즉 가변객체타입의 field 변수가 있을 경우 그 가변객체 타입의 field변수에 대해 직접적으로 접근하지 못하도록 copy 객체를 생성하여 새로운 인스턴스를 반환하도록 방어적 복사본 전략을 사용

불변객체의 장단점

장점

  • 객체에 대한 신뢰도가 올라간다.

  • multi-thread 환경에서 동기화 처리 없이 객체를 공유 가능하다.(쓰레드에 안전하다 라고함)

단점

  • 객체의 값이 할당될 때 마다 새로운 객체가 필요하다. 따라서 메모리 누수와 성능저하를 발생시킬 수 있다.

 

 

mutable(가변) 객체

mutable객체는 불변객체와 다르게 heap영역에 생성된 객체를 변경 할 수 있다.

대표적인 가변 객체는 List, ArrayList, HashMap,StringBuilder,StringBuffer 등이 있다.

가변객체를 multi-thread 환경에서 사용하려면 별도의 동기화 처리를 해줘야한다.

이렇게 동기화 처리된 객체중 하나가 StringBuffer이다.

 

출처 및 공부한 곳

velog.io/@conatuseus/Java-Immutable-Object%EB%B6%88%EB%B3%80%EA%B0%9D%EC%B2%B4

limkydev.tistory.com/68?category=957527

Comments