소개
이 랩에서는 Java 에서 복사 생성자 (copy constructor) 를 만드는 방법을 배웁니다. 복사 생성자는 기존 객체의 값을 사용하여 새로운 객체를 생성하는 데 사용됩니다. 복사 생성자는 얕은 복제 (shallow clone) 및 깊은 복제 (deep clone) 를 모두 생성하는 데 사용할 수 있습니다. 간단한 클래스와 참조 유형 (referenced types) 을 가진 클래스에 대한 복사 생성자를 만들 것입니다.
이 랩에서는 Java 에서 복사 생성자 (copy constructor) 를 만드는 방법을 배웁니다. 복사 생성자는 기존 객체의 값을 사용하여 새로운 객체를 생성하는 데 사용됩니다. 복사 생성자는 얕은 복제 (shallow clone) 및 깊은 복제 (deep clone) 를 모두 생성하는 데 사용할 수 있습니다. 간단한 클래스와 참조 유형 (referenced types) 을 가진 클래스에 대한 복사 생성자를 만들 것입니다.
이름 (name) 과 GPA 필드를 가진 간단한 Student 클래스를 생성합니다. 이 클래스를 사용하여 복사 생성자를 만들 것입니다.
class Student {
private String name;
private double gpa;
// 매개변수화된 생성자 (parameterized constructor)
Student(String name, double gpa) {
this.name = name;
this.gpa = gpa;
}
}
Student 클래스에 대한 복사 생성자를 생성합니다. 복사 생성자는 클래스의 객체를 입력으로 받아 입력 객체의 값을 사용하여 필드를 초기화해야 합니다.
// 복사 생성자 (Copy constructor)
Student(Student s) {
this.name = s.getName();
this.gpa = s.getGpa();
}
// getter 메서드
public String getName() {
return name;
}
public double getGpa() {
return gpa;
}
Student 클래스의 객체를 생성한 다음, 복사 생성자를 사용하여 해당 객체의 복제본을 생성합니다. 원본 객체의 이름을 변경하고 두 객체의 이름을 출력하여 복제된 객체에 영향이 있는지 확인합니다.
Student s = new Student("John", 3.5);
Student s2 = new Student(s);
s.setName("Sarah");
System.out.println("Original: " + s.getName());
System.out.println("Clone: " + s2.getName());
필드로 참조 타입 (Address) 을 포함하는 Student 클래스를 생성합니다. 이 클래스를 사용하여 얕은 복제 (shallow cloning) 와 깊은 복제 (deep cloning) 의 차이점을 보여줍니다.
class Student {
private String name;
private double gpa;
private Address address;
// 파라미터화된 생성자 (parameterized constructor)
Student(String name, double gpa, Address address) {
this.name = name;
this.gpa = gpa;
this.address = address;
}
}
class Address {
private int postalCode;
Address(int postalCode) {
this.postalCode = postalCode;
}
}
Student 클래스에 대한 얕은 복사 생성자를 생성합니다. 얕은 복사 생성자는 참조 타입 필드에 대한 참조만 할당해야 합니다.
Student(Student s) {
this.name = s.getName();
this.gpa = s.getGpa();
this.address = s.getAddress();
}
Student 객체를 생성한 다음, 얕은 복사 생성자를 사용하여 복제본을 만듭니다. 원본 객체의 주소의 우편 번호를 변경하고 두 우편 번호를 모두 출력하여 복제된 객체가 원본에 대한 변경 사항의 영향을 받는다는 것을 보여줍니다.
Student s = new Student("John", 3.5, new Address(12345));
Student s2 = new Student(s);
s.getAddress().setPostalCode(54321);
System.out.println("Original: " + s.getAddress().getPostalCode());
System.out.println("Clone: " + s2.getAddress().getPostalCode());
Student 클래스에 대한 깊은 복사 생성자를 생성합니다. 깊은 복사 생성자는 참조 타입 필드에 대해 새로운 객체를 생성해야 합니다.
Student(Student s) {
this.name = s.getName();
this.gpa = s.getGpa();
this.address = new Address(s.getAddress().getPostalCode());
}
// getter
public Address getAddress() {
return address;
}
Student 객체를 생성한 다음, 깊은 복사 생성자를 사용하여 복제본을 만듭니다. 원본 객체의 주소의 우편 번호를 변경하고 두 우편 번호를 모두 출력하여 복제된 객체가 원본에 대한 변경 사항의 영향을 받지 않는다는 것을 보여줍니다.
Student s = new Student("John", 3.5, new Address(12345));
Student s2 = new Student(s);
s.getAddress().setPostalCode(54321);
System.out.println("Original: " + s.getAddress().getPostalCode());
System.out.println("Clone: " + s2.getAddress().getPostalCode());
이 랩에서는 Java 에서 복사 생성자 (copy constructor) 를 만드는 방법을 배웠습니다. 복사 생성자는 객체의 얕은 복제 (shallow clone) 및 깊은 복제 (deep clone) 를 생성하는 데 사용될 수 있습니다. 또한 복사 생성자를 clone() 메서드와 비교하고 복사 생성자와 관련된 상속 문제를 논의했습니다. 복사 생성자를 만드는 것은 객체를 복제하는 우아하고 간단한 방법입니다.