얕은 복사 & 깊은 복사

얕은 복사

arr2의 값을 수정하면 arr1에 영향

배열의 참조(주솟값)만 복사한 것으로 arr1, arr2 모두 하나의 참조를 가리킴

int arr1[] = {1, 2, 3, 4, 5};
int arr2[] = arr1;

깊은 복사

배열을 그대로 가져와 새로운 배열을 만들어, 각각 수정해도 영향 없음

Object.clone()

자바의 모든 부모 클래스인 Object 클래스에 구현되어있는 clone()메서드 사용

int arr1[] = {1, 2, 3, 4, 5};
int arr2[] = arr1.clone();

System.arraycopy()

System.arraycopy(원본 배열, 복사시작위치, 복사할 배열, 붙여넣기 시작위치, 복사할 길이);

int arr1[] = {1, 2, 3, 4, 5};
int arr2[] = new int[3];
int arr3[] = {99, 98, 97, 96, 95};

System.arraycopy(arr1, 1, arr2, 0, 2); // int arr2[] = {2, 3};
System.arraycopy(arr1, 1, arr3, 2, 3); // int arr3[] = {99, 98, 2, 3, 4};

Arrays.copyOf()

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

Arrays.copyOfRange()

Arrays.copyOfRange(원본 배열, 시작위치, 복사할 길이_끝낼 위치+1);

  • if, 원본 배열의 길이 < 복사받아 만들어질 배열의 길이 : 초과하는 범위에 배열 타입의 default 값이 들어감(int - 0, String - null 등)
  • if, 원본 배열의 길이 < 복사를 시작할 위치 : exception 발생
int arr1[] = {1, 2, 3, 4, 5};

int arr2[] = Arrays.copyOf(arr1,5);        // int arr2[] = {1, 2, 3, 4, 5};
int arr3[] = Arrays.copyOfRange(arr1,0,3); // int arr3[] = {1, 2, 3};

int arr4[] = Arrays.copyOfRange(arr1,0,7); // int arr4[] = {1, 2, 3, 4, 5, 0, 0};

2차원배열 복사

  • Object.clone() 으로 2차원 배열을 복사할 수는 있지만 얕은 복사가 되기 때문에 주의!
  • 2중 for문이나 for문 안에 위의 메서드들을 사용하면 깊은 복사 가능.
int arr1[][] = {{1,2,3},{4,5,6},{7,8,9}};
int arr2[][] = new int[arr1.length][arr1[0].length];
	    
        for(int i=0; i<arr2.length; i++){
            System.arraycopy(arr1[i], 0, arr2[i], 0, arr1[0].length);
        }

참고 사이트 :

https://seeminglyjs.tistory.com/215

https://romcanrom.tistory.com/48

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=gglee0127&logNo=221353415984

profile
즐겁

0개의 댓글