자바 (ref. 자바의정석)

배열의 복사 - JAVA

쿠쿠s 2022. 2. 8. 11:26

 

 

배열을 복사를 하려고 하는데 변수처럼  '=' 연산자로 넣으면 쉽게 되겠네? 라고 생각을 했다가 문제가 생겨서 한참을 찾아 헤맨 기억이 있습니다..  자바의 정석에서 마침 이 파트가 있어 개인적으로 정리를 포스팅 하게 되었습니다.


 

우선 배열의 복사는 for문을 이용하여 배열을 복사하는 방법 ( 값을 for문을 돌며 다 넣어주기) ,   '=' 연산자를 사용하는 방법 ( ex. arr = arr2 ), System.arraycopy( ) 를 이용하여 배열을 복사하는 방법이 있습니다.

 

 

 

for문 이용하여 값을 넣거나 System.arraycopy( ) 는 Deep copy(깊은 복사) 로서 '실제값'을 넣어주게 되지만

arr = arr2 와 같은 방식은 Shallow copy(얕은 복사)'주소값'을 복사하게 됩니다.

 

 

 

그러면 어떤 차이가 있는지 아래 코드를 보시면 쉽게 이해를 하실 수 있습니다.

public class arrExam {

    public static void main(String[] args) {
        char[] arr = {'a', 'b', 'c', 'd', 'e'};
        char[] arr2 = {'f', 'g', 'h', 'i', 'j'};

        System.out.println(arr);
        System.out.println(arr2);
        System.out.println();

        //arr[0]번을 arr2[0]부터 arr의 길이만큼 '값'을 복사한다.
        System.arraycopy(arr, 0, arr2, 0, arr.length);

        System.out.println(arr); // a, b, c, d, e
        System.out.println(arr2); // a, b, c, d, e
        System.out.println();

        //arr의 0번째 1번째 값을 변경한다!
        arr[0] = 'v';
        arr[1] = 'w';

        //arr의 값만 변경하게 되었다.
        System.out.println(arr); // v, w, c, d, e
        System.out.println(arr2); // a, b, c, d, e
        System.out.println();

        arr2 = arr;  //arr2는 arr의 주소를 가리킴!

        //이번에도 arr의 값만 변경한다.
        arr[0] = 'V';
        arr[1] = 'W';

        //arr2는 arr의 주소를 가리키기 때문에 해당 주소의 값을 가지게 된다.
        System.out.println(arr); // V, W, c, d, e
        System.out.println(arr2); // V, W, c, d, e
        System.out.println();
    }
}

출력값

 

 

 

'실제 값' 을 복사했을 경우에는 arr 와 arr2 는 서로 영향을 주지 않았다. 왜냐하면 다른 주소값을 가지기 때문입니다.

하지만 '=' 를 사용하게 되었을 땐 주소값을 복사하게 됩니다. 즉 arr의 값이 변경이 되면 arr2의 값이 변하지 않을 것 같지만 arr2는 arr 주소를 가리키게 되므로 arr의 값을 출력하게 됩니다.

 

 

 

배열의 복사를 알아보며 얕은복사와 깊은복사를 간단하게 알아봤는데 도움이 되셨으면 좋겠습니다. 감사합니다.

 

 

 

 

 

'자바 (ref. 자바의정석)' 카테고리의 다른 글

오버로딩(overloading) - JAVA  (0) 2022.02.14
클래스변수, 인스턴스변수, 지역변수 - JAVA  (0) 2022.02.09
for each 문 - JAVA  (0) 2022.02.07
문자열의 비교 - JAVA  (0) 2022.02.06
상수와 리터럴 - JAVA  (0) 2022.02.05