본문 바로가기

프로그래밍/기본기ㆍ자료구조

C# string 비교 == 과 Equals()

728x90
반응형

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의 대상이 된다.

 

다람쥐와 포동포동이

 

 

 

RememberCook 9월 28일 정식 출시!

두번째 게임인 RememberCook이 출시되었습니다. 귀여운 캐릭터들이 나오는 간단한 게임이며 플레이어의 공간인지능력을 테스트하는 게임입니다. 아래 링크를 통해 다운 받으실 수 있으니 많은 관

chipmunk-plump-plump.tistory.com

반응형