F-Lab
🚀
상위권 IT회사 합격 이력서 무료로 모아보기

깊은 복사와 얕은 복사의 차이점 이해하기

writer_thumbnail

F-Lab : 상위 1% 개발자들의 멘토링

AI가 제공하는 얕고 넓은 지식을 위한 짤막한 글입니다!



깊은 복사와 얕은 복사의 차이점 이해하기

프로그래밍에서 객체를 복사하는 방법에는 깊은 복사(Deep Copy)와 얕은 복사(Shallow Copy)가 있습니다. 이 두 가지 방법은 객체를 복사하는 방식에서 큰 차이를 보입니다. 이 글에서는 깊은 복사와 얕은 복사의 차이점과 각각의 장단점에 대해 알아보겠습니다.

깊은 복사는 객체의 모든 필드를 복사하여 새로운 객체를 생성하는 방식입니다. 반면, 얕은 복사는 객체의 참조 주소만 복사하여 새로운 객체를 생성합니다. 왜냐하면 두 방식은 메모리 사용과 성능에 큰 영향을 미치기 때문입니다.

깊은 복사는 객체의 모든 데이터를 복사하기 때문에 원본 객체와 복사된 객체가 독립적으로 존재합니다. 반면, 얕은 복사는 참조 주소만 복사하기 때문에 원본 객체와 복사된 객체가 동일한 데이터를 참조합니다.

이제 깊은 복사와 얕은 복사의 차이점에 대해 자세히 알아보겠습니다.



깊은 복사(Deep Copy)

깊은 복사는 객체의 모든 필드를 복사하여 새로운 객체를 생성하는 방식입니다. 이 방식은 객체의 모든 데이터를 복사하기 때문에 원본 객체와 복사된 객체가 독립적으로 존재합니다. 왜냐하면 깊은 복사는 객체의 모든 필드를 재귀적으로 복사하기 때문입니다.

깊은 복사는 주로 객체의 상태를 완전히 복제해야 할 때 사용됩니다. 예를 들어, 복사된 객체가 원본 객체와 독립적으로 동작해야 하는 경우 깊은 복사를 사용합니다.

깊은 복사는 메모리를 많이 사용하고, 복사 과정이 복잡하기 때문에 성능이 저하될 수 있습니다. 그러나 객체의 상태를 완전히 복제할 수 있기 때문에 안전하게 사용할 수 있습니다.

다음은 깊은 복사를 구현한 예제 코드입니다.

    public class DeepCopyExample {
        public static void main(String[] args) {
            Person original = new Person("John", new Address("123 Street", "City"));
            Person copy = new Person(original);
            copy.getAddress().setStreet("456 Avenue");
            System.out.println(original.getAddress().getStreet()); // 출력: 123 Street
        }
    }

    class Person {
        private String name;
        private Address address;

        public Person(String name, Address address) {
            this.name = name;
            this.address = address;
        }

        public Person(Person other) {
            this.name = other.name;
            this.address = new Address(other.address);
        }

        public Address getAddress() {
            return address;
        }
    }

    class Address {
        private String street;
        private String city;

        public Address(String street, String city) {
            this.street = street;
            this.city = city;
        }

        public Address(Address other) {
            this.street = other.street;
            this.city = other.city;
        }

        public void setStreet(String street) {
            this.street = street;
        }

        public String getStreet() {
            return street;
        }
    }

위 예제에서 Person 클래스는 깊은 복사를 구현하여 원본 객체와 복사된 객체가 독립적으로 동작합니다.

이제 얕은 복사에 대해 알아보겠습니다.



얕은 복사(Shallow Copy)

얕은 복사는 객체의 참조 주소만 복사하여 새로운 객체를 생성하는 방식입니다. 이 방식은 객체의 참조 주소만 복사하기 때문에 원본 객체와 복사된 객체가 동일한 데이터를 참조합니다. 왜냐하면 얕은 복사는 객체의 필드를 복사하지 않고, 참조 주소만 복사하기 때문입니다.

얕은 복사는 주로 객체의 상태를 부분적으로 복제해야 할 때 사용됩니다. 예를 들어, 복사된 객체가 원본 객체와 동일한 데이터를 공유해야 하는 경우 얕은 복사를 사용합니다.

