-
깊은 복사(Deep Copy)와 얕은 복사(Shallow Copy)ProgrammingLanguage/Java 2021. 1. 13. 23:15
깊은 복사와 얕은 복사를 이해하기 위해서는 값 복사와 주소 복사를 이해해두어야 한다.
잘 모른다면 아래 글을 참고하여 이해하도록 하자.
sskl660.tistory.com/37?category=866784
*얕은 복사(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); } }
'ProgrammingLanguage > Java' 카테고리의 다른 글
자바(Java) 싱글턴 패턴(Singleton Pattern) (1) 2021.01.23 자바(Java) BufferedReader 클래스 (0) 2021.01.18 스트림(Stream)과 자바(Java)의 Scanner 클래스 (0) 2021.01.14