[JAVA] 배열의 얕은 복사,깊은 복사

이경환·2022년 11월 15일
0

JAVA

목록 보기
3/6

Call by Value 와 Call by Reference

java 는 기본적으로 Call by Value 전달받은 값을 복사하여 처리합니다. 즉 전달받은 값을 변경하여도 원본은 변경되지 않습니다.

깊은 복사 와 얕은 복사

깊은 복사

깊은 복사는 배열을 복사 한 후 변수를 만들어도 값을 수정 해도 서로 영향을 끼치지 않습니다

이말은 즉 서로 다른 주소를 가지고 있습니다. 배열은 Object의 자손으로
참조형이고, 객체이이므로 주소를 가집니다. 여기서 복사본의 주소와 원본의 주소는 깊은 복사를 하면 달라지게 됩니다.

public class DeepCopy {
    public static void main(String[] args) {
        int[] src = {1, 2, 3, 4, 5};
        int[] dest = src.clone();
        System.out.println(src);
        System.out.println(dest);
        if (src == dest) {
            System.out.println("src 와 dest는 같다");
        } else {
            System.out.println("src 와 dest는 다르다");
        }
    }
}

위와 같이 clone 메서드를 사용하거나 System.arraycopy() 을 사용 할 수도 있습니다. (참고 https://codechacha.com/ko/java-array-deep-copy/)

객체들 끼리 주소를 비교 할 때는 (== , !=) 를 써서 비교 해 본 결과 다르다고 나왔습니다. (위의 주소는 실제 메모리 주소는 아님)

주의점

일반 자료형일 경우만 위 와 같이 clone을 사용하고
객체를 깊은 복사 하고 싶을 경우 다를 방법을 사용 해야합니다.
1. 복사 생성자 또는 복사 팩터리를 사용
2. 직접 객체를 생성하여 복사
3. Cloneable을 구현하여 clone()메서드를 재정의

얕은 복사

얕은 복사는 주소값이 복사 되어 원본 배열이나 복사본 배열의 값이 바뀌면
같은 인스턴스를 공유하기 때문에 둘의 값 모두 변경됩니다.

public class ShallowCopy {
    public static void main(String[] args) {
        int[] src = {1, 2, 3, 4, 5};
        int[] dest = src;
        System.out.println(src);
        System.out.println(dest);
        if (src == dest) {
            System.out.println("src 와 dest는 같다");
        } else {
            System.out.println("src 와 dest는 다르다");
        }
    }
}

profile
안녕하세요

0개의 댓글