특정 로직에서 배열 or 리스트를 반복문을 돌려
배열 or 리스트 안 요소를 활용하여
반복하는 대상인 원본 배열 or 리스트에는
영향을 주지 않고 데이터를
가공해야 하는 경우가 있을 수 있다.
이런 경우에 보통 배열 or 리스트를 복사하여
복사한 대상을 가공하는데 여기서 원본 대상에는
영향을 주지 않으려면 얕은 복사가 아닌 깊은 복사를 해야
원본에는 영향을 주지 않는다.
// 배열 Array (얕은 복사)
int[] ogArr = {1, 2, 3}; // 원본 배열
int[] sCopyArr = ogArr; // 새 배열에 얕은 복사
sCopyArr[1] = 777;
/* 윗 줄에서 복사한 배열의 1번째 인덱스에 새 정수 777을 담았는데
원본 배열에도 영향을 줘서 아래와 같이 출력 됨 */
System.out.println(Arrays.toString(ogArr)); // 원본 배열 : [1, 777, 3]
System.out.println(Arrays.toString(sCopyArr)); // 얕은 복사한 배열 : [1, 777, 3]
// 배열 Array (깊은 복사)
int[] ogArr = {1, 2, 3}; // 원본 배열
int[] dCopyArr = Arrays.copyOf(ogArr, ogArr.length); // 새 배열에 깊은 복사
dCopyArr[1] = 777;
/* 윗 줄에 복사한 배열의 1번째 인덱스에 새 정수 777 을 담아도
원본 배열에는 영향을 주지 않아서 아래와 같이 출력 됨 */
System.out.println(Arrays.toString(ogArr)); // 원본 배열 : [1, 2, 3]
System.out.println(Arrays.toString(dCopyArr)); // 깊은 복사한 배열 : [1, 777, 3]
// 리스트 List (얕은 복사)
List<String> ogList = new ArrayList<>(); // 원본 리스트
ogList.add("사과");
ogList.add("바나나");
List<String> sCopyList = ogList; // 새 리스트에 얕은 복사
sCopyList.add("오렌지");
/* 윗 줄에서 복사한 리스트에 새로운 요소를 추가 (add) 했지만
원본 리스트에도 영향을 줘서 아래와 같이 출력 됨 */
System.out.println(ogList); // 원본 리스트 : [사과, 바나나, 오렌지]
System.out.println(sCopyList); // 얕은 복사한 리스트 : [사과, 바나나, 오렌지]
// 리스트 List (깊은 복사)
List<String> ogList = new ArrayList<>(); // 원본 리스트
ogList.add("사과");
ogList.add("바나나");
List<String> dCopyList = new ArrayList<>(ogList); // 새 리스트에 깊은 복사
dCopyList.add("오렌지");
/* 윗 줄에서 복사한 리스트에 새로운 요소를 추가 (add) 했지만
원본 리스트에도 영향을 줘서 아래와 같이 출력 됨 */
System.out.println(ogList); // 원본 리스트 : [사과, 바나나]
System.out.println(dCopyList); // 깊은 복사한 리스트 : [사과, 바나나, 오렌지]
반응형
최근댓글