본문 바로가기
Programming/Java * Spring

[Java] 02. 배열의 복사(Arrays.copy)

by 고막고막 2019. 3. 15.

배열 복사하는 방법

1. HashCode값 복사 (얕은 복사)

scores의 해시코드 값이 scores1, scores2에 복사된다. 스택의 같은 공간에 접근함으로 힙에 담겨있는 값을 가져오게 된다. 따라서 기존 배열인 scores가 변경되었을때 이를 복사한 scores1, scores2에서도 변경된 값을 참조하게 된다.

int[] scores = {100,85,95,65,75};
int[] scores1 = scores;	// 해시코드 값이 복사됨(같은 공간을 참조)
int[] scores2 = scores1;	// 해시코드 값이 복사됨(같은 공간을 참조)
for(int i=0;i<scores2.length;i++)
  System.out.print(scores2[i]+", ");

System.out.println();
System.out.println(scores);
System.out.println(scores1);
System.out.println(scores2);

// 얕은 복사일때 나타는 현상
// 동일한 공간이기 때문에 다른 배열에서도 수정하는 값을 참조하게 된다
scores[0] = 30;
System.out.println(scores1[0]);
System.out.println(scores2[0]);

2. Arrays.copyOf (깊은 복사)

scores1, scores2에 새로운 힙 공간이 할당되므로 score과 다른 해시코드를 가지게 된다. 기존 배열에 변경이 있어도 복사된 배열은 영향을 받지 않는다.

int[] scores4 = Arrays.copyOf(scores, scores.length);
for(int i=0;i<scores4.length;i++)
  System.out.print(scores4[i]+", ");
scores[0] = 70;
System.out.println(scores4[0]);
System.out.println(scores);
System.out.println(scores4);

3. System.arraycopy

System.arraycopy(src, srcPos, dest, destPos, length);

지정된 위치(srcPos)에서 시작해 지정된 소스(src)의 배열을 대상 배열(dest)의 지정된 위치(destPos)에 지정 길이(legth)만큼 복사한다.

int[] arr = {1, 2, 3, 4, 5};
int[] temp = {1, 2, 0, 0, 0};
System.arraycopy(arr, 2, temp, 2, 3);
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(temp));