C# String.Copy()와 String.Clone() 메서드란?
C#에서 문자열을 다루다 보면 String.Copy()와 String.Clone() 두 메서드가 자주 혼동됩니다. 두 메서드 모두 문자열과 관련이 있지만, 내부적으로 동작하는 방식은 완전히 다릅니다. 이번 글에서는 두 메서드의 차이점을 예제 코드와 실행 결과를 통해 자세히 살펴보겠습니다.
String.Copy() 메서드
String.Copy()는 지정된 문자열과 동일한 값을 가지는 새로운 String 인스턴스를 생성합니다. 즉, 기존 문자열과 같은 내용을 담은 완전히 새로운 객체가 메모리에 만들어집니다.
String.Copy() 사용 예제
using System;
class Demo {
static void Main(String[] args) {
string str1 = "mark";
string str2 = "marcus";
Console.WriteLine("str1 = '{0}'", str1);
Console.WriteLine("str2 = '{0}'", str2);
Console.WriteLine("After using String.Copy...");
str2 = String.Copy(str1);
Console.WriteLine("str1 = '{0}'", str1);
Console.WriteLine("str2 = '{0}'", str2);
}
}
실행 결과
str1 = 'mark'
str2 = 'marcus'
After using String.Copy...
str1 = 'mark'
str2 = 'mark'
위 결과를 보면 String.Copy(str1) 호출 이후 str2에 str1과 동일한 값 'mark'가 저장된 것을 확인할 수 있습니다. 이때 str2는 str1과 같은 값을 가지지만, 서로 다른 새로운 인스턴스라는 점이 중요합니다.
String.Clone() 메서드
String.Clone()은 기존 String 인스턴스에 대한 참조(reference)를 반환합니다. 새로운 객체를 생성하지 않고 동일한 인스턴스를 그대로 가리키게 되며, 반환 타입이 object이므로 사용 시 String으로 명시적 형변환(casting)이 필요합니다.
String.Clone() 사용 예제
using System;
class Demo {
static void Main(String[] args) {
string str1 = "amy";
string str2 = "emma";
Console.WriteLine("str1 = '{0}'", str1);
Console.WriteLine("str2 = '{0}'", str2);
Console.WriteLine("After using String.Clone...");
str2 = (String)str1.Clone();
Console.WriteLine("str1 = '{0}'", str1);
Console.WriteLine("str2 = '{0}'", str2);
}
}
실행 결과
str1 = 'amy'
str2 = 'emma'
After using String.Clone...
str1 = 'amy'
str2 = 'amy'
Clone() 호출 후 str2에는 역시 'amy'라는 동일한 문자열이 표시되지만, 이것은 새로 복사된 값이 아니라 str1이 가리키는 원본 인스턴스에 대한 참조입니다.
두 메서드의 핵심 차이점 비교
- String.Copy() : 지정한 문자열과 같은 값을 갖는 새로운 String 인스턴스를 생성합니다.
- String.Clone() : 기존 String 인스턴스에 대한 참조만 반환하며, 새로운 객체를 만들지 않습니다.
- 반환 타입 : Copy()는 string을 반환하지만, Clone()은 object를 반환하므로 반드시 형변환이 필요합니다.
마무리 및 추가 팁
C#의 문자열(string)은 불변(immutable)이기 때문에 실무 환경에서는 두 메서드의 동작 차이가 크게 체감되지 않습니다. 특히 .NET Core 3.0 이상 버전에서는 String.Copy() 메서드가 더 이상 권장되지 않으므로(obsolete), 단순히 str2 = str1;처럼 문자열 변수를 대입하는 것만으로도 충분합니다. 다만 레거시 코드나 면접 준비 과정에서 두 메서드의 개념적 차이를 정확히 이해해 두는 것은 여전히 유용합니다.