Java 에서 복사 생성자 만들기

JavaBeginner
지금 연습하기

소개

이 랩에서는 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;
}

객체 생성 및 복제 (Clone) 구현

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());

참조 타입 (Referenced Types) 을 가진 클래스 생성

필드로 참조 타입 (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;
    }
}

얕은 복사 생성자 (Shallow Copy Constructor) 구현

Student 클래스에 대한 얕은 복사 생성자를 생성합니다. 얕은 복사 생성자는 참조 타입 필드에 대한 참조만 할당해야 합니다.

Student(Student s) {
 this.name = s.getName();
 this.gpa = s.getGpa();
 this.address = s.getAddress();
}

얕은 복사 (Shallow Cloning) 시연

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());

깊은 복사 생성자 (Deep Copy Constructor) 구현

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;
}

깊은 복사 (Deep Cloning) 시연

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() 메서드와 비교하고 복사 생성자와 관련된 상속 문제를 논의했습니다. 복사 생성자를 만드는 것은 객체를 복제하는 우아하고 간단한 방법입니다.