본문 바로가기
카테고리 없음

자바 배열을 복사하는 다양한 방법 (깊은복사, 얕은복사)

by sftt 2023. 12. 6.

배열 복사란?

배열 복사는 하나의 배열의 내용을 다른 배열로 옮기는 작업을 의미합니다. 복사 방법에는 깊은 복사와 얕은 복사 두 가지가 있습니다. 깊은 복사는 배열의 모든 요소를 복사하여 독립적인 새로운 배열을 생성합니다. 반면에 얕은 복사는 배열의 주소만 복사하여 두 배열이 같은 메모리를 참조하게 됩니다. 이러한 차이로 인해 원본 배열 혹은 복사된 배열의 요소를 수정했을 때 얕은 복사에서는 원본과 복사본이 영향을 주고 받지만, 깊은 복사에서는 서로 영향을 주지 않습니다.

깊은 복사 (Deep Copy)

배열의 깊은 복사는 배열의 모든 요소를 복사하여 독립적인 새로운 배열을 생성하는 방법입니다. 자바에서는 System 클래스의 arraycopy() 메소드나 clone() 메소드를 사용하여 깊은 복사를 수행할 수 있습니다.

1. System.arraycopy() 메소드 사용

System.arraycopy() 메소드를 사용하면 기존 배열의 모든 요소가 새로운 배열로 복사됩니다. 이 메소드는 다음과 같은 구조를 가지고 있습니다.

public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
  • src: 복사할 원본 배열
  • srcPos: 복사를 시작할 원본 배열의 인덱스
  • dest: 복사한 요소를 저장할 새로운 배열
  • destPos: 복사된 요소를 저장할 새로운 배열의 시작 인덱스
  • length: 복사할 요소의 개수

아래는 System.arraycopy() 메소드를 사용한 깊은 복사의 예시입니다.

int[] sourceArray = {1, 2, 3, 4, 5};
int[] targetArray = new int[sourceArray.length];

System.arraycopy(sourceArray, 0, targetArray, 0, sourceArray.length);

// sourceArray와 targetArray는 서로 다른 메모리를 참조하며, 요소 역시 같은 값으로 복사됩니다.

2. clone() 메소드 사용

clone() 메소드를 사용하면 배열 전체를 복사하여 새로운 배열을 생성합니다. clone() 메소드는 복사 대상 배열 객체에 대해 호출되어야 합니다. 아래는 clone() 메소드를 사용한 깊은 복사의 예시입니다.

int[] sourceArray = {1, 2, 3, 4, 5};
int[] targetArray = sourceArray.clone();

// sourceArray와 targetArray는 서로 다른 메모리를 참조하며, 요소 역시 같은 값으로 복사됩니다.

얕은 복사 (Shallow Copy)

배열의 얕은 복사는 배열의 주소만 복사하여 두 배열이 같은 메모리를 참조하게 하는 방법입니다. 자바에서는 = 연산자를 사용하여 얕은 복사를 할 수 있습니다.

int[] sourceArray = {1, 2, 3, 4, 5};
int[] targetArray = sourceArray;

// sourceArray와 targetArray는 같은 메모리를 참조하므로 한 쪽에서 요소를 수정하면 다른 쪽도 영향을 받습니다.

이와 같이 배열을 얕은 복사하면 원본 배열과 복사본이 같은 값을 가리키게 되기 때문에 한쪽 배열에서 요소를 수정하면 다른 배열도 같이 수정됩니다.

결론

배열을 복사하는 방법에는 깊은 복사와 얕은 복사 두 가지가 있습니다. 깊은 복사는 복사된 배열과 원본 배열이 서로 독립적으로 동작하게 되는 반면, 얕은 복사는 복사된 배열이 원본 배열과 같은 메모리를 참조하게 됩니다. 이에 따라 얕은 복사에서는 한 배열에서 요소를 수정하면 다른 배열도 그에 영향을 받지만, 깊은 복사에서는 서로 영향을 주지 않습니다.

댓글