ProgrammingLanguage/Java

깊은 복사(Deep Copy)와 얕은 복사(Shallow Copy)

sskl660 2021. 1. 13. 23:15

깊은 복사와 얕은 복사를 이해하기 위해서는 값 복사와 주소 복사를 이해해두어야 한다.

잘 모른다면 아래 글을 참고하여 이해하도록 하자.

sskl660.tistory.com/37?category=866784

 

메서드 Overloading과 매개변수

*변수의 중복 선언 ->변수의 경우는 데이터의 타입이 달라도 변수 이름이 동일한 경우를 허용하지 않는다. Ex) 다음과 같은 경우는 컴파일 에러가 발생한다. class Employee { String name; // age 변수가 in

sskl660.tistory.com

 

*얕은 복사(Shallow Copy)

->얕은 복사는 쉽게 말해 주소가 복사되는 것을 말한다.

public class ShallowCopy {
	public static void main(String[] args) {
		int[] list = {1, 2, 3, 4};
		int[] shallow_copy = list;
		
		System.out.println(list);
		System.out.println(shallow_copy);
	}
}

새로운 객체가 원본 객체와 동일한 주소를 바라본다!

->장점 : 같은 객체를 공유하므로 메모리를 절약하고, 빠른 장점이 존재한다. 참조에 의한 호출(Call by Reference)에서 얕은 복사가 이루어 지는 이유 중 하나이기도 하다.

->단점 : 두개 이상의 객체가 같은 대상을 가리키고 있기 때문에, 의도치 않게 여러 개의 객체가 동시에 수정될 수 있다.

 

*깊은 복사(Deep Copy)

->얕은 복사가 주소 복사와 관련이 있듯이, 깊은 복사는 값 복사와 마찬가지로 생각하면 된다. 즉, 새로운 메모리 공간에 값을 복사하는 것이다.

public class DeepCopy {
	public static void main(String[] args) {
		int[] list = {1, 2, 3};
		int[] deep_copy = list.clone();
		
		System.out.println(list);
		System.out.println(deep_copy);
	}
}

새로운 객체는 새로운 메모리 공간에 값이 복사된다!

->장점 : 얕은 복사와 반대로 여러 객체가 동시에 수정되는 일이 발생하지 않아, 변경에는 안전하다.

->단점 : 객체 생성 비용이 비싸며, 메모리를 많이 점유한다.

->특히, 특정 객체를 깊은 복사하는 경우 Clonable 인터페이스를 활용하여, clone()메서드를 Overriding해주어야 깊은 복사가 가능하다.

class A implements Cloneable {
	private String name;
	
	// Object 클래스는 자바의 최상위 클래스!
	// 새로운 Object를 넘겨주는 clone 메서드를 Overriding 한다.
	// CloneNotSupportedException은 해당 객체가 Clonable 인터페이스를 구현하고 있지 않는 경우를 대비한 예외이다.
	public Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
}

public class DeepCopy {
	public static void main(String[] args) throws CloneNotSupportedException {
		A a = new A();
		// Object 클래스(부모 클래스)를 넘겨주므로, 캐스팅이 필요하다!
		A b = (A) a.clone();
		
		System.out.println(a);
		System.out.println(b);
	}
}