ReferenceEquals 메서드
C# 최상위 클래스인 Object에 존재하는 ReferenceEquals() 메서드는 매개변수로 전달된 두 개의 객체가 동일한 인스턴스인지 확인하기 위해 사용됩니다.
ReferenceEquals() 메서드는 재정의할 수 없으며 두 개의 객체가 동일한 인스턴스라면 true를 반환하고 그렇지 않으면 false를 반환합니다.
참조 형식에서 값이 할당되는 과정을 모르신다면 아래 포스팅을 참고해주세요. 값 형식과 참조 형식에서 값이 할당되는 과정을 이해하셔야 ReferenceEquals() 메서드를 이해할 수 있습니다.
예제 1. 객체 비교
다음 예제는 object 타입의 두 객체를 == 연산자로 비교합니다.
class Program
{
static void Main(string[] args)
{
object obj1 = 100;
object obj2 = 100;
if(Object.ReferenceEquals(obj1, obj2))
{
Console.WriteLine("obj1과 obj2는 동일합니다.");
} else
{
Console.WriteLine("obj1과 obj2는 동일하지 않습니다.");
}
}
}
[실행 결과]
obj1과 obj2는 동일하지 않습니다.
obj1, obj2는 동일한 값을 가지는 것처럼 보이지만 참조하고 주소의 값이 다릅니다. 따라서 false가 반환되었습니다.
다음 예제는 obj1을 obj2에 할당합니다.
class Program
{
static void Main(string[] args)
{
object obj1 = 100;
object obj2 = obj1;
if(Object.ReferenceEquals(obj1, obj2))
{
Console.WriteLine("obj1과 obj2는 동일합니다.");
} else
{
Console.WriteLine("obj1과 obj2는 동일하지 않습니다.");
}
}
}
[실행 결과]
obj1과 obj2는 동일합니다.
obj1을 obj2에 할당하면 참조하고 있는 주소의 값이 동일합니다.
예제 2. null 비교
ReferenceEquals() 메서드는 null을 비교하는 방법에도 유용합니다.
다음 예제는 Equals() 메서드를 사용하여 null을 비교합니다.
class Program
{
static void Main(string[] args)
{
object obj = null;
if(obj.Equals(null))
{
Console.WriteLine("obj와 null은 동일합니다.");
} else
{
Console.WriteLine("obj와 null은 동일하지 않습니다.");
}
}
}
[에러 내용]
Equals() 메서드를 호출하는 객체가 null인 경우 NullReferenceException 예외가 발생합니다. 따라서 객체가 null인지 비교하는 방법으로 적절하지 않습니다.
하지만 다음 예제처럼 ReferenceEquals() 메서드를 사용한다면 예외 없이 객체가 null인지 비교할 수 있습니다.
class Program
{
static void Main(string[] args)
{
object obj = null;
if(Object.ReferenceEquals(obj, null))
{
Console.WriteLine("obj와 null은 동일합니다.");
} else
{
Console.WriteLine("obj와 null은 동일하지 않습니다.");
}
}
}
[실행 결과]
obj와 null은 동일합니다.
정리
- Object 클래스의 ReferenceEquals() 메서드는 재정의할 수 없습니다.
- Object 클래스의 ReferenceEquals() 메서드는 두 객체가 동일한 인스턴스인지 확인하기 위해 사용되며 null 비교에도 유용합니다.
'C#' 카테고리의 다른 글
[C#]Dictionary 특정 값이 존재하는지 확인하는 방법 (0) | 2022.08.19 |
---|---|
[C#]Dictionary 특정 키가 존재하는지 확인하는 방법 (0) | 2022.08.18 |
[C#]내부 예외 처리(Inner Exception) (0) | 2022.06.26 |
[C#]throw문, 사용자 정의 예외 (0) | 2022.06.26 |
[C#]finally 키워드, finally문 (0) | 2022.06.26 |
댓글