불변, 가변 객체

Panda·2023년 3월 10일
0

Java

목록 보기
5/7

불변 객체(Immutable Object)

불변 객체는 Java에서 Class의 인스턴스가 생성된 이후에 내부 상태를 변경할 수 없는 객체입니다.

ex) String, Integer, Boolean 등
또한 개발자가 객체를 만들어서 내부 상태가 변경되지 않게 만들면, 그것또한 불변 객체입니다.

저는 옛날에는 final만 붙이면 다 불변 객체네? 라고 생각했던 시절이 있었네요 하하....

String이 불변 객체인 이유

어? String 변수들은 값들을 전부 변경 가능하지 않나요?? 어째서 내부 값을 못변경하는 불변 객체이죠?

String text = "a";
text = "b";

위에와 같은 코드가 있습니다.
값이 변경되는 것처럼 보이는 이 코드는 실제 내부에 있는 값이 변경되는 것이 아니라
"b"라는 값을 가지는 새로운 String 객체를 text 변수가 참조하게 되는 것입니다.
(이전에 "a"라는 값을 가진 String 객체는 GC가 제거해주겠죠??)


String 클래스의 코드를 확인해보아도 내부 값인 value가 private final로 명시되어있는 것을 확인할 수 있었습니다.

String 뿐만 아니라 다른 불변 객체들도 동일한 원리입니다.

장점

  1. 내부 값이 변하기 않기 때문에 객체에 대한 신뢰성이 높습니다!!
    • 메모리에 올라가 변경이 불가능하기 때문에 Thread-Safe 합니다.
    • 따라서 멀티스레드 환경에서 동기화 처리없이 객체를 공유할 수 있습니다.
  2. 생성자, 접근메소드에 대한 방어 복사가 필요없습니다.

단점

String text = "a";
text = "b";

아까 설명했던 코드에서도 알다 싶이
코드상에서 값을 변경해줄 때마다 새로운 객체가 필요합니다. 따라서 메모리 누수와 새로운 객체를 계속 생성해야하기 때문에 성능저하를 발생시킬 수 있습니다.

앞으로는 코드를 짤 때 이부분을 염두해서 불변 객체 변수는 변경을 자제해야겠습니다.

가변 객체(Mutable Object)

가변 객체는 Java에서 Class의 인스턴스가 생성된 이후에 내부 상태가 변경 가능한 객체입니다.
ex) ArrayList, HashMap, StringBuilder 등

장점

하나의 메모리 공간만 사용을 하기 때문에 메모리 관점에서 효율적이라고 할 수 있습니다.

단점

언제든지 값을 변경 될 수 있기 때문에 멀티 스레드 환경에서 사용하려면 별도의 동기화 처리가 필요합니다.

솔직히 이게 가장 무서운 단점이라고 생각하는데 멀티 스레드 환경에서 해당 객체 접근 시 값이 변경 될 확률이 있어서 큰 에러를 일으킬 수 있으니.....
따라서 별도의 추가 작업을 처리해 줍시다.

느낀 점

불변, 가변 객체에 대해 처음 인지했던 것은 코틀린 하면서 mutableList 같은 자료구조를 사용하면서 알았습니다 ㅋㅋㅋㅋㅋ

이후에 불변, 가변 객체에 대한 이해가 필요로 하여서
면접 공부도 할겸 이번 기회에 공부하였습니다.

profile
실력있는 개발자가 되보자!

0개의 댓글