C#

[C#]복사 생성자(Copy Constructor)

DevStory 2022. 5. 5.

복사 생성자(Copy Constructor)

C#에서 복사 생성자는 생성자에서 동일한 클래스의 객체를 매개변수로 사용하는 경우 복사 생성자라고 합니다. 복사 생성자는 매개 변수가 존재하는 생성자에 포함되기도 하며, 복사 생성자는 새 인스턴스를 기존 인스턴스의 값으로 초기화할 때 유용합니다.

 

일반적으로 C#은 객체에 대한 복사 생성자를 제공하지 않으므로 필요에 따라 개발자가 직접 구현해야 합니다. 다음은 복사 생성자 구문입니다.

class Person
{
  // field...

  // 기본 생성자
  public Person()
  {
    // Code...
  }

  // 복사 생성자
  public Person(Person person)
  {
    // Code...
  }
}

복사 생성자의 이름은 클래스 이름과 동일하며, 복사 생성자의 매개변수는 클래스 인스턴스입니다.


복사 생성자 필요성

복사 생성자의 필요성을 알아보기 위해 복사 생성자가 없는 예제부터 확인해봅시다. 다음은 매개변수가 존재하는 생성자로 클래스 필드의 값을 초기화합니다.

class Person
{
  public string name { get; set; }
  public int age { get; set; }

  public Person(string name, int age)
  {
    this.name = name;
    this.age = age;
  }

  public Person(Person person)
  {
    this.name = name;
    this.age = age;
  }

  public override string ToString() { 
    return "Name: " + this.name + ", Age: " + this.age; 
  }
}

class Program
{
  static void Main(string[] args)
  {
    Person person1 = new Person("Bob", 20);
    Person person2 = new Person(person1.name, person1.age);

    Console.WriteLine(person1.ToString());
    Console.WriteLine(person2.ToString());
  }
}

실행 결과

Name: Bob, Age: 20
Name: Bob, Age: 20

위 예제는 person1 객체의 값을 복사하기 위해 매개변수 생성자에 person1 객체의 필드 값을 전달했습니다. 간단한 코드라서 복사 생성자의 필요성을 느끼지 못할 수도 있습니다.

 

그런데, 다음과 같이 Person 클래스의 필드가 추가된다면 코드를 작성하는데 큰 불편함을 느끼게 될 것입니다.

class Person
{
  public string name { get; set; }
  public int age { get; set; }
  public string address { get; set; }
  public string userID { get; set; }
  public string userPassword { get; set; }
  public string phoneNumber { get; set; }
  public string gender { get; set; }
  // ...
}

클래스의 필드가 추가되고 복사해야 하는 인스턴스가 많아질수록 코드의 가독성은 엄청나게 저하되고 매개변수가 존재하는 생성자에 값을 입력하느라 많은 시간이 소모됩니다.

 

클래스에 50개의 필드가 존재하고 매개변수가 존재하는 생성자로 객체를 복사하는 작업을 수행한다고 상상해봅시다. 정말 끔찍하지 않을 수 없습니다.


복사 생성자 예제

다음은 객체를 복사하기 위해 복사 생성자를 사용하는 예제입니다.

class Person
{
  public string name { get; set; }
  public int age { get; set; }

  // 복사 생성자
  public Person(Person person)
  {
    this.name = name;
    this.age = age;
  }

  public override string ToString() { 
    return "Name: " + this.name + ", Age: " + this.age; 
  }
}

class Program
{
  static void Main(string[] args)
  {
    Person person1 = new Person("Bob", 20);
    person1.name = "Bob";
    person1.age = 20;

    Person person2 = new Person(person1);
    Person person3 = new Person(person1);
    Person person4 = new Person(person1);
    Person person5 = new Person(person1);
  }
}

복사 생성자에 클래스 객체를 전달하여 새로운 객체를 생성합니다. 클래스에 필드가 추가되더라도 복사 생성자의 내부 코드만 수정하면 되므로 매개변수가 존재하는 생성자보다 훨씬 효율적입니다.

 

따라서 객체를 다른 객체에 복사하고 싶을 때마다 복사 생성자를 사용할 수 있습니다.

반응형

댓글