객체 지향 프로그래밍에 있어 불변 객체는 생성 후 그 상태를 바꿀 수 없는 객체를 말한다. (힙 영역에서 그 객체가 가리키고 있는 데이터 자체의 변화가 불가능) 불변 객체를 사용하면 복제나 비교를 위한 조작을 단순화 할 수 있고, 성능 개선에도 도움을 준다. 하지만 객체가 변경 가능한 데이터를 많이 가지고 있는 경우엔 불변이 오히려 부적절한 경우가 있다.
이 때문에 많은 프로그래밍 언어에서는 불변이나 가변 중 하나를 선택할 수 있도록 하고 있다.
대표적인 자바 클래스에는 String 이 있다.
String a = "aa"
후a = "bb"
는 "bb" 에 대한 새로운 객체를 만드는 것
다른 상황일 수도 있는데, 경험한 걸 설명하면 메소드 파라미터를 받을 때 final 이라는 파라미터를 사용한다. 이는 파라미터를 변경할 수 없도록 하기 위해서 붙이는데, 이게 primitive 타입이나 단일 객체에서는 유효한데, collection 객체에서는 안된다. 특히 Map 을 받을 때..
그래서 불변객체에 대해서 `final` 을 붙였으니 불변이지 하는 생각은 안하는게 좋을 것 같다.
장점
- 객체에 대한 신뢰도가 높아진다. 객체가 생성되어 변경되지 않는다면, (상태가 변하지 않는다면) transaction 내에서 그 객체를 믿고 쓸 수 있다.
- 멀티 스레드 환경에서 동기화 처리 없이 객체를 공유할 수 있다.
단점
- 객체가 가지는 값마다 새로운 객체를 필요로 하기 때문에, 메모리 누수와 새로운 객체를 계속 생성해야 하기 때문에 성능 저하를 발생시킬 수 있다. (이걸 실무에서 직접적으로 겪은 적은 없는데, 아이러니 하게도, 코딩테스트를 하다가 겪은 적이 있다.... String 을 쓰면 시간 초과인데, StringBuilder 를 쓰면 통과가 됐다.)
'개발 관련 > java' 카테고리의 다른 글
HashTable vs HashMap (0) | 2022.07.14 |
---|---|
클래스 vs 인스턴스 (0) | 2022.07.14 |
자바 비동기 (2) (0) | 2022.07.14 |
자바 비동기 (1) (0) | 2022.07.14 |
캡슐화(encapsulation) (0) | 2022.07.14 |