2023. 1. 26. 15:45ใJAVA/Effective JAVA
item10. equals๋ ์ผ๋ฐ ๊ท์ฝ์ ์ง์ผ ์ฌ์ ์ํ๋ผ.
equals ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ ๋๋ ๋ฐ๋์ ์ผ๋ฐ ๊ท์ฝ์ ๋ฐ๋ผ์ผ ํ๋ค.
equals ์ผ๋ฐ ๊ท์ฝ
1๏ธโฃ ๋ฐ์ฌ์ฑ
A.equals(A) == true
2๏ธโฃ ๋์นญ์ฑ
A.equals(B) == B.equals(A)
3๏ธโฃ ์ถ์ด์ฑ
A.equals(B) == B.equals(C) , A.equals(C)
๊ตฌ์ฒด ํด๋์ค๋ฅผ ํ์ฅํด ์๋ก์ด ๊ฐ์ ์ถ๊ฐํ๋ฉด์ equals ๊ท์ฝ์ ๋ง์กฑ์ํฌ ๋ฐฉ๋ฒ์ ์กด์ฌํ์ง ์์ง๋ง ๊ด์ฐฎ์ ์ฐํ ๋ฐฉ๋ฒ์ด ํ๋ ์๋ค.
-> " ์์ ๋์ ์ปดํฌ์ง์ ์ ์ฌ์ฉํ๋ผ!" ์ธ๋ฐ Point๋ฅผ ์์ํ๋ ๋์ ์ Point๋ฅผ ColorPoint์ private ํ๋๋ก ๋๊ณ , ColorPoint์ ๊ฐ์ ์์น์ ์ผ๋ฐ Point๋ฅผ ๋ฐํํ๋ ๋ทฐ ๋ฉ์๋๋ฅผ public ์ผ๋ก ์ถ๊ฐํ๋ ์์ด๋ค.
// equals ๊ท์ฝ์ ์งํค๋ฉด์ ๊ฐ ์ถ๊ฐํ๊ธฐ -> ์์ ๋์ ์ปดํฌ์ง์
์ ์ฌ์ฉํ๋ผ!
public class ColorPoint
{
private final Point point;
private final Color color;
public ColorPoint(int x, int y, Color color)
{
this.point = new Point(x, y);
this.color = Objects.requireNonNull(color);
}
// colorPoint์ Point ๋ทฐ๋ฅผ ๋ฐํํ๋ค.
public Point asPoint()
{
return point;
}
@Override
public boolean equals(Object obj)
{
if (!(obj instanceof ColorPoint)) {
return false;
}
ColorPoint cp = (ColorPoint) obj;
return cp.point.equals(point) && cp.color.equals(color);
}
@Override
public int hashCode()
{
return 31 * point.hashCode() + color.hashCode();
}
}
public static void main(String[] args)
{
Point p1 = new Point(1, 0);
// Point p2 = new CounterPoint(1, 0);
Point p2 = new ColorPoint(1, 0, Color.RED).asPoint();
System.out.println("onUnitCircle(p1) = " + onUnitCircle(p1)); // true ์ถ๋ ฅ
// true๋ฅผ ์ถ๋ ฅํด์ผ ํ์ง๋ง, Point์ equals๊ฐ getClass๋ฅผ ์ฌ์ฉํด ์์ฑ๋์๋ค๋ฉด false๋ฅผ ์ถ๋ ฅํ๋ค.
System.out.println("onUnitCircle(p2) = " + onUnitCircle(p2));
}
์ปดํฌ์ง์ ์ผ๋ก ๊ตฌํํ๊ณ asPoint๋ฅผ ํตํด Point๋ฅผ ๋ฐํํ๋๋กํ๋ฉด onUnitCirCle(p2)๋ฅผ ์ฌ์ฉํ ์ ์๊ณ ํด๋น ๋ฉ์๋๋ฅผ ์คํํด๋ณด๋ฉด true๋ฅผ ๋ฐํํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
4๏ธโฃ ์ผ๊ด์ฑ
: ์ผ๊ด์ฑ์ ๋ ๊ฐ์ฒด๊ฐ ๊ฐ๋ค๋ฉด(์ด๋ ํ๋ ํน์ ๋ ๊ฐ์ฒด ๋ชจ๋ ์์ ๋์ง ์๋ ํ) ์์ผ๋ก๋ ์์ํ ๊ฐ์์ผ ํ๋ค๋ ๋ป์ด๋ค.
๊ฐ๋ณ ๊ฐ์ฒด๋ ๋น๊ต ์์ ์ ๋ฐ๋ผ ์๋ก ๋ค๋ฅผ ์๋ ํน์ ๊ฐ์ ์๋ ์๋ ๋ฐ๋ฉด์ ๋ถ๋ณ ๊ฐ์ฒด๋ ํ๋ฒ ๋ค๋ฅด๋ฉด ๋๊น์ง ๋ฌ๋ผ์ผ ํ๋ค.
ํด๋์ค๊ฐ ๋ถ๋ณ์ด๋ ๊ฐ๋ณ์ด๋ equals ํ๋จ์ ์ ๋ขฐํ ์ ์๋ ์์์ด ๋ผ์ด๋ค๊ฒ ํด์๋ ์๋๋๋ฐ ์ด ์ ์ฝ์ ์ด๊ธฐ๋ฉด ์ผ๊ด์ฑ ์กฐ๊ฑด์ ๋ง์กฑ์ํค๊ธฐ๊ฐ ๊ต์ฅํ ์ด๋ ต๋ค.
์๋ฅผ ๋ค์ด java.net.URL์ equals๋ ์ฃผ์ด์ง URL๊ณผ ๋งคํ๋ ํธ์คํธ์ IP ์ฃผ์๋ฅผ ์ด์ฉํด ๋น๊ตํ๋ค.
ํธ์คํธ ์ด๋ฆ์ ip์ฃผ์๋ก ๋ฐ๊พธ๋ ค๋ฉด ๋คํธ์ํฌ๋ฅผ ํตํด์ผ ํ๋๋ฐ ๊ทธ ๊ฒฐ๊ณผ๊ฐ ํญ์ ๊ฐ๋ค๊ณ ๋ณด์ฅํ ์ ์๋ค.
// ์ผ๊ด์ฑ ์๋ฐฐ ๊ฐ๋ฅ์ฑ์ด ์์.
// URL equals๋ ์ฃผ์ด์ง URL๊ณผ ํธ์คํธ์ ip ์ฃผ์๋ฅผ ์ด์ฉํด ๋น๊ตํ๋ค.
URL google1 = new URL("https", "about.google", "/products");
URL google2 = new URL("https", "about.google", "/products");
System.out.println("google1.equals(google2) = " + google1.equals(google2));
์ด๋ URL์ equals๊ฐ ์ผ๋ฐ ๊ท์ฝ์ ์ด๊ธฐ๊ฒ ํ๊ณ , ์ค๋ฌด์์๋ ์ข ์ข ๋ฌธ์ ๋ฅผ ์ผ์ผํจ๋ค.
์ด๋ฐ ๋ฌธ์ ๋ฅผ ํผํ๋ ค๋ฉด equals๋ ํญ์ ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํ๋ ๊ฐ์ฒด๋ง์ ์ฌ์ฉํ ๊ฒฐ์ ์ ๊ณ์ฐ๋ง ์ํํด์ผ ํ๋ค.
5๏ธโฃ null-์๋
๋ชจ๋ ๊ฐ์ฒด๊ฐ null๊ณผ ๊ฐ์ง ์์์ผ ํ๋ค.