string을 비교할 때 ==과 Equals()의 차이는 값 비교 또는 참조 비교이다.
==의 경우 참조를 비교한다.
Equals()의 경우 값을 비교한다.
일반적으로 같은 string 타입끼리의 비교는 ==을 하나 Equals을 하나 상관 없다.
==을 사용하면 내부적으로 연산자 오버로딩이 되어 있어 string.Equals를 호출하도록 되어 있다.
결국에는 ==을 사용하나 Equals를 사용하나 똑같이 Equals가 호출 된다는 것이다.
그렇다고 ==와 Equals의 차이가 없는 것은 아니다.
위에서도 언급했듯이 ==은 참조 비교다.
아래 코드블럭을 보자
class Program
{
static void Main(string[] args)
{
string text1 = "안녕?";
object text2 = new string("안녕?");
if (text1 == text2)
{
// 의도하지 않은 참조가 발생할 수 있다는 경고가 발생.
// text1과 text2의 참조가 다르기 때문에 이 조건문에 부합되지 않는다.
}
if (text1.Equals(text2))
{
// 참조는 다르지만 값은 같기 때문에 이 조건문에 부합된다.
}
}
}
만약 object text2가 object형이 아닌 string였다면 첫번째 if문 조건에 부합되었을 것이다.
object text2의 참조가 string text1과 다르기 때문에 == 연산자를 사용 시 다르다고 나오는 것이다.
그리고 아래 코드 블럭을 보자
class Program
{
static void Main(string[] args)
{
StringBuilder sbText1 = new StringBuilder();
StringBuilder sbText2 = new StringBuilder();
if (sbText1 == sbText2)
{
// 참조 값이 다르기 때문에 이 조건에는 부합되지 않는다.
}
if (sbText1.Equals(sbText2))
{
// 참조 값은 다르지만 값은 같기 때문에 이 조건에 부합된다.
}
}
}
StringBuilder sbText1과 sbText2가 있다.
두 객체 모두 생성하고나서 아무런 값을 넣어주지 않아 빈 string인 상태이다.
이 두개의 객체를 비교해보면
첫번째 비교에는 부합되지 않는다. sbText1과 sbText2의 참조가 다르기 때문이다.
두번째 비교에는 부합된다. sbText1과 sbText2의 값(텅 빈)을 비교했기 때문이다.
이렇듯 값 비교냐 참조 비교냐에 따라 결과가 달라질 수 있기 때문에 사용 시 주의해야 한다.
(string만 그런게 아니라 다른 타입들도 마찬가지!)
참고로 본문과는 조금 다르지만 string 비교 시 대소문자 구분 없이 비교하기 위해
ToUpper()나 ToLower()를 사용해서 비교하는 경우가 많은데 사실 이 방법은 좋지 않은 방법이다.
string은 불변 객체이기 때문에 ToUpper()나 ToLower()를 사용하게 되면
내부적으로 새롭게 객체가 할당되어 불필요한 객체 2개를 만들게 되고 이는 GC의 대상이 된다.
'프로그래밍 > 기본기ㆍ자료구조' 카테고리의 다른 글
메모리 풀과 오브젝트 풀 (0) | 2021.02.11 |
---|---|
스레드와 프로세스의 차이 (0) | 2021.02.07 |
OOP 객체지향 5가지 원칙 (1) | 2021.02.04 |
OOP 객체지향 4가지 특징 (0) | 2021.02.03 |
C, C++, C# 언어의 차이점 (2) | 2021.02.02 |