다음을 통해 공유


같음 연산자 - 두 개체가 같은지 여부를 테스트합니다.

==(같음)!=(같지 않음) 연산자는 피연산자가 같은지 여부를 확인합니다. 값 형식은 내용이 같을 때 같습니다. 참조 형식은 두 변수가 동일한 스토리지를 참조할 때 같습니다.

같음 연산자 ==

같음 연산자 ==는 피연산자가 같으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

값 형식 같음

기본 제공 값 형식의 피연산자는 해당 값이 같은 경우 동일합니다.

int a = 1 + 2 + 3;
int b = 6;
Console.WriteLine(a == b);  // output: True

char c1 = 'a';
char c2 = 'A';
Console.WriteLine(c1 == c2);  // output: False
Console.WriteLine(c1 == char.ToLower(c2));  // output: True

참고

==, <, , >, <=>= 연산자의 경우 피연산자 중 하나가 숫자(Double.NaN 또는 Single.NaN)가 아니면 연산의 결과는 false입니다. 즉, NaN 값이 NaN를 포함한 다른 double(또는 float) 값보다 크거나, 작거나, 같지 않습니다. 자세한 내용과 예제는 Double.NaN 또는 Single.NaN 참조 문서를 참조하세요.

기본 정수 형식의 해당 값이 같은 경우 동일한 열거형 형식의 피연산자가 동일합니다.

사용자 정의 구조체 형식은 기본적으로 == 연산자를 지원하지 않습니다. == 연산자를 지원하려면 사용자 정의 구조체가 해당 연산자를 오버로드해야 합니다.

==!= 연산자가 C# 튜플에서 지원됩니다. 자세한 내용은 튜플 형식 문서의 튜플 같음 섹션을 참조하세요.

참조 형식 같음

기본적으로 두 개의 레코드가 아닌 참조 형식 피연산자는 동일한 개체를 참조하는 경우 같습니다.

public class ReferenceTypesEquality
{
    public class MyClass
    {
        private int id;

        public MyClass(int id) => this.id = id;
    }

    public static void Main()
    {
        var a = new MyClass(1);
        var b = new MyClass(1);
        var c = a;
        Console.WriteLine(a == b);  // output: False
        Console.WriteLine(a == c);  // output: True
    }
}

이 예제에서 표시한 대로 사용자 지정 참조 형식은 기본적으로 == 연산자를 지원합니다. 그러나 참조 형식은 == 연산자를 오버로드할 수 있습니다. 참조 형식이 == 연산자를 오버로드하는 경우 Object.ReferenceEquals 메서드를 사용하여 해당 형식의 두 참조가 동일한 개체를 참조하는지 확인합니다.

레코드 형식 같음

레코드 형식은 기본적으로 값 같음 의미 체계를 제공하는 ==!= 연산자를 지원합니다. 즉, 두 레코드 피연산자는 둘 다 null 또는 모든 필드의 해당 값이고 자동으로 구현된 속성이 같을 때 동일합니다.

public class RecordTypesEquality
{
    public record Point(int X, int Y, string Name);
    public record TaggedNumber(int Number, List<string> Tags);

    public static void Main()
    {
        var p1 = new Point(2, 3, "A");
        var p2 = new Point(1, 3, "B");
        var p3 = new Point(2, 3, "A");

        Console.WriteLine(p1 == p2);  // output: False
        Console.WriteLine(p1 == p3);  // output: True

        var n1 = new TaggedNumber(2, new List<string>() { "A" });
        var n2 = new TaggedNumber(2, new List<string>() { "A" });
        Console.WriteLine(n1 == n2);  // output: False
    }
}

앞의 예제처럼 레코드가 아닌 참조 형식 멤버의 경우 참조되는 인스턴스가 아니라 해당 참조 값이 비교됩니다.

문자열 같음

두 개의 문자열 피연산자가 모두 null이거나 두 문자열 인스턴스가 같은 길이고 각 문자 위치에 동일한 문자가 있을 때 동일합니다.

string s1 = "hello!";
string s2 = "HeLLo!";
Console.WriteLine(s1 == s2.ToLower());  // output: True

string s3 = "Hello!";
Console.WriteLine(s1 == s3);  // output: False

문자열 같음 비교는 대/소문자를 구분하는 서수 비교입니다. 문자열 비교에 대한 자세한 내용은 C#에서 문자열을 비교하는 방법을 참조하세요.

대리자 같음

동일한 런타임 형식의 두 delegate 피연산자가 둘 다 null이거나 해당 호출 목록의 길이가 같고 각 위치에 동일한 항목이 있는 경우 두 피연산자는 같습니다.

Action a = () => Console.WriteLine("a");

Action b = a + a;
Action c = a + a;
Console.WriteLine(object.ReferenceEquals(b, c));  // output: False
Console.WriteLine(b == c);  // output: True

자세한 내용은 C# 언어 사양대리자 같음 연산자 섹션을 참조하세요.

의미상 동일한 람다 식 평가에서 생성된 대리자는 다음 예제와 같이 같지 않습니다.

Action a = () => Console.WriteLine("a");
Action b = () => Console.WriteLine("a");

Console.WriteLine(a == b);  // output: False
Console.WriteLine(a + b == a + b);  // output: True
Console.WriteLine(b + a == a + b);  // output: False

같지 않음 연산자 !=

같지 않음 연산자 !=는 피연산자가 같지 않으면 true를 반환하고, 그렇지 않으면 false를 반환합니다. 기본 제공 형식의 피연산자의 경우 식 x != y는 식 !(x == y)와 동일한 결과를 생성합니다. 형식 같음에 대한 자세한 내용은 같음 연산자 섹션을 참조하세요.

다음 예제에서는 != 연산자의 사용법을 보여 줍니다.

int a = 1 + 1 + 2 + 3;
int b = 6;
Console.WriteLine(a != b);  // output: True

string s1 = "Hello";
string s2 = "Hello";
Console.WriteLine(s1 != s2);  // output: False

object o1 = 1;
object o2 = 1;
Console.WriteLine(o1 != o2);  // output: True

연산자 오버로드 가능성

사용자 정의 형식은 ==!= 연산자를 오버로드할 수 있습니다. 형식이 두 연산자 중 하나를 오버로드하는 경우 나머지 연산자도 오버로드해야 합니다.

레코드 형식은 ==!= 연산자를 명시적으로 오버로드할 수 없습니다. 레코드 형식 T에 대한 ==!= 연산자의 동작을 변경해야 하는 경우 다음 시그니처를 사용하여 IEquatable<T>.Equals 메서드를 구현합니다.

public virtual bool Equals(T? other);

C# 언어 사양

자세한 내용은 C# 언어 사양관계형 및 형식 테스트 연산자 섹션을 참조하세요.

레코드 형식 같음에 관한 자세한 내용은 레코드 기능 제안 노트같음 멤버 섹션을 참조하세요.

참고 항목