아래의 소스 코드 실행시 동일하게 참조변수로써 주소값을 인자로 넘겨주는데
어째서 String str은 값이 변하지 않고 String[] str2는 값이 변화하게 되는것인가요?
출력값은 str은 "aa" 이고 str2는 "아" 입니다
```
public class Test5 {
static String set(String str) {
return str = "아";
}
static String set(String[] str) {
return str[0] = "아";
}
public static void main(String[] args) {
String str = "aa";
String[] str2 = new String[10];
set(str);
set(str2);
System.out.println(str);
System.out.println(str2[0]);
}
}
```
sehongpark님의 답변
## 조금 특별한 자바 String
### 요약
쌍따옴표를 사용하여 문자열을 선언한 경우 매개변수를 통해 값을 변경 할 수 없습니다.
### 설명
자바 String은 JVM이 직접 관리하는 특별한 객체입니다.
아래와 같은 형식으로 문자열을 선언한 경우, 해당 문자열은 JVM에 의해 `global string table`로 관리되어 집니다.
```
String str1 = "something";
String str2 = "something";
```
왜 전역변수로 관리할까요? 중복되는 메모리 낭비를 막기 위함입니다. 따라서 위 코드의 경우, 하나의 문자열 객체만 생성됩니다.
JVM의 관리가 아닌 개별관리를 원한다면, 아래의 방식을 사용해야합니다.
```
String str3 = new String("something);
```
질문하신 문제는 위와 같은 이유로 발생되었습니다.