불변객체라고 부른다. Java에만 있는 개념은 아니고, 일반적으로 왠만한 언어에는 다 있는 개념이다.
간단히 설명하면 immutable object는 최초에 생성된 뒤 변화할 수 없는 객체이다.
대조적으로 mutable object는 수정이 가능하다.
String s = "ABCDEC";
s.toLowerCase();
toLowerCase는 "ABCDE"를 바꾸는 것이 아니라 "abcde"라는 새로운 String 객체를 생성한다.
(jdk소스를 보면 return new String(result, 0, len + resultOffset); 와 같이 되어있다.)
유사한 immutable로는 Integer, Long, Short, Double, Float, Character, Byte, Boolean등의 Primitive wrapper가 있다. 이러한 immutable object들은 thread-safe와 보안의 목적으로 자주 사용된다.
인위적으로 불변객체를 만들어서 값의 변경이 불가능하도록 하는 것도 가능하지만 생각보다 귀찮은 방법이다.
(방어복사 : defensive copying)
간략하게 설명하면 class와 멤버변수를 final로 정의하고, setter메소드를 없앤다.
또한 getter메소드에서 값을 반환할 때 clone을 생성하여 반환하도록 한다.
(만약에 멤버변수가 객체라면 해당객체를 deep copy해야 보다 완벽할 듯)
immutable object에는 많은 장점이 있다.
- 기본적으로 thread safe하고
- 동기화작업에서 이점이 있다. (lock을 걸 필요가 없다.)
- 또한 안정한 공유,재사용이 되기 때문에 cache를 사용하여 성능향상 및 메모리 효율을 도모한다.
- 이러한 공유는 복잡도를 감소시킨다. O(n) => O(1)
다만 대량 작업을 수행할때 몇가지 속도에 단점이 있어서 튜닝이 필요한 부분들이 있었다.
- concatenation연산이 새로운 객체생성으로 인한 비용이 비싼편이다. 물론 1.6이후였나? StringBuilder를 사용하기 떄문에 대부분 해소가 된다.
- 반복적인 new copy의 경우 메모리 소모가 매우 증가한다. 100만번 loop문을 수행하면 @.@
내가 수행하고자 하는 업무의 특성에 따라 맞게 사용하면 될 듯한데, WAS상의 온라인업무에서는 적극 활용되는 모습니다.
참고(http://stackoverflow.com/questions/9544182/why-are-strings-immutable-in-many-programming-languages)
'Java' 카테고리의 다른 글
Oracle 11g JDBC Driver에서 Hang이 발생하는 경우 (0) | 2017.02.20 |
---|---|
FTP connection reset에 관련된 오류해결 (0) | 2016.04.05 |
Spring 과 Java의 ThreadPool 구현차이 (0) | 2015.06.30 |
volatile키워드와 동기화, Atomic 타입 (0) | 2014.11.07 |
Abstract Classes vs Interfaces (0) | 2014.10.28 |