얕은 복사는 메모리를 적게 사용하고, 복사 과정이 간단하기 때문에 성능이 좋습니다. 그러나 객체의 상태를 완전히 복제할 수 없기 때문에 안전하지 않을 수 있습니다.

다음은 얕은 복사를 구현한 예제 코드입니다.

    public class ShallowCopyExample {
        public static void main(String[] args) {
            Person original = new Person("John", new Address("123 Street", "City"));
            Person copy = original;
            copy.getAddress().setStreet("456 Avenue");
            System.out.println(original.getAddress().getStreet()); // 출력: 456 Avenue
        }
    }

    class Person {
        private String name;
        private Address address;

        public Person(String name, Address address) {
            this.name = name;
            this.address = address;
        }

        public Address getAddress() {
            return address;
        }
    }

    class Address {
        private String street;
        private String city;

        public Address(String street, String city) {
            this.street = street;
            this.city = city;
        }

        public void setStreet(String street) {
            this.street = street;
        }

        public String getStreet() {
            return street;
        }
    }

위 예제에서 Person 클래스는 얕은 복사를 구현하여 원본 객체와 복사된 객체가 동일한 데이터를 참조합니다.

이제 깊은 복사와 얕은 복사의 장단점에 대해 알아보겠습니다.



깊은 복사와 얕은 복사의 장단점

깊은 복사의 장점은 객체의 상태를 완전히 복제할 수 있다는 점입니다. 이를 통해 원본 객체와 복사된 객체가 독립적으로 동작할 수 있습니다. 그러나 깊은 복사는 메모리를 많이 사용하고, 복사 과정이 복잡하기 때문에 성능이 저하될 수 있습니다.

얕은 복사의 장점은 메모리를 적게 사용하고, 복사 과정이 간단하다는 점입니다. 이를 통해 성능이 좋고, 객체의 상태를 부분적으로 복제할 수 있습니다. 그러나 얕은 복사는 객체의 상태를 완전히 복제할 수 없기 때문에 안전하지 않을 수 있습니다.

깊은 복사와 얕은 복사는 각각의 장단점이 있기 때문에 상황에 맞게 선택하여 사용해야 합니다. 왜냐하면 객체의 상태를 완전히 복제해야 하는 경우에는 깊은 복사를, 부분적으로 복제해야 하는 경우에는 얕은 복사를 사용하는 것이 좋기 때문입니다.

이제 결론을 맺겠습니다.



결론

깊은 복사와 얕은 복사는 객체를 복사하는 두 가지 방법입니다. 깊은 복사는 객체의 모든 필드를 복사하여 새로운 객체를 생성하는 방식이며, 얕은 복사는 객체의 참조 주소만 복사하여 새로운 객체를 생성하는 방식입니다.

깊은 복사는 객체의 상태를 완전히 복제할 수 있지만, 메모리를 많이 사용하고 성능이 저하될 수 있습니다. 반면, 얕은 복사는 메모리를 적게 사용하고 성능이 좋지만, 객체의 상태를 완전히 복제할 수 없습니다.

따라서 상황에 맞게 깊은 복사와 얕은 복사를 선택하여 사용해야 합니다. 왜냐하면 객체의 상태를 완전히 복제해야 하는 경우에는 깊은 복사를, 부분적으로 복제해야 하는 경우에는 얕은 복사를 사용하는 것이 좋기 때문입니다.

이 글을 통해 깊은 복사와 얕은 복사의 차이점과 각각의 장단점에 대해 더 잘 이해할 수 있었기를 바랍니다. 앞으로 객체를 복사할 때 이 지식을 활용하여 적절한 방법을 선택하시기 바랍니다.

ⓒ F-Lab & Company

이 컨텐츠는 F-Lab의 고유 자산으로 상업적인 목적의 복사 및 배포를 금합니다.

조회수
F-Lab
소개채용멘토 지원
facebook
linkedIn
youtube
instagram
logo
(주)에프랩앤컴퍼니 | 사업자등록번호 : 534-85-01979 | 대표자명 : 박중수 | 전화번호 : 1600-8776 | 제휴 문의 : info@f-lab.kr | 주소 : 서울특별시 강남구 테헤란로63길 12, 438호 | copyright © F-Lab & Company 2025