java

자바 배열 복사 2가지를 기억하자

성꼼꾸똑 2021. 5. 17. 18:27

프로그래밍을 하다 보면 배열의 자료형 과 크기가 똑같은 배열을 새로 만들거나 배열의 모든 요소에 자료가 가득차게될 경우 더 큰 배열을 만들어 기존 배열의 저장된 자료를 가져오려 할 때 배열을 복사하게 되는데요.

배열 복사에는 두가지 방법이 있습니다. 첫번째는 for 문을 활용한 배열 복사이고 두번째는 System.arraycopy() 함수를 사용하여 하는 것 입니다.

우선 먼저 System.arraycopy() 함수를 알아보도록 하겠습니다.

System.arraycopy(src, srcPos, dest, destPos, length)의 매개변수를 가지는 함수로 각각의 매개변수의 대한 설명은 아래와 같습니다. 

배열 복사 함수를 사용할 경우 복사하려고 하는 대상 배열의 전체 길이가 복사할 요수 개수보다 작다면 오류가 발생이 됩니다. 배열 복사 함수를 사용하여 프로그래밍을 하는 경우 우리가 배열을 처음 사용할때 인스턴스를 생성해서 넣어야 하는 수고를 덜어줄 수 있어 간편합니다. 하지만 여기에 함정이 있는데요. 배열 복사 함수를 통해 배열을 복사 할 경우 객체 배열의 요소에 저장된 값은 인스턴스의 주소 값이기 때문에 객체 배열을 복사할 때 따 로 생성하는 것이 아닌 기존 인스턴스의 주소 값만 복사하게 되는 것이니 결국 두개의 다른 요소는 한개의 인스턴스를 보게 되는 것입니다.

 

 

주소값이 요소에 저장되게 되어 결국 값이 변경되면 복사를 한 요소의 값도 함께 변화가 됩니다.

이러한 방식의 배열 복사를 얕은 복사라고 합니다. 그렇다면 이렇게 얕은 복사 방식이 아닌 깊은 복사는 없을까?

고민이 되실 텐데 다음에 알려드릴 배열 복사 방식은 깊은 복사입니다.

깊은복사의 경우 인스턴스를 따로 관리 하고 싶다면 직접 인스턴스를 만들고 값을 복사해 주어야 합니다.

아래 예시를 보면 조금더 쉽게 이해가 되실듯 합니다.

 

위의 경우를 깊은 복사라 하며 각각 다른 인스턴스의 주소값을 참조 하고 있어 bookArray1에서 값을 변경하여도 bookArray2의 값은 변경이 되지 않았습니다. 그림으로 보면 아래와 같은 모양을 가지고 있을 것입니다.