불변객체란 생성된 이후 절대로 변하지 않는 객체를 의미한다.
자바에서 대표적인 불변 객체로는 string 객체와 wrapper 객체를 말할 수 있다.
String str = new String("str");
str은 String객체로 불변 객체이다. 이는 곧 str안에 들어가 있는 "str"은 변경,수정이 불가능하다는 의미이다. 그렇다면 str안에 값을 다른값(예를들어 "str1")으로 만들고 싶다면 어떻게 해야 할까?
String str = new String("str1");
위와 같이 기존에 가리키고 있던 str을 가리키지 않고 새롭게 생성된 str1을 가리키게 해야 한다.
그렇기 때문에 string을 조작할 경우 이 불변성을 꼭 고려해야 한다.String str = new String("str1"); for(int i=0;i<100;i++){ str+="+"; }
위와 같은 문장을 해석해보자
str객체는 처음에 str1을 가리키고 있었고, 가리키는 것이 for문을 통해 100번 바뀌는 것을 알 수 있다.(for문이 1번 돌 때 마다 기존에 가리키고 있던 문자열을 안 가리키고 새로운 문자열(+가 추가된)을 가리키게 된다.
이는 불변성을 고려하지 못한 케이스이다.(성능이 매우 느림)
방법은 없다.
String은 무조건 불변성을 가지기 때문이다.
따라서 String을 불변성 없이 사용하고 싶다면 String 대신 StringBuffer, StringBuilder를 사용해야 한다.
'변경이 가능한 문자열' 이다. 즉, String과 달리 자신이 가진 문자열 값을 변경하고 수정할 수 있다는 뜻이다. 이렇게 변경이 가능한 문자열을 사용하는 이유는 성능을 높이기 위함도 있지만 StringBuffer와 StringBuilder는 문자열을 다루기 편리한 함수들을 제공한다.
즉, 문자열을 좀 더 편리하고 자유롭게 다루고 싶을 때 혹은 문자열을 자주 수정할 경우 사용한다.
- append(값) -> 문자열을 맨뒤에 추가해주는 함수
- insert(인덱스,값) -> 인덱스 위치에 값을 삽입해주는 함수
- delete(인덱스,인덱스) -> 시작인덱스 ~ 끝 인덱스까지 삭제해주는 함수
- indexOf(값) -> 해당 값이 어떤 인덱스인지 알려줌
- substring(인덱스) -> 인덱스~끝 혹은 인덱스,인덱스인경우 인덱스~인덱스의 부분 문자열을 반환
- length() -> 길이 반환
- replace() ->
- reverse() -> 문자열을 거꾸로 바꿈
동기화의 유무 이다.
- StringBuffer는 동기화 키워드를 지원하여 멀티쓰레드 환경에서 안전하다.
- StringBuilder는 동기화를 지원하지 않기때문에 멀티쓰레드 환경에서 사용하는 것은 적합하지 않다.(단일 쓰레드일 경우 StringBuffer보다 성능이 뛰어나다)
- String의 경우 불변성으로 인해 멀티쓰레드 환경에서 안전하다.