다음을 통해 공유


등가 비교(C# 프로그래밍 가이드)

경우에 따라 두 값을 같음으로 비교해야 합니다. 경우에 따라 값 같음( 동등성이라고도 함)을 테스트합니다. 즉, 두 변수에 포함된 값이 같음을 의미합니다. 다른 경우에는 두 변수가 메모리에서 동일한 기본 개체를 참조하는지 여부를 결정해야 합니다. 이러한 유형의 같음을 참조 같음 또는 ID라고 합니다. 이 항목에서는 이러한 두 종류의 같음을 설명하고 자세한 내용을 보려면 다른 항목에 대한 링크를 제공합니다.

참조 동일성

참조 같음은 두 개체 참조가 동일한 기본 개체를 참조한다는 것을 의미합니다. 이 문제는 다음 예제와 같이 간단한 할당을 통해 발생할 수 있습니다.

using System;
class Test
{
    public int Num { get; set; }
    public string Str { get; set; }

    public static void Main()
    {
        Test a = new Test() { Num = 1, Str = "Hi" };
        Test b = new Test() { Num = 1, Str = "Hi" };

        bool areEqual = System.Object.ReferenceEquals(a, b);
        // False:
        System.Console.WriteLine($"ReferenceEquals(a, b) = {areEqual}");

        // Assign b to a.
        b = a;

        // Repeat calls with different results.
        areEqual = System.Object.ReferenceEquals(a, b);
        // True:
        System.Console.WriteLine($"ReferenceEquals(a, b) = {areEqual}");
    }
}

이 코드에서는 두 개의 개체가 만들어지지만 assignment 문 후에는 두 참조가 모두 동일한 개체를 참조합니다. 따라서 참조 동등성이 있습니다. 메서드를 ReferenceEquals 사용하여 두 참조가 동일한 개체를 참조하는지 여부를 확인합니다.

참조 같음의 개념은 참조 형식에만 적용됩니다. 값 형식의 인스턴스가 변수에 할당될 때 값의 복사본이 만들어지므로 값 형식 개체에 참조 같음이 있을 수 없습니다. 따라서 메모리에서 동일한 위치를 참조하는 두 개의 unboxed 구조체를 가질 수 없습니다. 또한 두 값 형식을 비교하는 데 사용하는 ReferenceEquals 경우 개체에 포함된 값이 모두 동일한 경우에도 결과가 항상 false표시됩니다. 이는 각 변수가 별도의 개체 인스턴스로 상자화되기 때문입니다. 자세한 내용은 참조 같음(ID)을 테스트하는 방법을 참조하세요.

평등의 가치

값 같음은 두 개체에 동일한 값 또는 값이 포함되어 있음을 의미합니다. int 또는 bool과 같은 기본 값 형식의 경우 값 같음 테스트는 간단합니다. 다음 예제와 == 같이 연산자를 사용할 수 있습니다.

int a = GetOriginalValue();  
int b = GetCurrentValue();  
  
// Test for value equality.
if (b == a)
{  
    // The two integers are equal.  
}  

대부분의 다른 형식에서 값 같음 테스트는 형식이 정의하는 방법을 이해해야 하기 때문에 더 복잡합니다. 필드나 속성이 여러 개 있는 클래스 및 구조체의 경우 값 같음은 모든 필드 또는 속성의 값이 같음을 의미하도록 정의되는 경우가 많습니다. 예를 들어 pointA.X가 pointB.X와 같고 pointA.Y가 pointB.Y와 같으면 두 Point 개체가 동일하게 정의될 수 있습니다. 레코드의 경우 값 같음은 형식이 일치하고 모든 속성과 필드 값이 일치하는 경우 레코드 형식의 두 변수가 같음을 의미합니다.

그러나 형식의 모든 필드를 기준으로 동등성이 있어야 한다는 요구 사항은 없습니다. 하위 집합을 기반으로 할 수 있습니다. 소유하지 않은 형식을 비교할 때 해당 형식에 대해 동등성이 정의되는 방법을 구체적으로 이해해야 합니다. 고유한 클래스 및 구조체에서 값 같음을 정의하는 방법에 대한 자세한 내용은 형식에 대한 값 같음을 정의하는 방법을 참조하세요.

부동 소수점 값의 동일성

부동 소수점 값(doublefloat)의 같음 비교는 이진 컴퓨터에서 부동 소수점 산술 연산이 부정확하기 때문에 문제가 됩니다. 자세한 내용은 항목 System.Double의 비고를 참조하세요.

제목 설명
참조 같음을 테스트하는 방법(ID) 두 변수에 참조 같음이 있는지 여부를 확인하는 방법을 설명합니다.
형식에 대한 값 같음을 정의하는 방법 형식에 대한 값 같음의 사용자 지정 정의를 제공하는 방법을 설명합니다.
유형 C# 형식 시스템에 대한 정보와 추가 정보에 대한 링크를 제공합니다.
레코드 기본적으로 값 같음을 테스트하는 레코드 형식에 대한 정보를 제공합니다.