참치김밥은 최고의 한식이다

[Effective C# 2판] Item 9 : 다양한 동일성 개념들 사이의 상관관계를 이해하라 (Equals) 본문

카테고리 없음

[Effective C# 2판] Item 9 : 다양한 동일성 개념들 사이의 상관관계를 이해하라 (Equals)

l__j__h 2024. 2. 21. 13:30
이번 Item 에서는 이해하기 쉽게 세 줄 요약을 써 봤다~~
세 줄 요약 :

1. 값 타입을 만들 때는 Equals()를 재정의하고,
2. 참조 타입을 만들 때는 System.Object가 정의한 의미 체계를 따르지 않을 때(System.Object의 Equals()는 두 인수가 같은 객체를 참조할 때 true를 반환함) Equals()를 재정의하자.
3. 더불어 Equals()를 재정의하는 경우에는 GetHashCode()도 반드시 재정의해야 한다.

 

C#은 서로 다른 객체가 ‘같다’는 것을 결정하는 함수를 4가지나 가지고 있다.

public static bool ReferenceEquals(object left, object right);
public static bool Equals(object left, object right);
public virtual bool Equals(object right);
public static bool operator ==(MyClass left, MyClass right);

덧붙여, 만일 Equals()를 재정의하는 경우, IEquatable<T>를 구현해야 한다.

참조 타입의 경우, 두 객체가 동일한 객체를 참조하고 있다면 이 객체들은 동일하다고 간주한다. 이를 객체 ID가 동일하다고 한다.

값 타입의 경우, 두 객체의 타입이 일치해야 하고, 값의 내용 또한 일치해야만 동일한 객체로 판단한다.

이처럼 동일성을 판단하는 기준이 다르기 때문에 위와 같이 여러 가지 메서드가 필요하다.

  • Object.ReferenceEquals()는 두 개의 참조 타입 객체가 동일한 객체를 참조하는 경우 true를 반환한다. 즉, 값 타입 오브젝트에게 이 메서드를 쓰면 항상 false를 반환한다.

 

아래 링크를 보면, 객체가 타입 일때와 참조 타입 일 때, Equals()와 ==로 동등성을 판단하는 방법이 다르다는 것을 알 수 있다. (내가 그 동안 헷갈렸던 이유)

https://dhshin94.tistory.com/81

 

[C#] 동등성 (Equality)

1. 참조 타입(reference type)의 동등성(Equality) using System; class Point { private int x = 0; private int y = 0; public Point(int xPos, int yPos) { x = xPos; y = yPos; } } class Program { static void Main() { Point p1 = new Point(1, 1); Point p2 =

dhshin94.tistory.com

 

728x90