[Java] 객체를 다룰 때의 참조(reference)와 값 복사의 차이

뿌이·2024년 9월 20일
0

Java 개념

목록 보기
18/19

기본 데이터 타입 (int, double, boolean 등):

변수에 값을 할당하면 그 값은 복사됩니다.
예를 들어, int a = 5; 하고, int b = a;를 하면 b는 a의 값을 복사해서 받습니다. 이후 b를 변경해도 a에는 영향이 없습니다.

객체 타입 (String, Array, List 등):

객체는 참조를 공유합니다.
예를 들어, List<String> list1 = new ArrayList<>(); 하고, List<String> list2 = list1;를 하면 list2list1과 같은 객체를 참조하게 됩니다. 이제 list2에서 값을 추가하거나 삭제하면, list1에서도 동일한 변화가 보입니다.

String 주의사항

Java의 모든 데이터 타입:

Java에서는 String도 객체입니다. 모든 객체는 참조 타입입니다. 그래서 String은 객체 타입에 포함됩니다. 즉, String 변수는 문자열 객체를 참조합니다.

불변 객체 (Immutable):

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"를 참조하고 있습니다.

중요한 점:

기본 타입은 값 자체를 복사해서 사용하므로, 서로 영향을 주지 않습니다.
객체 타입은 참조(원본)를 공유하므로, 하나의 객체를 여러 곳에서 사용하면 그 객체에 변화가 있으면 모든 참조가 영향을 받습니다.

profile
기록이 쌓이면 지식이 된다.

0개의 댓글

관련 채용 정보