개발관련/C# (초급)

[C#] == 연산자와 Equals, ReferenceEquals🤓

kimyongmin519 2026. 5. 4. 00:00

우리는 코드를 작성하면서 어떤 것과 어떤 것을 비교할 때가 있습니다.
그때 우리는 "비교 연산자" 라는 것을 사용합니다. (==, !=, >, < 등등)
이중에서 == 비교를 할 때 서로 같은지 다른지를 체크하는 녀석입니다.
이 친구처럼 C#에서 서로 같은 녀석인지 비교를 하게 해주는 녀석들은 더 존재합니다. 이 글에서는 이 녀석들을 알아보겠습니다.

수텝 1. == 연산자👶

== 연산자는 가장 일반적으로 사용되며
값 형식일 경우(int, bool 등등) 변수에 저장된 실제값이 같은지 비교합니다.
참조 형식일 경우(class등등) 두 변수가 같은 메모리 위치를 가리키는지 (같은 객체를 가리키는지) 비교합니다.
특징으로는 연산자 오버로딩이 가능합니다.
여기서 연산자 오버로딩은 후술할 Equals의 재정의와 비슷하며 둘다 두 비교 대상이 같은가를 어떤 기준으로 판별할지 정할 수 있습니다.
예시로 내부적으로 string은 주소가 달라도 문자열 내용만 같으면 true를 반환하도록 되어있습니다.

 

Step 2. Equals🤓

Equals는 System.Object에 있는 가상메서드이기 때문에 모든 객체에 정의되어있으며 int같은 녀석들도 최상위 부모로 object를 상속 받기 때문에 Equals가 존재합니다.
Equals는 ==연산자와 똑같이 이 두 녀석이 같은 지를 판별하는데요.
이 녀석은 가상메서드인 만큼 재정의가 가능합니다.
예시 코드로

public class Monster
{
    public int MonsterID;

    public override bool Equals(object obj)
    {
        if (obj is Monster other)
        {
            return this.MonsterID == other.MonsterID;
        }
        return false;
    }
}

 

이런 식으로 Monster의 Id만 같다면 같은 녀석으로 처리해준다고 개발자 맘대로 지정할 수도 있습니다.

SiuuTep 3. ReferenceEquals😎

앞서 말한 녀석들과 달리 오버로딩과 오버라이딩이 불가능하며 오직 두 객체의 참조 주소만 비교합니다. (이름도 "레퍼런스" 이퀄임)

별다른 특징 없이 이게 다이며 주의할 점으로는 int같은 값형식을 넣을 시 박싱처리되어 무조건 false가 뜹니다. (박싱과 언박싱에 대해서는 아래 링크 참고)
https://kimyongmin519.tistory.com/31

'개발관련 > C# (초급)' 카테고리의 다른 글

[C#] 박싱과 언박싱🤓  (0) 2026.03.11