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

C# 배열 복사 완벽 정리: CopyTo() vs Clone() 차이점과 사용법

C#에서 배열을 다룰 때 요소를 다른 배열로 복사하거나 배열 전체를 복제해야 하는 경우가 자주 발생합니다. 이때 많이 사용되는 메서드가 바로 CopyTo()Clone()입니다. 두 메서드는 이름은 비슷하지만 동작 방식과 용도가 분명히 다르므로, 각각의 특징을 정확히 이해하고 상황에 맞게 사용하는 것이 중요합니다.

C# Array.CopyTo() 메서드란?

CopyTo() 메서드는 현재 1차원 배열의 모든 요소를 지정한 대상 1차원 배열로 복사합니다. 이때 복사가 시작될 대상 배열의 인덱스를 32비트 정수(int) 형태로 직접 지정할 수 있다는 것이 핵심 특징입니다.

즉, 소스 배열의 어느 위치부터 복사를 시작할지 개발자가 원하는 시작 인덱스를 설정할 수 있어, 부분 복사나 특정 위치에 데이터를 삽입하는 작업에 유용하게 활용됩니다.

CopyTo() 사용 예제

다음은 C#에서 배열 클래스의 CopyTo() 메서드를 사용하는 예제입니다.

using System;

class Program {
    static void Main() {
        int[] arrSource = new int[4];
        arrSource[0] = 5;
        arrSource[1] = 9;
        arrSource[2] = 1;
        arrSource[3] = 3;

        int[] arrTarget = new int[4];

        // CopyTo() 메서드로 요소 복사
        arrSource.CopyTo(arrTarget, 0);

        Console.WriteLine("대상 배열 ...");
        foreach (int value in arrTarget) {
            Console.WriteLine(value);
        }
    }
}

위 코드에서 arrSource.CopyTo(arrTarget, 0)은 소스 배열의 모든 요소를 대상 배열의 0번째 인덱스부터 순서대로 복사합니다. 실행 결과 대상 배열에는 5, 9, 1, 3이 그대로 저장된 것을 확인할 수 있습니다.

C# Array.Clone() 메서드란?

Clone() 메서드는 기존 배열과 동일한 요소를 가진 새로운 배열을 생성하여 반환합니다. 반환 타입이 object이기 때문에 실제 사용 시에는 원래 배열 타입으로 캐스팅해야 한다는 점에 유의해야 합니다.

아래 예제에서는 문자열 배열을 복제하는 과정을 보여줍니다.

Clone() 사용 예제

using System;

class Program {
    static void Main() {
        string[] arr = { "one", "two", "three", "four", "five" };
        string[] arrCloned = arr.Clone() as string[];

        Console.WriteLine(string.Join(",", arr));

        // 복제된 배열 출력
        Console.WriteLine(string.Join(",", arrCloned));
        Console.WriteLine();
    }
}

위 코드에서 arr.Clone() as string[]은 원본 배열을 그대로 복제한 새로운 문자열 배열을 만듭니다. 복제된 배열은 원본과 완전히 독립적인 배열 객체이지만, 내부 요소(참조 타입인 경우)는 얕은 복사(shallow copy)로 공유된다는 점을 기억해 두면 좋습니다.

CopyTo()와 Clone()의 주요 차이점

두 메서드의 차이를 한눈에 비교하면 다음과 같습니다.

  • 복사 범위: CopyTo()는 요소를 기존에 존재하는 다른 배열로 복사하는 반면, Clone()은 새로운 배열 객체 자체를 생성합니다.
  • 시작 인덱스 지정: CopyTo()는 대상 배열에서 복사를 시작할 인덱스를 직접 지정할 수 있지만, Clone()은 항상 배열 전체를 복제합니다.
  • 반환 값: CopyTo()는 void 타입으로 아무것도 반환하지 않으며, Clone()은 object 타입의 새 배열을 반환하므로 캐스팅이 필요합니다.
  • 대상 배열 준비: CopyTo()는 미리 크기가 충분한 대상 배열을 생성해 두어야 하고, Clone()은 별도의 대상 배열 없이 호출만 하면 됩니다.

요약하자면, 특정 위치부터 요소를 복사해야 한다면 CopyTo()를, 배열 전체를 빠르게 복제하고 싶다면 Clone()을 사용하는 것이 효율적입니다. 두 메서드의 특성을 잘 구분하여 사용하면 배열 데이터 관리 코드를 더욱 안전하고 깔끔하게 작성할 수 있습니다.