불변 객체는 Java에서 Class의 인스턴스가 생성된 이후에 내부 상태를 변경할 수 없는 객체입니다.
ex) String, Integer, Boolean 등
또한 개발자가 객체를 만들어서 내부 상태가 변경되지 않게 만들면, 그것또한 불변 객체입니다.
저는 옛날에는 final만 붙이면 다 불변 객체네? 라고 생각했던 시절이 있었네요 하하....
어? String 변수들은 값들을 전부 변경 가능하지 않나요?? 어째서 내부 값을 못변경하는 불변 객체이죠?
String text = "a";
text = "b";
위에와 같은 코드가 있습니다.
값이 변경되는 것처럼 보이는 이 코드는 실제 내부에 있는 값이 변경되는 것이 아니라
"b"라는 값을 가지는 새로운 String 객체를 text 변수가 참조하게 되는 것입니다.
(이전에 "a"라는 값을 가진 String 객체는 GC가 제거해주겠죠??)
String 클래스의 코드를 확인해보아도 내부 값인 value가 private final
로 명시되어있는 것을 확인할 수 있었습니다.
String 뿐만 아니라 다른 불변 객체들도 동일한 원리입니다.
String text = "a";
text = "b";
아까 설명했던 코드에서도 알다 싶이
코드상에서 값을 변경해줄 때마다 새로운 객체가 필요합니다. 따라서 메모리 누수와 새로운 객체를 계속 생성해야하기 때문에 성능저하를 발생시킬 수 있습니다.
앞으로는 코드를 짤 때 이부분을 염두해서 불변 객체 변수는 변경을 자제해야겠습니다.
가변 객체는 Java에서 Class의 인스턴스가 생성된 이후에 내부 상태가 변경 가능한 객체입니다.
ex) ArrayList, HashMap, StringBuilder 등
하나의 메모리 공간만 사용을 하기 때문에 메모리 관점에서 효율적이라고 할 수 있습니다.
언제든지 값을 변경 될 수 있기 때문에 멀티 스레드 환경에서 사용하려면 별도의 동기화 처리가 필요합니다.
솔직히 이게 가장 무서운 단점이라고 생각하는데 멀티 스레드 환경에서 해당 객체 접근 시 값이 변경 될 확률이 있어서 큰 에러를 일으킬 수 있으니.....
따라서 별도의 추가 작업을 처리해 줍시다.
불변, 가변 객체에 대해 처음 인지했던 것은 코틀린 하면서 mutableList
같은 자료구조를 사용하면서 알았습니다 ㅋㅋㅋㅋㅋ
이후에 불변, 가변 객체에 대한 이해가 필요로 하여서
면접 공부도 할겸 이번 기회에 공부하였습니다.