Menu
Coddy logo textTech

clone() 메서드

Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 87개 중 43번째.

clone() 메서드는 객체의 복사본을 생성합니다. 이를 사용하려면 클래스가 Cloneable 인터페이스를 구현하고 Object 클래스의 clone() 메서드를 오버라이드해야 합니다.

public class Person implements Cloneable {
    private String name;
    private int age;
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    @Override
    public Person clone() {
        try {
            return (Person) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException(e);
        }
    }
}

이제 객체의 독립적인 복사본을 생성할 수 있습니다:

Person original = new Person("Alice", 25);
Person copy = original.clone();
// copy는 동일한 값을 가진 별개의 객체입니다

기본적으로, clone()얕은 복사(shallow copy)를 수행하며, 이는 원시 값과 참조를 복사함을 의미합니다. 만약 객체가 필드로 다른 객체를 포함하고 있다면, 원본과 복제본 모두 동일한 중첩된 객체를 참조하게 됩니다. 중첩된 객체를 포함하여 완전히 독립적인 복사본을 만들려면, clone() 메서드 내에서 해당 중첩 객체들도 함께 복제하는 깊은 복사(deep copy)를 구현해야 합니다.

challenge icon

챌린지

쉬움

객체 복제(cloning)를 보여주는 문서 관리 시스템을 구축해 보겠습니다. 독립적인 복사본을 생성하기 위해 복제가 가능한 Document 클래스를 만들고, 사용자가 원본을 그대로 유지하면서 문서를 복제할 수 있도록 할 것입니다.

코드는 두 개의 파일로 구성됩니다:

  • Document.java: 복제를 지원하는 문서를 나타내는 클래스를 생성합니다. Document는 세 개의 private 필드를 가집니다: title (String), author (String), 그리고 version (int). 모든 필드를 초기화하는 생성자와 각 필드에 대한 getter 메서드를 포함하세요. 또한 버전 번호를 업데이트하기 위한 setVersion(int version) 메서드를 추가하세요.

    Document 클래스가 Cloneable 인터페이스를 구현하도록 하고, clone() 메서드를 오버라이드하여 Document를 반환하도록 하세요. 메서드 내부에서 CloneNotSupportedExceptionRuntimeException으로 감싸서 처리하세요.

    toString()을 오버라이드하여 Document[title=X, author=Y, version=Z] 형식을 반환하도록 하세요. 여기서 X, Y, Z는 실제 필드 값입니다.

  • Main.java: 문서를 생성하고 복제하여 Document 클래스를 실제로 작동시켜 보세요. 세 가지 입력을 받게 됩니다: 제목 (String), 저자 (String), 그리고 버전 번호 (int).

    이 값들로 원본 Document를 생성한 다음, 이를 복제하여 복사본을 만듭니다. 복제 후, setVersion()을 사용하여 복사본의 버전을 1만큼 증가시켜 수정하세요. 이는 복제본이 원본으로부터 진정으로 독립적임을 보여줍니다.

    세 줄을 출력하세요:

    1. Original: 뒤에 원본 문서의 toString() 결과 출력
    2. Clone: 뒤에 복제된 문서의 toString() 결과 출력
    3. Independent: 뒤에 원본과 복제본이 서로 다른 객체인지 여부를 나타내는 true 또는 false 출력 (!= 비교 연산자 사용)

세 가지 입력을 받게 됩니다: 문서 제목 (String), 저자 이름 (String), 그리고 버전 번호 (int).

복제본의 버전을 수정한 후에도 원본 문서가 변경되지 않은 채로 남아 있는 것에 주목하세요. 이는 clone()이 진정으로 독립적인 복사본을 생성했음을 증명합니다!

치트 시트

clone() 메서드는 객체의 복사본을 생성합니다. 이를 사용하려면 클래스가 Cloneable 인터페이스를 구현하고 Object 클래스의 clone() 메서드를 오버라이드해야 합니다:

public class Person implements Cloneable {
    private String name;
    private int age;
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    @Override
    public Person clone() {
        try {
            return (Person) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException(e);
        }
    }
}

독립적인 복사본 생성하기:

Person original = new Person("Alice", 25);
Person copy = original.clone();
// copy는 동일한 값을 가진 별개의 객체입니다.

기본적으로 clone()은 기본 타입 값과 참조를 복사하는 얕은 복사(shallow copy)를 수행합니다. 만약 객체가 다른 객체를 필드로 포함하고 있다면, 원본과 복사본 모두 동일한 중첩 객체를 참조하게 됩니다. 중첩 객체까지 포함하여 진정으로 독립적인 복사본을 만들려면, clone() 메서드 내에서 해당 중첩 객체들도 함께 클로닝하는 깊은 복사(deep copy)를 구현해야 합니다.

직접 해보기

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 입력 읽기
        String title = scanner.nextLine();
        String author = scanner.nextLine();
        int version = scanner.nextInt();
        
        // TODO: 입력 값을 사용하여 원본 Document 생성
        
        // TODO: 원본 문서를 복제하여 사본 생성
        
        // TODO: 복제본의 버전을 1 증가시켜 수정
        
        // TODO: "Original: "과 원본 문서 출력
        
        // TODO: "Clone: "과 복제된 문서 출력
        
        // TODO: "Independent: "와 true/false 출력 (원본 != 복제본 여부 확인)
        
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