본문 바로가기
👋국비 후기 모음👋 (이력도 확인 가능!)
개발/자바

자바 배열 복사

by 킴뎁 2021. 1. 20.
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() 메소드를 이용한 배열 복사

docs.oracle.com/javase/8/docs/api/java/lang/System.html#arraycopy-java.lang.Object-int-java.lang.Object-int-int-

 

System (Java Platform SE 8 )

Sets the system property indicated by the specified key. First, if a security manager exists, its SecurityManager.checkPermission method is called with a PropertyPermission(key, "write") permission. This may result in a SecurityException being thrown. If n

docs.oracle.com

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

 

두 가지 방법 중 적당한 것을 골라 쓰면 된다.

반응형
👋국비 후기 모음👋 (이력도 확인 가능!)

댓글