Java/java

java :) 얕은복사와 깊은복사, Arrays.copyOf()와 Arrays.copeOfRange() 사용방법

euncheol kim 2022. 5. 9. 20:43

 

 

goal

배열의 복사와 다양한 배열의 복사 방법에 대해서 이해한다.



요약

개념 설명
얕은 복사
(Shallow copy)
얕은 복사가 된 경우, 원본배열 또는 복사된 배열의 값이 변경된다면 영향을 준다.
- 영향이란, 같은 메모리를 가리키고 있다는 말이다.
- 같은 메모리를 공유한다는 의미
깊은 복사
(Deep copy)
깊은 복사가 된 경우, 원본배열 또는 복사된 배열의 값이 변경이 있더라도 영향이 x
- 각각 독립적인 메모리를 가진다.
얕은 복사와 깊은 복사를 알아야 하는 이유 기본타입(primitive type)의 변수 경우, 얕은 복사로도 사용이 가능하지만 참조타입(reference type)의 변수인 경우 깊은 복사를 사용해야 객체의 실제 데이터를 복사할 수 있다.

 

내용 설명
import java.util.Arrays
Arrays.copyOf(원본배열, 복사할 길이)
깊은 배열의 복사
import java.util.Arrays
Arrays.copyOfRange(원본 배열, 복사할 시작 인덱스, 복사할 끝 인덱스)
깊은 배열의 복사




* 배열의 복사 : 얕은 복사, 깊은 복사


개념 설명
얕은 복사
(Shallow copy)
얕은 복사가 된 경우, 원본배열 또는 복사된 배열의 값이 변경된다면 영향을 준다.
- 영향이란, 같은 메모리를 가리키고 있다는 말이다.(주소값 복사)
- 같은 메모리를 공유한다는 의미
깊은 복사
(Deep copy)
깊은 복사가 된 경우, 원본배열 또는 복사된 배열의 값이 변경이 있더라도 영향이 x
- 각각 독립적인 메모리를 가진다. (복사된 실제값을 다른 메모리에 할당)
얕은 복사와 깊은 복사를 알아야 하는 이유 기본타입(primitive type)의 변수 경우, 얕은 복사로도 사용이 가능하지만 참조타입(reference type)의 변수인 경우 깊은 복사를 사용해야 객체의 실제 데이터를 복사할 수 있다.



1. 얕은 복사 (Shallow copy)


  • ShallowCopy.java
import java.util.Arrays;

public class ShallowCopy {
    public static void main(String[] args) {
        int[] arr = new int[] {10,20,30,40,50};
        int[] shallow_copy = arr;

        System.out.println("* 변수가 가리키는 메모리 : " + arr + " " + shallow_copy);
        System.out.println("\n");
        System.out.println("1. shallow_copy만 진행");
        System.out.println("----------------------------------------");
        System.out.println("arr의 요소 : " + Arrays.toString(arr));
        System.out.println("shallow_copy의 요소 : " + Arrays.toString(shallow_copy));

        shallow_copy[0] = 100;

        System.out.println("\n\n\n");
        System.out.println("2. shallow_copy가 진행된 배열의 값 변경 (arr의 값이 변경되도 아래 결과는 동일하다.)");
        System.out.println("----------------------------------------");
        System.out.println("arr의 요소 : " + Arrays.toString(arr));
        System.out.println("shallow_copy의 요소 : " + Arrays.toString(shallow_copy));
    }
}

 

  • ShallowCopy.java [출력값]

image

2. 깊은복사 (Deep copy)


 

[1] 종류


  • Arrays.copyOf(원본배열, 복사할 길이)
  • Arrays.copyOfRange(원본 배열, 복사할 시작 인덱스, 복사할 끝 인덱스)




1. Arrays.copyOf(원본배열, 복사할 길이)


  • ArrayscopyOf.java
import java.util.Arrays;

public class ArrayscopyOf {
    public static void main(String[] args) {
        int[] arr = new int[] {10,20,30,40,50};
        int[] deep_copy = Arrays.copyOf(arr, arr.length);

        System.out.println("* 변수가 가리키는 메모리 : " + arr + " " + deep_copy);
        System.out.println("\n");
        System.out.println("1. deep_copy만 진행");
        System.out.println("----------------------------------------");
        System.out.println("arr의 요소 : " + Arrays.toString(arr));
        System.out.println("deep_copy의 요소 : " + Arrays.toString(deep_copy));

        deep_copy[0] = 100;

        System.out.println("\n\n\n");
        System.out.println("2. deep_copy가 진행된 배열의 값 변경 (arr의 값이 변경되도 아래 결과는 동일하다.)");
        System.out.println("----------------------------------------");
        System.out.println("arr의 요소 : " + Arrays.toString(arr));
        System.out.println("deep_copy의 요소 : " + Arrays.toString(deep_copy));
    }
}

 

  • ArrayscopyOf.java [출력값] 

image

 

 

2. Arrays.copyOfRange(원본 배열, 복사할 시작 인덱스, 복사할 끝 인덱스)


  • ArrayscopyOfRang.java
import java.util.Arrays;

public class ArrayscopyOfRang {
    public static void main(String[] args) {
        int[] arr = new int[] {10,20,30,40,50};
        int[] deep_copy = Arrays.copyOfRange(arr, 0, 3);

        System.out.println("* 변수가 가리키는 메모리 : " + arr + " " + deep_copy);
        System.out.println("\n");
        System.out.println("1. deep_copy만 진행");
        System.out.println("----------------------------------------");
        System.out.println("arr의 요소 : " + Arrays.toString(arr));
        System.out.println("deep_copy의 요소 : " + Arrays.toString(deep_copy));

        deep_copy[0] = 100;

        System.out.println("\n\n\n");
        System.out.println("2. deep_copy가 진행된 배열의 값 변경 (arr의 값이 변경되도 아래 결과는 동일하다.)");
        System.out.println("----------------------------------------");
        System.out.println("arr의 요소 : " + Arrays.toString(arr));
        System.out.println("deep_copy의 요소 : " + Arrays.toString(deep_copy));
    }
}

 

  • ArrayscopyOfRang.java [출력값]

image