개발

자바에서의 깊은 복사와 얕은 복사 이해하기

hes3518 2024. 11. 17. 19:46
728x90
반응형

자바 Object Clone: 깊은 복사와 얕은 복사의 이해

안녕하세요! 프로그래밍에 관심이 많은 여러분, 오늘은 Java에서 Object Clone을 사용하는 방법과 그 개념에 대해 알아보겠습니다. 특히, 깊은 복사(deep copy)와 얕은 복사(shallow copy)의 차이와 사용 방법을 설명하고, 간단한 예제를 통해 이해를 돕겠습니다.

들어가며

Java에서 객체를 복제하는 것은 많이 쓰이는 기능 중 하나입니다. 객체 생성 시 메모리를 효율적으로 사용하거나 특정 객체의 상태를 보존하기 위해 복제 기능은 필수적입니다. 그러나 깊은 복사와 얕은 복사를 혼동하면 의도한 대로 동작하지 않을 수 있습니다. 따라서 이 둘의 정확한 개념을 이해하는 것이 중요합니다.

Clone 메소드의 이해

Java에서 객체를 복제하기 위해 사용하는 메소드가 바로 clone()입니다. 이 메소드는 객체가 스스로를 복사할 수 있도록 도와줍니다. 그러나 몇 가지 주의할 점이 있습니다:

  1. Cloneable 인터페이스 구현: clone() 메소드를 사용하려면 클래스에서 Cloneable 인터페이스를 구현해야 합니다.
  2. 얕은 복사와 깊은 복사: 기본적으로 clone() 메소드는 얕은 복사를 수행합니다. 즉, 기본 타입 필드는 복사되지만, 객체 타입 필드는 참조만 복사됩니다.

깊은 복사 vs 얕은 복사

  • 얕은 복사 (Shallow Copy): 객체의 필드들만을 복사하며, 참조형 필드의 경우 원본 객체와 복제된 객체가 동일한 인스턴스를 참조합니다. 이로 인해 하나의 객체에서 필드 값을 변경하면 다른 객체에도 영향을 미칠 수 있습니다.
  • 깊은 복사 (Deep Copy): 객체의 모든 필드를 복사하며, 참조형 필드도 새로운 인스턴스를 생성하여 복사합니다. 따라서 두 개의 객체는 서로 독립적으로 동작할 수 있습니다.

예제 코드

이제 실제 코드를 통해 클론 메소드의 사용을 살펴보겠습니다.

class MyClass implements Cloneable {
    private int number;
    private String text;

    public MyClass(int number, String text) {
        this.number = number;
        this.text = text;
    }

    // clone() 메서드 오버라이딩
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    public int getNumber() {
        return number;
    }

    public String getText() {
        return text;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public void setText(String text) {
        this.text = text;
    }
}

public class Main {
    public static void main(String[] args) {
        MyClass original = new MyClass(10, "Hello");

        try {
            // 객체 복제
            MyClass cloned = (MyClass) original.clone();

            // 복제된 객체의 상태 변경
            cloned.setNumber(20);
            cloned.setText("World");

            // 원본 객체와 복제된 객체의 상태 비교
            System.out.println("Original: " + original.getNumber() + ", " + original.getText());
            System.out.println("Cloned: " + cloned.getNumber() + ", " + cloned.getText());
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}

이 코드의 설명

  • MyClass라는 클래스는 Cloneable 인터페이스를 구현하고 clone() 메소드를 오버라이드하여 기본적인 객체 복제를 수행합니다.
  • Main 클래스에서 원본 객체를 생성하고 clone() 메소드를 통해 복제된 객체를 만든 후, 복제된 객체의 필드를 변경합니다.
  • 마지막으로 원본과 복제된 객체의 상태를 비교하여 독립성을 확인합니다.

마무리

이번 포스트에서는 Java에서의 객체 복제에 대해 깊이 있게 알아보았습니다. 깊은 복사와 얕은 복사를 이해함으로써 복잡한 데이터 구조를 다룰 때 발생할 수 있는 문제를 예방할 수 있습니다. 이 정보를 통해 여러분의 프로그래밍 프로젝트에 도움이 되기를 바랍니다! 궁금한 점이 있다면 언제든지 댓글로 질문해 주세요.

감사합니다! 다음 포스트에서 더 많은 정보로 찾아뵙겠습니다.

728x90
반응형