728x90
반응형
1. 핵심 정리
using System;
class Point {
private int x;
private int y;
public Point(int xPos, int yPos) {
x = xPos;
y = yPos;
}
}
class Program {
static void Main() {
Point p1 = new Point(1, 1);
Point p2 = new Point(1, 1);
Console.WriteLine(p1.Equals(p2));
}
}
이전과 비슷한 코드에 CompareTo가 아닌 Equals를 사용하고 있다.
Equals는 object로부터 파생되어 언제나 사용할 수 있다.
① Equals vs CompareTo 메소드
Equals는 object로 부터 나왔으니 레퍼런스를 조사하고, 위의 코드에서 18번째 라인은 False가 나올 것이다.
이것또한 재정의로 사용자의 맘대로 비교를 할 수 있다.
using System;
class Point {
private int x;
private int y;
public Point(int xPos, int yPos) {
x = xPos;
y = yPos;
}
public override bool Equals(object obj) {
Point pt = (Point)obj;
return x == pt.x && y == pt.y;
}
}
class Program {
static void Main() {
Point p1 = new Point(1, 1);
Point p2 = new Point(1, 1);
Console.WriteLine(p1.Equals(p2));
}
}
여기까진 예전에 한 번 해본 내용이다.
그렇다면 전의 내용과 같이 Point가 class가 아닌 struct로 바꾸면 어떻게 될까?
그럼 12번째 라인에서 object로 인자를 받고 있으니 p2를 인자로 보낼 때 Boxing이다.
Boxing이 안되게 하려면 object가 아닌 Point를 인자로 받으면 해결된다.
문제는 object가 제공하는 Equals는 인자가 Point가 아닌 object이므로 다시 Boxing이 발생할 수 밖에 없다
그래서 C#에는 이 문제를 해결하기 위한 방법으로 IEquatable이라는 인터페이스가 존재한다.
using System;
// CompareTo : IComparable, IComparable<T>
// Equals : object
interface IEquatable<T> {
bool Equals(T other)
}
struct Point : IEquatable<Point> {
private int x;
private int y;
public Point(int xPos, int yPos) {
x = xPos;
y = yPos;
}
public bool Equals(Point pt) {
return x == pt.x && y == pt.y;
}
public override bool Equals(object pt) {
Point pt = (Point)obj;
return x == pt.x && y == pt.y;
}
}
class Program {
static void Main() {
Point p1 = new Point(1, 1);
Point p2 = new Point(1, 1);
Console.WriteLine(p1.Equals(p2));
}
}
마찬가지로 IEquatable<T>도 C#에 존재하므로 적지 않아도 된다.
앞의 내용과 같이 어느 하나만 구현하는게 아닌 가상함수와 인터페이스 모두를 구현하는 것이 좋다.
② 권장 사항
=> Equals()를 제공할 때, object의 메소드만 재정의 하지 말고, IEquatable<T> 인터페이스도 구현하는 것이 좋다.
728x90
반응형
'프로그래밍 > C#' 카테고리의 다른 글
[C#] 다차원 배열, 가변 배열 (1) | 2020.02.14 |
---|---|
[C#] 배열 기본 (0) | 2020.02.14 |
[C#] Boxing / Unboxing (2) (1) | 2020.02.11 |
[C#] Boxing / Unboxing (1) (1) | 2020.02.10 |
[C#] casting (0) | 2020.02.07 |