본문 바로가기

카테고리 없음

자바 배열의 복사: 깊은 복사와 얕은 복사 방법 비교

1. 자바 배열 복사란?

자바에서 배열을 복사하는 것은 원래 배열의 값들을 다른 배열에 복제하는 작업을 말합니다. 배열 복사는 동일한 데이터를 다른 변수로 사용하거나 배열의 일부분을 추출하기 위해 필요한 작업입니다. 자바에서는 배열을 복사하는 두 가지 방법이 있습니다: 얕은 복사와 깊은 복사.

자바의 배열은 객체로 취급되기 때문에, 배열 변수는 배열이 저장된 메모리 공간의 주소를 가리킵니다. 따라서 배열을 복사하면 원본 배열과 복사본 배열은 같은 메모리 주소를 참조하게 되는데, 이를 얕은 복사라고 합니다. 반면에 깊은 복사는 원본 배열과 완전히 별개의 배열을 생성하여 각각의 배열이 독립적인 메모리 주소를 가지고 있는 것을 말합니다.

얕은 복사는 복사본 배열에서 원본 배열의 값을 변경하면 원본 배열도 영향을 받게 됩니다. 이는 얕은 복사가 원본 배열의 주소를 참조하고 있기 때문입니다. 반면에 깊은 복사는 복사본 배열에서 값을 변경하더라도 원본 배열은 영향을 받지 않습니다. 이는 깊은 복사가 새로운 배열을 생성하여 독립적인 메모리 주소를 가지고 있기 때문입니다.

다음으로, 얕은 복사와 깊은 복사의 차이점과 각각의 장단점에 대해 더 자세히 알아보겠습니다.

2. 얕은 복사 (Shallow Copy)

얕은 복사는 원본 배열과 복사본 배열이 동일한 메모리 주소를 참조하는 복사 방식입니다. 얕은 복사는 단순히 배열 변수의 값을 복사하여 새로운 배열 변수에 할당하는 것을 의미합니다.

자바에서 배열을 얕은 복사하는 방법은 다음과 같습니다.

int[] originalArray = {1, 2, 3, 4, 5};
int[] copiedArray = originalArray; // 얕은 복사

원본 배열과 복사본 배열은 동일한 배열을 참조하고 있습니다. 따라서, 복사본 배열에서 값을 변경하면 원본 배열도 동일하게 변경되는 특징이 있습니다. 이는 원본 배열과 복사본 배열이 같은 주소를 참조하고 있기 때문입니다.

얕은 복사의 장점은 배열의 크기가 큰 경우에도 빠르게 복사할 수 있다는 점입니다. 그러나 원본 배열과 복사본 배열은 같은 값을 공유하기 때문에 한 쪽에서 값을 변경하면 다른 쪽도 변경되는 문제가 발생할 수 있습니다. 이러한 문제를 피하기 위해 깊은 복사를 사용해야 할 수도 있습니다.

다음으로, 깊은 복사에 대해 알아보겠습니다.

3. 깊은 복사 (Deep Copy)

깊은 복사는 원본 배열과 복사본 배열이 서로 다른 메모리 주소를 가지는 복사 방식입니다. 깊은 복사는 복사본 배열을 생성하여 각각의 배열이 독립적인 값을 가지고 있는 것을 의미합니다.

자바에서 배열을 깊은 복사하는 방법은 다양한 방법이 있습니다. 여기에서는 System.arraycopy() 메서드를 사용하는 방법을 소개하겠습니다.

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

System.arraycopy(originalArray, 0, copiedArray, 0, originalArray.length);

위의 예시에서 System.arraycopy() 메서드는 originalArray의 0번 인덱스부터 copiedArray의 0번 인덱스로 originalArray.length 만큼의 요소를 복사합니다. 이렇게 함으로써 copiedArrayoriginalArray와 같은 값을 가지지만, 서로 다른 메모리 공간을 참조하게 됩니다.

깊은 복사의 장점은 원본 배열과 복사본 배열이 독립적인 값을 가지고 있어서 한 쪽에서 값을 변경해도 다른 쪽은 영향을 받지 않는다는 점입니다. 그러나 배열의 크기가 큰 경우에는 얕은 복사보다 비용이 높을 수 있습니다.

자바에서 배열을 깊은 복사하는 다른 방법으로는 Arrays.copyOf() 메서드나 clone() 메서드 등을 사용할 수도 있습니다. 각각의 방법은 용도와 성능에 따라 선택하여 사용할 수 있습니다.

자바에서 배열을 복사할 때, 얕은 복사와 깊은 복사의 차이점과 각각의 장단점을 고려하여 사용하는 것이 중요합니다. 용도와 상황에 따라 적절한 복사 방식을 선택하여 원하는 동작을 구현할 수 있도록 하세요.