C++처럼, 자바 또한 지원합니다 복사 생성자 . 하지만 C++ 기본적으로 생성됩니다. Java에서는 복사 생성자를 자체적으로 정의합니다. 이 섹션에서는 다음 내용을 학습합니다. 예제와 함께 Java의 복사 생성자 .
건설자
자바에서는 건설자 메소드와 동일하지만 유일한 차이점은 생성자의 이름이 클래스 이름과 동일하다는 것입니다. 클래스의 인스턴스를 생성하는 데 사용됩니다. 클래스의 객체를 생성할 때 자동으로 호출됩니다. 반환 유형이 없습니다. 생성자는 될 수 없다는 것을 기억하십시오 추상적인 , 결정적인 , 동기화됨 , 그리고 공전 . 생성자를 재정의할 수 없습니다. 호출될 때 메모리의 일부 공간을 차지합니다.
생성자의 유형
- 기본 생성자
- 매개변수화된 생성자
위의 두 생성자를 제외하고 Java는 복사 생성자도 지원합니다. 자세히 논의해 봅시다.
복사 생성자가 필요한 이유는 무엇입니까?
때때로 우리는 클래스의 기존 객체의 정확한 복사본을 생성해야 하는 문제에 직면합니다. 또한, 복사본을 변경한 경우 원본에 반영되어서는 안 되며 그 반대의 경우도 마찬가지라는 조건이 있습니다. 이러한 경우를 위해 Java는 다음과 같은 개념을 제공합니다. 복사 생성자 .
복사 생성자
Java에서 복사 생성자는 동일한 Java 클래스의 다른 객체를 사용하여 객체를 생성하는 특수한 유형의 생성자입니다. 클래스의 기존 객체의 복사본을 반환합니다.
최종 필드에 값을 할당할 수 있지만 clone() 메서드를 사용하는 동안에는 동일한 작업을 수행할 수 없습니다. 기존 객체의 전체 복사본을 생성하려는 경우에 사용됩니다. clone() 메소드에 비해 구현하기가 더 쉽습니다.
참고: 하위 클래스에서는 상속할 수 없습니다. 부모 클래스 참조에서 자식 클래스 객체를 초기화하려고 하면 복사 생성자를 사용하여 복제할 때 캐스팅 문제에 직면하게 됩니다.
복사 생성자 사용
다음과 같은 경우 복사 생성자를 사용할 수 있습니다.
- 여러 필드가 있는 개체의 복사본을 만듭니다.
- 무거운 객체의 전체 복사본을 생성합니다.
- Object.clone() 메서드를 사용하지 마세요.
복사 생성자의 장점
- 필드가 final로 선언된 경우 복사 생성자가 이를 변경할 수 있습니다.
- 타입 캐스팅이 필요하지 않습니다.
- 객체에 여러 필드가 있는 경우 사용이 더 쉽습니다.
- 덕분에 클래스에 필드를 추가하는 것이 쉽습니다. 복사 생성자에서만 변경하면 됩니다.
복사 생성자 만들기
Java에서 복사 생성자를 만들려면 아래 단계를 따르세요.
- 동일한 클래스의 객체를 매개변수로 받아들이는 생성자를 만듭니다.
public class Fruits { private double price; private String name; //copy constructor public Fruits(Fruits fruits) { //getters } }
- 각 필드(변수) 개체를 새로 생성된 인스턴스에 복사합니다.
public class Fruits { private double price; private String name; //copy constructor public Fruits(Fruits fruits) { //copying each filed this.price = fruits.price; //getter this.name = fruits.name; //getter } }
복사 생성자의 예
CopyConstructorExample.java
public class Fruit { private double fprice; private String fname; //constructor to initialize roll number and name of the student Fruit(double fPrice, String fName) { fprice = fPrice; fname = fName; } //creating a copy constructor Fruit(Fruit fruit) { System.out.println(' After invoking the Copy Constructor: '); fprice = fruit.fprice; fname = fruit.fname; } //creating a method that returns the price of the fruit double showPrice() { return fprice; } //creating a method that returns the name of the fruit String showName() { return fname; } //class to create student object and print roll number and name of the student public static void main(String args[]) { Fruit f1 = new Fruit(399, 'Ruby Roman Grapes'); System.out.println('Name of the first fruit: '+ f1.showName()); System.out.println('Price of the first fruit: '+ f1.showPrice()); //passing the parameters to the copy constructor Fruit f2 = new Fruit(f1); System.out.println('Name of the second fruit: '+ f2.showName()); System.out.println('Price of the second fruit: '+ f2.showPrice()); } }
산출:
Name of the first fruit: Ruby Roman Grapes Price of the first fruit: 399.0 After invoking the Copy Constructor: Name of the second fruit: Ruby Roman Grapes Price of the second fruit: 399.0
복사 생성자 대 clone() 메서드
복사 생성자와 clone() 메서드는 모두 클래스의 기존 객체 복사본을 만드는 데 사용됩니다. 그러나 아래에 제시된 이유 때문에 복사 생성자를 사용하는 것이 clone() 메서드에 비해 더 쉽고 좋습니다.
- clone() 메소드를 사용하는 경우 복제 가능 메서드에서 예외가 발생할 수 있습니다. CloneNotSupportException. 따라서 프로그램에서 예외를 처리하는 것은 복잡한 작업입니다. 복사 생성자에는 그러한 복잡성이 없습니다.
- 필드가 다음과 같은 경우 값을 할당할 수 없습니다. 결정적인 . 복사 생성자에서 최종 필드에 값을 할당할 수 있습니다.
- clone() 메소드에 의해 반환된 객체는 다음과 같아야 합니다. 타입캐스트 . 복사 생성자에는 그러한 요구 사항이 없습니다.