티스토리 뷰

※ 배열 복사 

- 배열은 한 번 생성하면 크기를 변경할 수 없다.

- 더 많은 저장 공간이 필요하다면 보다 큰 배열을 새로 만들고 이전 배열로부터 항목값들을 복사해야 한다.

-> 그렇다면 배열 복사 방법은?


1. for문을 이용하는 방법 

int[] oldStrArray = {1, 2, 3};
String[] newStrArray = new String[5];

for(int i = 0; i < oldStrArray.length; i++){
	newStrArray[i] = oldStrArray[i];
}

 

 

2. System.arrayCopy() 메소드를 이용하는 방법

String[] oldStrArray = {"java", "array", "copy"};
String[] newStrArray = new String[5];

System.arraycopy(oldStrArray, 0, newStrArray, 0, oldStrArray.length);

[shallow copy vs deep copy]

- 참조 타입 배열일 경우, 배열 복사가 되면 복사되는 값이 객체의 번지이므로 새 배열의 항목은 이전 배열의 항목이 참조하는 객체와 동일하다. 이것을 얕은 복사(shallow copy)라고 한다. 반대로 깊은 복사(deep copy)는 참조하는 객체도 별도로 생성하는 것을 말한다. 

 

▶ 얕은 복사 :

- 실제로는 하나의 주소 값을 가지고 있으므로 하나라고 볼 수 있다. 

- 복사된 배열이나 원본 배열이 변경될 때 서로 간의 값이 같이 변경됩니다. 

 

 깊은 복사 :

- 객체의 실제 값을 새로운 객체로 복사하는 것이다. 

- 복사된 배열이나 원본 배열이 변경될 때 서로 간의 값은 바뀌지 않습니다. 

 

 

3. Arrays 클래스 이용 방법 

 

※ Object.clone()

int[] a = {1,2,3};
int[] b = a.clone();

 

※ Arrays.copyOf()

int[] a = {1,2,3};
int[] b = Arrays.copyOf(a, a.length);

 

- Arrays 클래스는 배열을 조작할 수 있는 메소드를 가진 클래스이다.

이 클래스 안에 Arrays.copyOf()를 사용하면 배열의 시작점 ~ 원하는 길이까지 배열의 깊은 복사를 할 수 있다. 

 

※ Arrays.copyOfRange()

int[] a = {1, 2, 3};;
int[] b = Arrays.copyOfRange(a, 1, 3);

- 복사할 배열의 시작점 ~ 원하는 길이를 지정할 수 있다.