clone() 메서드
Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 87개 중 43번째.
clone() method는 object의 copy를 생성합니다. 이를 사용하려면, 사용자의 class는 Cloneable interface를 implement하고 Object class의 clone() method를 override해야 합니다.
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()은 얕은 복사를 수행하며, 이는 기본형 값과 참조를 복사한다는 의미입니다. object에 다른 object가 fields로 포함되어 있다면, original과 clone 모두 동일한 중첩 object를 참조합니다. 중첩된 object까지 포함하여 진정으로 독립적인 복사본을 만들려면, clone() method 내에서 해당 중첩 object도 복제하여 깊은 복사를 implement해야 합니다.
챌린지
쉬움객체 복제를 보여 주는 문서 관리 시스템을 만들어 보겠습니다. 독립적인 복사본을 생성하도록 복제할 수 있는 Document class를 만들고, 사용자가 원본을 그대로 유지하면서 문서를 복제할 수 있도록 합니다.
코드를 두 파일로 구성합니다:
Document.java: 복제를 지원하는 문서를 나타내는 class를 Create합니다. Document에는 세 개의 private 필드가 있습니다:title(String),author(String),version(int). 모든 필드를 초기화하는 constructor와 각 필드에 대한 getter methods를 포함합니다. 또한 버전 번호를 업데이트하는setVersion(int version)method를 추가합니다.Document class가
Cloneableinterface를 implement하도록 하고,clone()method를 Override하여Document를 return하도록 합니다. method 내부에서CloneNotSupportedException을RuntimeException으로 감싸서 처리합니다.toString()을 Override하여 다음을 return하도록 합니다: X, Y, Z가 실제 필드 값인Document[title=X, author=Y, version=Z].Main.java: Document를 Create하고 복제하여 Document class를 실제로 사용합니다. 세 개의 inputs를 받습니다: 제목(String), author(String), 버전 번호(int).이 값들로 Original Document를 Create한 다음, 이를 clone하여 copy를 Create합니다. 복제한 후
setVersion()을 사용하여 copy의 버전을 1 incrementing합니다. 이를 통해 clone이 Original과 truly Independent임을 보여 줍니다.세 줄을 Print합니다:
Original:뒤에 Original document의 toString()Clone:뒤에 cloned document의 toString()Independent:뒤에 Original과 Clone이 서로 다른 object인지 나타내는true또는false(!=comparison 사용)
세 개의 inputs를 받습니다: document 제목(String), author 이름(String), 버전 번호(int).
Clone의 버전을 Modify한 후 Original document가 변경되지 않은 상태로 남아 있는 것을 확인하세요. 이는 clone()이 truly Independent한 copy를 Create했다는 것을 증명합니다!
직접 해보기
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: 복제본의 version을 1 증가시켜 수정
// TODO: "Original: " 다음에 원본 문서 출력
// TODO: "Clone: " 다음에 복제된 문서 출력
// TODO: "Independent: " 다음에 true/false 출력 (original != clone인지 확인)
}
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
4상속
상속의 기초 (extends)super 키워드메서드 오버라이딩 (@Override)생성자 체이닝Object 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조7특별한 메서드와 Object 클래스
toString() 메서드equals()와 hashCode()clone() 메서드compareTo()와 ComparableComparator 인터페이스요약 - 커스텀 정렬직접 연습해 보세요: 온라인 Java 컴파일러