25.02.18 (화) 7일차 Java

허배령·2025년 2월 18일

괴발개발 TIL

목록 보기
7/54

배열

얕은 복사

객체의 주소 값만 가져와 참조형 변수에 저장하고 하나의 객체두 변수가 참조하는 것
원본이 바뀌면 복사본도 바뀐다!

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

arr1[2] = 100 이면 arr2[2] = 100 이다 (원본이 바뀌면 복사본도 바뀜)

int[] arr = {1, 2, 3, 4, 5}; // 선언과 동시에 초기화

int[] copyArr = arr; // 주소만 복사
		
		System.out.println("변경 전"); 
		System.out.println("arr 주소 : " + arr); // [I@2ff4acd0
		System.out.println("copyArr 주소 : " + copyArr); // [I@2ff4acd0
		System.out.println("arr : " + Arrays.toString(arr)); // [1, 2, 3, 4, 5]
		System.out.println("copyArr : " + Arrays.toString(copyArr)); // [1, 2, 3, 4, 5]
		
		// 얕은 복사한 배열의 값을 변경
		copyArr[2] = 999;
		
		System.out.println("변경 후");
		System.out.println("arr : " + Arrays.toString(arr)); // [1, 2, 999, 4, 5]
		System.out.println("copyArr : " + Arrays.toString(copyArr)); // [1, 2, 999, 4, 5] => 같은 객체, 같은 주소값을 갖고있기 때문에

깊은 복사

새로운 배열 객체를 생성하여 기존 배열의 데이터를 복사하는 것
집이 다르기 때문에 하나의 배열을 수정해도 나머지가 변경되지는 않음

ex)
arr1[1] = 100;
arr2[1] = 2;
1. for문을 이용하여 데이터 하나씩 직접 복사
-> for(int i = 0; i < arr1.length; i++){
    arr2[i] = arr1[i];

2. System.arraycopy() 메서드 이용
-> System.arraycopy(arr1, 0, arr2, 0, arr1.length);

3. Arrays 클래스에 copyOf() 메서드 이용
-> arr2 = Arrays.copyOf(arr1, arr1.length);

int[] arr = {1, 2, 3, 4, 5}; // 원본
		
		// 1. for문을 이용한 깊은 복사
		int[] copyArr1 = new int[arr.length]; // 5칸짜리 배열 생성 (배열공간만 생성, 대입은 아직x)
											  // 그러나 Heap영역은 비어있을 수 없어서 JVM에서 0을 넣음

		for(int i = 0; i < arr.length; i++) {
			copyArr1[i] = arr[i];
		}
		
		System.out.println("arr 주소 : " + arr); // [I@2ff4acd0
		System.out.println("copyArr1 주소 : " + copyArr1); // 주소값은 다름 [I@38af3868
		
		System.out.println("arr : " + Arrays.toString(arr)); // [1, 2, 3, 4, 5]
		System.out.println("arr : " + Arrays.toString(copyArr1)); // 데이터는 복사됨  [1, 2, 3, 4, 5]
		
		// 2. System.arraycopy(원본 배열, 원본복사 시작 인덱스,
		//					   복사 배열, 복사배열의 삽입 시작 인덱스, 복사 길이);
		
		int[] copyArr2 = new int[arr.length];
		System.arraycopy(arr, 0, copyArr2, 0, arr.length); 
		
		System.out.println(Arrays.toString(copyArr2)); // [1, 2, 3, 4, 5]
		
		// 3. 복사할 배열 참조변수 = Arrays.copyOf(원본배열, 복사할 길이);
		
		int[] copyArr3 = Arrays.copyOf(arr, arr.length); // new int해서 미리 할당을 안 시켜줘도 됨
		System.out.println("copyArr3 : " + Arrays.toString(copyArr3)); // [1, 2, 3, 4, 5]
		
		// 값 변경 후 확인
		copyArr1[4] = 0;
		copyArr2[4] = 999;
		copyArr3[4] = 5000;
		
		System.out.println("arr : " + Arrays.toString(arr));
		System.out.println("copyArr1 : " + Arrays.toString(copyArr1)); // [1, 2, 3, 4, 0]
		System.out.println("copyArr2 : " + Arrays.toString(copyArr2)); // [1, 2, 3, 4, 999]
		System.out.println("copyArr3 : " + Arrays.toString(copyArr3)); // [1, 2, 3, 4, 5000]
profile
인생은 변수

0개의 댓글