C# 프로그래밍에서 문자열을 비교할 때 == 연산자와 Equals() 메서드 두 가지 방법을 사용할 수 있습니다. 하지만 이 둘은 내부적으로 동작하는 방식이 다르며, 상황에 따라 결과가 달라질 수 있습니다.
Equals() 메서드는 오직 문자열의 내용(content)만 비교하는 반면, == 연산자는 객체의 참조 동일성(reference identity)을 기준으로 비교합니다. 즉, 두 변수가 같은 메모리 위치를 가리키는지를 확인합니다.
예제 1: 동일한 참조를 가진 문자열 비교
using System;
namespace ComparisionExample {
class Program {
static void Main(string[] args) {
string str = "hello";
string str2 = str;
Console.WriteLine("Using Equality operator: {0}", str == str2);
Console.WriteLine("Using equals() method: {0}", str.Equals(str2));
Console.ReadKey();
}
}
}출력 결과
Using Equality operator: True Using equals() method: True
위 예제에서 str2는 str과 동일한 참조를 공유하므로, == 연산자와 Equals() 메서드 모두 True를 반환합니다. 참조가 같으면 내용도 자연스럽게 같기 때문입니다.
예제 2: 서로 다른 참조를 가진 문자열 비교
이번에는 참조가 다른 경우를 살펴보겠습니다.
using System;
namespace Demo {
class Program {
static void Main(string[] args) {
object str = "hello";
char[] values = {'h','e','l','l','o'};
object str2 = new string(values);
Console.WriteLine("Using Equality operator: {0}", str == str2);
Console.WriteLine("Using equals() method: {0}", str.Equals(str2));
Console.ReadKey();
}
}
}출력 결과
Using Equality operator: False Using equals() method: True
이 예제의 결과는 흥미롭습니다. str과 str2는 모두 "hello"라는 동일한 내용을 가지고 있지만, str2는 new string()으로 새로 생성된 별개의 객체이기 때문에 참조가 다릅니다.
따라서 == 연산자는 참조가 다르다는 이유로 False를 반환하고, Equals() 메서드는 내용이 동일하므로 True를 반환합니다.
정리
- == 연산자: 변수의 타입이 object일 때는 참조 동일성(메모리 주소)을 비교합니다. 단, 양쪽 모두 string 타입으로 선언된 경우에는 내용을 비교합니다.
- Equals() 메서드: 항상 문자열의 실제 내용을 비교합니다.
따라서 문자열의 내용 자체를 비교하는 것이 목적이라면, 타입과 무관하게 일관된 결과를 보장하는 Equals() 메서드를 사용하는 것이 더 안전한 선택입니다.