728x90
반응형
배열 복사에는 얕은 복사(Shallow Copy)와 깊은 복사(Deep Copy)가 있다.
얕은 복사, Shallow Copy
- 참조 대상의 참조값(주소값)만 복사되는 현상
- 데이터를 저장하고 있는 공간(new로 생성된 공간)이 복사되지 않는다.
- 원본, 사본 참조 변수 둘 다 같은 메모리공간(Heap메모리공간)을 참조하게 된다.
public class ArrayCopy_01 {
public static void main(String[] args) {
//배열 복사하기
int[] arr1 = {10, 20, 30};
int[] arr2;
arr2 = arr1; //얕은 복사
for(int i=0; i<arr2.length; i++) {
System.out.println(arr1[i] + " : " + arr2[i]);
}
arr1[1] = 777; //arr1의 1번째 요소만 데이터 변경
System.out.println("--- 1번째 요소값 변경 후 ---");
for(int i=0; i<arr2.length; i++) {
System.out.println(arr1[i] + " : " + arr2[i]);
}
}
}
====================================================
결과
10 : 10
20 : 20
30 : 30
--- 1번째 요소값 변경 후 ---
10 : 10
777 : 777
30 : 30
Line 14를 보자. arr1[1] = 777; 분명 바꾼 건 arr1의 1번째 요소인데 결과는 arr2[1]도 같이 바뀌었다. 한쪽을 수정하면 다른 쪽도 같이 바뀌는 즉, 같은 메모리공간(Heap메모리공간)을 참조한다. 배열 복사를 한다고 했을 때 이런 것을 원하지는 않았을 거라 생각한다.
배열 복사를 한다는 것은 주로 깊은 복사를 의미한다.
깊은 복사, Deep Copy
- 참조 대상의 내용물(Heap메모리공간)을 새로운 공간에 복사하는 것
- 원본 데이터의 분리된 저장공간을 가지게 된다
** for문을 이용한 데이터 복사
public class ArrayCopy_02 {
public static void main(String[] args) {
//배열 복사하기 - 깊은 복사
int[] arr1 = {10, 20, 30}; //원본, Source
int[] arr2; //사본, Destination
// 1. 복사될 공간을 새로 생성한다
arr2 = new int[arr1.length];
// 2. 데이터를 복사한다. (for문 이용)
for(int i=0; i<arr2.length; i++) {
arr2[i] = arr1[i]; //사본 <- 원본
}
//----------------------------
for(int i=0; i<arr2.length; i++) {
System.out.println(arr1[i] + " : " + arr2[i]);
}
arr1[1] = 777; //arr1의 1번째 요소만 데이터 변경
System.out.println("--- 1번째 요소값 변경 후 ---");
for(int i=0; i<arr2.length; i++) {
System.out.println(arr1[i] + " : " + arr2[i]);
}
}
}
==============================
10 : 10
20 : 20
30 : 30
--- 1번째 요소값 변경 후 ---
10 : 10
777 : 20
30 : 30
- Line 9 - arr2 = new int[arr1.length] -> arr1의 길이만큼의 새로운 공간을 arr2에 대입한다.
- 그다음에 arr1(원본)을 arr2(사본)에 복사한다.
- Line 22 - 얕은 복사와 같은 조건으로 arr1의 1번째 요소를 바꿔보았다.
- 결과는 arr1[1]만 바뀌었고 arr2[1]은 그대로이다.
** System.arraycopy() 메소드를 이용한 배열 복사
System.arraycopy(Object src, int srcPos, Objec dest, int destPos, int length);
- src : 원본 배열
- srcPos : 원본 배열에서 복사할 항목의 시작 인덱스
- dest : 새 배열, 사본 배열
- destPos : 사본 배열에서 붙여넣을 시작 인덱스
- length : 복사할 개수
public class ArrayCopy_03 {
public static void main(String[] args) {
int[] arr1 = {10, 20, 30};
int[] arr2;
//깊은 복사
// 1. 복사할 공간 새로 생성하기
arr2 = new int[arr1.length];
// 2. 데이터 복사 (System.arraycopy()메소드를 이용)
System.arraycopy(arr1, 0, arr2, 0, arr1.length);
//arr1의 0번째 인덱스부터 arr2의 0번째 인덱스에 arr1.length만큼 복사한다
//----------------------------
for(int i=0; i<arr2.length; i++) {
System.out.println(arr1[i] + " : " + arr2[i]);
}
arr1[1] = 777; //arr1의 1번째 요소만 데이터 변경
System.out.println("--- 1번째 요소값 변경 후 ---");
for(int i=0; i<arr2.length; i++) {
System.out.println(arr1[i] + " : " + arr2[i]);
}
}
}
=================================
10 : 10
20 : 20
30 : 30
--- 1번째 요소값 변경 후 ---
10 : 10
777 : 20
30 : 30
두 가지 방법 중 적당한 것을 골라 쓰면 된다.
반응형
'개발 > 자바' 카테고리의 다른 글
자바 상속, Inheritance / 오버라이딩, Overriding / super / final / 다형성 / for each 구문 (0) | 2021.01.25 |
---|---|
자바 다차원배열 (0) | 2021.01.21 |
자바 배열이란? // 배열 정렬, Bubble Sort (0) | 2021.01.19 |
자바 {맥북} 내가 자주 사용하는 이클립스 단축키 정리. (0) | 2021.01.17 |
자바 if문과 switch문을 비교해보자. (0) | 2021.01.17 |
댓글