배열 (복사)

Brogod97·2022년 12월 13일
0

KH TIL

목록 보기
12/37
post-thumbnail

배열 복사

얕은 복사

객체의 주소 값만 가져와 참조형 변수에 저장하고 하나의 객체를 두 변수가 참조하는 것

int[] arr1 = new int[4];
int[] arr2 = arr1;


얕은 복사 이클립스 실습

public class ArrayExample2 {
	
	// 얕은 복사 (shallow: 얕은)
	// => 주소를 복사하여 서로 다른 두 변수가 (같은 주소!!)
	// 하나의 배열(또는 객체)을 참조하는 상태를 만드는 복사 방법
	
	public void shallowCopy() {
		
		int[] arr = { 1, 2, 3, 4, 5 };
		
		// 얕은 복사 진행
		int[] copyArr = arr; // 주소만 복사
		
		System.out.println("copyArr 주소 확인 : " + copyArr); // copyArr 주소 확인 :[I@1eb44e46
		System.out.println("arr 주소 확인 : " + arr); // arr 주소 확인 : [I@1eb44e46
		
		// 배열 값 변경
		System.out.println("변경 전");
		System.out.println("arr: " + Arrays.toString(arr)); // arr: [1, 2, 3, 4, 5]
		System.out.println("copyArr: " + Arrays.toString(copyArr)); // copyArr: [1, 2, 3, 4, 5]
		
		// 얕은 복사한 배열의 값 변경
		copyArr[2] = 999;

		// 배열 값 변경 확인
		System.out.println("변경 후");
		System.out.println("arr: " + Arrays.toString(arr)); // arr: [1, 2, 999, 4, 5]
		System.out.println("copyArr: " + Arrays.toString(copyArr)); // copyArr: [1, 2, 999, 4, 5]
	}

깊은 복사

새로운 배열 객체를 생성하여 기존 배열의 데이터를 복사하는 것

→ 완전 복사이기 때문에 복사한 배열이 참조하고 있는 곳의 값을 변경해도 원본 배열의 값은 변경되지 않음

// 방법 1
for(int i = 0; i < arr1.length; i++) {
	arr2[i] = arr1[i];
}

// 방법 2
System.arraycopy(arr1, 0, arr2, 0, arr1.length);

// 방법 3
arr2 = Arrays.copyOf(arr1, arr1.length);

~~arr2 = arr1.clone();~~
// clonable을 재정의해서 규칙을 정해 쓰는 녀석이라 복잡하고,
// 무한대 복사될 수 있으므로 사용 안할 예정

깊은 복사 방법

  1. for문을 이용하여 데이터 하나씩 직접 복사하기
  2. System 클래스에 arraycopy() 메소드 이용하기
  3. Arrays 클래스에 copyOf() 메소드 이용하기

깊은 복사 이클립스 실습

public void deepCopy() {
		int[] arr = { 1, 2, 3, 4, 5 }; // 원본

		// 1. for문을 이용한 깊은 복사
		int[] copyArr1 = new int[arr.length]; // 5칸짜리 배열 생성

		for (int i = 0; i < arr.length; i++) {
			copyArr1[i] = arr[i];
		}
		
		// 2. System.arraycopy(원본배열, 원본 복사 시작 인덱스, 복사 배열, 복사배열 삽입 시작 인덱스, 복사길이) 
		int[] copyArr2 = new int[arr.length];
		System.arraycopy(arr, 0, copyArr2, 0, arr.length);

		// 3. Arrays.copyOf(원본 배열, 복사할 길이)
		int[] copyArr3 = Arrays.copyOf(arr, arr.length);
		
		// 값 변경 후 확인
		copyArr1[4] = 0;
		copyArr2[4] = 10;
		copyArr3[4] = 100;
		
		System.out.println("arr: " + Arrays.toString(arr));
		System.out.println("copyArr1: " + Arrays.toString(copyArr1));
		System.out.println("copyArr2: " + Arrays.toString(copyArr2));
		System.out.println("copyArr3: " + Arrays.toString(copyArr3));
	}

0개의 댓글