Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C#에서 ICloneable 인터페이스는 어떤 역할을 할까?

ICloneable 인터페이스란?

C#의 ICloneable 인터페이스는 기존 객체의 복사본, 즉 클론(clone)을 생성할 수 있도록 해주는 인터페이스입니다. 이 인터페이스는 System 네임스페이스에 정의되어 있으며, 객체 복제 기능이 필요한 클래스에서 이를 구현하도록 규정합니다.

ICloneable 인터페이스에는 단 하나의 메서드만 포함되어 있습니다.

  • Clone() − 현재 인스턴스의 복사본인 새로운 객체를 생성하여 반환합니다.

예제

다음 예제는 ICloneable 인터페이스를 구현하여 Car 객체를 복제하는 과정을 보여줍니다.

using System;

class Car : ICloneable {
    int width;

    public Car(int width) {
        this.width = width;
    }

    // 현재 인스턴스의 복사본을 새 객체로 생성
    public object Clone() {
        return new Car(this.width);
    }

    public override string ToString() {
        return string.Format("Width of car = {0}", this.width);
    }
}

class Program {
    static void Main() {
        Car carOne = new Car(1695);
        Car carTwo = carOne.Clone() as Car;

        Console.WriteLine("{0}mm", carOne);
        Console.WriteLine("{0}mm", carTwo);
    }
}

출력 결과

Width of car = 1695mm
Width of car = 1695mm

참고 사항: 얕은 복사와 깊은 복사

위 예제처럼 필드가 값 형식(int)뿐이라면 간단하게 새 객체를 생성해 반환하면 됩니다. 하지만 클래스 내부에 참조 형식(배열, 다른 객체 등) 필드가 있다면 얕은 복사(shallow copy)깊은 복사(deep copy)를 반드시 고려해야 합니다. 얕은 복사는 참조 주소만 복사하기 때문에 원본과 복사본이 같은 내부 객체를 공유하게 되며, 완전히 독립적인 복사본을 원한다면 Clone() 메서드 안에서 내부 객체까지 새로 생성해 주는 깊은 복사를 구현해야 합니다.