프로그래머스 문제를 풀다 StringBuilder배열을 만들고 반복문을 돌며 특정 요소에 append하는 로직을 만들었다.
append하기 위해선 각 요소에 StringBuilder객체를 초기화해야했고 Arrays.fill() 메서드를 사용해 초기화했다.
Arrays.fill(temp, new StringBuilder());
그런데 이후 특정요소에 append()하면 모든 요소의 StringBuilder에 append되는 것을 확인했다. 무엇이 원인일까 생각해보았고 Arrays.fill() 메서드에 객체를 매개변수로 전달하면 각 요소는 해당 객체를 얕은 복사하기 때문일 것으로 생각했다.

문서를 자세히 보면 특정된 객체의 참조를 각 요소에 할당한다고 되어있다..^^

ChatGPT에 물어봐도 같은 답변을 준다.
결론은 Arrays.fill()에 참조 타입을 매개변수로 넘기면 각 요소는 깊은 복사가 아닌 매개변수로 전달된 객체의 참조를 다같이 얕은 복사해서 가져가게 된다는 것이다. 사용에 유의하자.
'Language > Java' 카테고리의 다른 글
| [Java] TreeSet에 중복된 값을 넣어야한다면? (1) | 2024.03.15 |
|---|---|
| The method sort(int[]) in the type Arrays is not applicable for the arguments (int[], Collections.reverseOrder()) (0) | 2023.11.28 |
| 메서드 내에서 포장객체의 값을 변경한다면? (0) | 2023.04.25 |
| Java Raw Type의 정의와 사용 시 문제점 (0) | 2023.04.03 |
| Java Garbage Collector의 수집 대상이 되기 위해 참조만 끊으면 되는 걸까? (0) | 2023.03.31 |