HwangHub

[Java] Immutable한 문자열 본문

DEV-STUDY/Java

[Java] Immutable한 문자열

HwangJerry 2023. 7. 2. 16:56

지금까지 문자열 변수에 +를 이용하여 문자열을 수정해 왔다.

 

하지만 문자열은 Immutable(불변)하다는 말을 계속 들어왔는데, 나는 계속 수정을 해왔기에 이 말이 제대로 와닿지 않았었다.

 

자바에서는 문자열 타입의 데이터에 + 연산을 시도할 경우, 내부적으로 기존 문자열과 더해지는 문자열을 합친 문자열을 Heap에 새로 생성한 뒤, 해당 주소값을 반환되는 String 타입의 변수에 저장하게 된다. (String 타입도 referece type이므로)

 

public class Main {
    public static void modify(String s) {
        s += "apple";
    }

    public static void main(String[] args) {
        String str = "banana";
        modify(str);
        System.out.print(str); // banana
    }
}

위 코드를 예로 들면, str에 저장된 "banana"에 "apple"이라는 문자열을 합치는 과정은, 자바 내부적으로 "bananaapple"이라는 문자열을 heap에 새로 생성한 뒤, String s에 해당 주소값을 할당해주게 된다.

 

더하여, 자바는 call by value방식으로 함수를 수행하므로, modify 함수의 String s와 main 함수의 String str은 stack 내에서 서로 다른 영역에 저장된 개별적인 변수이니, 위의 str출력값은 여전히 banana이다. modify함수를 통해 str 값을 수정하고 싶다면 반환값을 이용하여 String s가 갖게 된 "bananaapple"을 가리키는 주소값을 str에 담아줘야 한다.

public class Main {
    public static String modify(String s) {
        s += "apple";
        return s;
    }

    public static void main(String[] args) {
        String str = "banana";
        str = modify(str);
        System.out.print(str); // bananaapple
    }
}

'DEV-STUDY > Java' 카테고리의 다른 글

[Java] int 배열 정렬  (0) 2023.07.04
[Java] scope rule  (0) 2023.07.03
[Java] call by value, call by reference  (0) 2023.07.02
[Java] 숫자 character의 아스키 코드  (0) 2023.07.01
[Java] 문자열의 .charAt(), .length() 메서드  (0) 2023.06.30
Comments