변수에 값을 할당하면 그 값은 복사됩니다.
예를 들어, int a = 5; 하고, int b = a;를 하면 b는 a의 값을 복사해서 받습니다. 이후 b를 변경해도 a에는 영향이 없습니다.
객체는 참조를 공유합니다.
예를 들어, List<String> list1 = new ArrayList<>();
하고, List<String> list2 = list1;
를 하면 list2
는 list1
과 같은 객체를 참조하게 됩니다. 이제 list2
에서 값을 추가하거나 삭제하면, list1
에서도 동일한 변화가 보입니다.
Java에서는 String도 객체입니다. 모든 객체는 참조 타입입니다. 그래서 String은 객체 타입에 포함됩니다. 즉, String 변수는 문자열 객체를 참조합니다.
String 객체는 불변입니다. 즉, 한 번 생성된 String 객체는 그 내용이 변경될 수 없습니다. 예를 들어, String에 대해 replace()와 같은 메서드를 호출하면, 원본 String은 변하지 않고, 수정된 내용으로 새로운 String 객체가 생성됩니다.
다른 객체들, 예를 들어 Array, List, Map 등은 동일한 객체를 여러 변수에서 참조할 수 있습니다. 이 경우, 하나의 변수에서 객체를 변경하면 다른 변수에서도 그 변경 사항이 반영됩니다.
하지만 String은 불변이기 때문에, 새로운 내용을 가진 문자열을 생성할 때마다 새로운 객체가 생성됩니다.
String은 객체 타입이지만, 불변이기 때문에 다른 객체와는 다르게 동작합니다.
String은 참조를 공유할 수 있지만, 문자열의 내용을 변경하려고 하면 새로운 String 객체가 생성됩니다.
그래서 리스트.toString();
와 리스트.toString() .replaceAll("\\{.*?Exception=.*?\\]", "")
는 서로 다른 String 객체가 됩니다.
String greeting = "Hello";
String anotherGreeting = greeting; //두 변수 모두 동일한 "Hello" 문자열 객체를 가리킵니다.
anotherGreeting = "Hi";
//위 코드가 실행되면, anotherGreeting은 이제 "Hi"라는 새로운 문자열 객체를 참조하게 됩니다.
//그러나 greeting은 여전히 "Hello"를 참조하고 있습니다.
기본 타입은 값 자체를 복사해서 사용하므로, 서로 영향을 주지 않습니다.
객체 타입은 참조(원본)를 공유하므로, 하나의 객체를 여러 곳에서 사용하면 그 객체에 변화가 있으면 모든 참조가 영향을 받습니다.