C#의 CopyTo() 메서드는 문자열(인스턴스) 내에서 지정한 위치부터 시작하는 일정 개수의 문자를, 유니코드 문자 배열(char[])의 지정한 위치로 복사할 때 사용합니다. 문자열의 일부분을 기존 문자 배열에 덮어쓰거나 삽입해야 할 때 유용하게 활용할 수 있습니다.
구문(Syntax)
public void CopyTo(int srcIndex, char[] dest, int destIndex, int count);
각 매개변수의 의미는 다음과 같습니다.
- srcIndex − 복사를 시작할 원본 문자열 내 첫 번째 문자의 인덱스입니다.
- dest − 문자열의 문자들이 복사될 대상 유니코드 문자 배열입니다.
- destIndex − 대상 배열에서 복사가 시작되는 위치의 인덱스입니다.
- count − 원본 문자열에서 대상 배열로 복사할 문자의 개수입니다.
예제 1
첫 번째 예제를 통해 CopyTo() 메서드의 기본적인 동작을 살펴보겠습니다.
using System;
public class Demo {
public static void Main() {
string str = "JohnAndJacob";
Console.WriteLine("String = "+str);
char[] destArr = new char[20];
str.CopyTo(1, destArr, 0, 4);
Console.Write(destArr);
}
}출력 결과
String = JohnAndJacob ohnA
위 예제에서는 문자열 "JohnAndJacob"의 인덱스 1(두 번째 문자 'o')부터 4개의 문자('o', 'h', 'n', 'A')를 추출하여, 비어 있는 destArr 배열의 인덱스 0 위치부터 차례대로 복사했습니다. 그 결과 배열에는 "ohnA"가 저장되었습니다.
예제 2
이번에는 이미 값이 들어 있는 배열에 특정 위치부터 문자를 복사하는 예제입니다.
using System;
public class Demo {
public static void Main() {
string str = "JohnAndJacob";
Console.WriteLine("String = "+str);
char[] destArr = new char[20];
destArr[0] = 'A';
destArr[1] = 'B';
destArr[2] = 'C';
destArr[3] = 'D';
Console.WriteLine(destArr);
str.CopyTo(2, destArr, 3, 4);
Console.Write(destArr);
}
}출력 결과
String = JohnAndJacob ABCD ABChnAn
이 예제에서는 먼저 destArr 배열의 앞부분에 'A', 'B', 'C', 'D'를 직접 할당했습니다. 이후 CopyTo(2, destArr, 3, 4)를 호출하면, 문자열의 인덱스 2('h')부터 4개의 문자('h', 'n', 'A', 'n')가 배열의 인덱스 3 위치부터 복사되어 기존의 'D'를 포함한 뒷부분이 덮어써집니다. 최종적으로 배열의 내용은 "ABChnAn"이 됩니다.
정리
CopyTo() 메서드는 SubString()과 달리 새로운 문자열을 생성하지 않고 기존 문자 배열에 직접 복사하기 때문에, 반복 작업 시 불필요한 객체 생성을 줄여 성능 면에서 유리합니다. 단, 복사 범위가 대상 배열의 크기를 초과하면 ArgumentOutOfRangeException이 발생하므로 인덱스와 count 값을 신중하게 지정해야 합니다.