String is immutable by fowler

앞에서 보았던 immutable, mutable object

불변? 가변? (단어 뜻 모르면 사전 찾아보세용~)

 

String immutable이고, StringBuffer mutable이다.

 

‘String 객체는 immutable이다라는 말은 한번 생성이 되면 String객체가 변할 수 없다는 얘기야.

 

public class ImmutableStrings

{

    public static void main(String[] args)

    {

        String start = "Hello";

        String end = start.concat(" World!");

        System.out.println(end);

    }

}

 

이 코드에서 보면, start“Hello”가 할당되었지? 이렇게 되면 새로운 String객체가 Heap안에 생성되었을 테고, start에는 그 string 객체에 대한 참조가 저장될 거야. 그렇지?

그 다음 라인에 보면 그 만들어진 String 객체에 대해 concat(String)이 호출 되었어.

 

concat( ) 메소드를 API에서 찾아보면,

 

concat

 

public String concat(String str)

Concatenates the specified string to the end of this string.

 

If the length of the argument string is 0, then this String object is returned. Otherwise, a new String object is created, representing a character sequence that is the concatenation of the character sequence represented by this String object and the character sequence represented by the argument string.

 

Examples:

 

"cares".concat("s") returns "caress"

"to".concat("get").concat("her") returns "together"

 

Parameters:

str - the String that is concatenated to the end of this String.

Returns:

a string that represents the concatenation of this object's characters followed by the string argument's characters.

 

이렇게 설명되어 있거든?

 

concat(), 이 넘은 문자열 끝에 문자열을 붙이는 메소드인데, 붙여질 문자열의 길이가 0 이면, 원래 있던 문자열(붙임을 당하려던 문자열)을 리턴하지만, 그렇지 않을 경우엔, 두 개의 문자열이 합쳐진(concatenate) 것이 새로 만들어진 String객체의 내용이 된데.

 

위에 있던 소스 코드를 예로 다시 설명해 볼까?

start.concat(“ world”); 이렇게 호출해서 문자열을 조합한다 해서, start 자체가 변하는 게 아니라 새로운 String 객체를 만들어서  start.concat(“ world”);의 결과인 “Hello world”를 넣게 된다는 거지.

 

원래 있던 "Hello" 객체를 바꾸는 게 아니라, 새로운 "Hello world"객체를 만든다는 얘기야.

(마찬가지로, String 객체에 변화를 주는 모든 메소드들이 원래 있던 객체를 변화시키는 듯 하지만, 사실은 새로운 객체를 만들어서 거기에 새로운 값을 주는 거야)

 

 

이런 처리는 연산자 (+)를 사용해도 똑같아. 한번 만들어진 String 객체는 변하질않지.

한번 만들어진 String객체는 변하지 않는 특성(immutable)을 가지기 때문에, 새로운 String객체를 만들어 거기에 새로 조합된 문자열을 담게 되는거야.

 

String 객체는 이렇게 디자인 되었어  변하지 않도록 말야.

 

이유?

 

immutable 객체가 말이지~

우선 간단하고,

thread-safe하고, (동기화 할 필요가 없다 이말이지)

내부 데이터를 자유롭게 공유할 수도 있고

 

등등의 장점이 있기 때문에... String을 이렇게 디자인 한 걸거야(100% 추측임;;)

 

왜 String이 immutable하냐는 질문에 다음 처럼 답변하는 사람도 있더라구..

"내가 고슬링한테 그렇게 시켰다" =) 

 

 

immutable한게 싫다고?? 

그럼 StringBuffer, Stringbuiler클래스를 찾아보세용~