2023. 2. 6. 13:48ใJAVA/Effective JAVA
[์ดํํฐ๋ธ ์๋ฐ] Item14. Comparable์ ๊ตฌํํ ์ง ๊ณ ๋ฏผํ๋ผ.
์ฌ๊ธฐ์ ์ฐ์ CompareTo์ ๋ํ ๊ธฐ๋ณธ ๊ท์ฝ์ ๋ํด์ ๋ดค๊ณ , ์ด์ compareTo๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ด๋ค.
public class PhoneNumber implements Comparable<PhoneNumber>
{
...
}
๋จผ์ ์์ฐ์ ์ธ ์์ natural order๋ฅผ ์ ๊ณตํ ํด๋์ค์ implements Comparable<T>๋ฅผ ์ ์ธํ๋ค.
Comparable์ ํ์ ์ ์ธ์๋ก ๋ฐ๋ ์ ๋ค๋ฆญ ์ธํฐํ์ด์ค์ด๋ฏ๋ก compareTo ๋ฉ์๋์ ์ธ์ ํ์ ์ ์ปดํ์ผ ํ์์ ์ ํด์ง๋ค. (์ ๋ ฅ ์ธ์์ ํ์ ์ ํ์ธํ๊ฑฐ๋ ํ๋ณํํ ํ์๊ฐ ์๋ค๋ ๋ป)
@Override
public int compareTo(PhoneNumber o)
{
int result = Short.compare(areaCode, o.areaCode);
if (result == 0) {
result = Short.compare(prefix, o.prefix);
if (result == 0) {
result = Short.compare(lineNum, o.lineNum);
}
}
return result;
}
๊ทธ๋ฆฌ๊ณ compareTo ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๋ค.
compareTo ๋ฉ์๋ ์์์ ๊ธฐ๋ณธ ํ์ ์ ๋ฐ์ฑ๋ ๊ธฐ๋ณธ ํ์ compare์ ์ฌ์ฉํด ๋น๊ตํ๋ค. (Short.compare)
๊ทธ๋ฆฌ๊ณ ์ด์ ๋น๊ตํ ๋ ํต์ฌ ํ๋๊ฐ ์ฌ๋ฌ๊ฐ๋ผ๋ฉด ๋น๊ต ์์๊ฐ ์ค์ํ๋ค.
์์๋ฅผ ๊ฒฐ์ ํ๋๋ฐ ์์ด์ ๊ฐ์ฅ ์ค์ํ ํ๋๋ฅผ ๋น๊ตํ๊ณ ๊ทธ ๊ฐ์ด 0์ด๋ผ๋ฉด ๋ค์ ํ๋๋ฅผ ๋น๊ตํ๋ ์์๋ก ์ด์ด๊ฐ๋ค.
๊ทผ๋ฐ ์ด์ ๊ธฐ์กด ํด๋์ค๋ฅผ ํ์ฅํ๊ณ ํ๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ์ compareTo ๊ท์ฝ์ ์งํฌ ์ ์๋ค.
public class Point implements Comparable<Point>
{
final int x, y;
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
public int getX()
{
return x;
}
public int getY()
{
return y;
}
@Override
public int compareTo(Point o)
{
int result = Integer.compare(this.x, o.x);
if (result == 0) {
result = Integer.compare(this.y, o.y);
}
return result;
}
}
์ด๋ ๊ฒ ์์ ํด๋์ค์์ Comparable์ implementsํ๊ณ compareTo ๊ตฌํํ๋ค.
public class NamedPoint extends Point
{
final private String name;
public NamedPoint(int x, int y, String name)
{
super(x, y);
this.name = name;
}
}
๊ทธ๋ฆฌ๊ณ ํ์ ํด๋์ค์์ Point ํด๋์ค๋ฅผ ์์๋ฐ๊ณ ์ถ๊ฐ๋ก name ํ๋๋ฅผ ์ถ๊ฐํด์ ๋น๊ต๋ฅผ ํ๊ณ ์ถ๋ค๊ณ ํ๋ค..
๊ทธ๋ฌ๋ฉด ๋ค์ Comparable์ ๊ตฌํํ๊ณ ํ๊ณ ์ถ๊ฒ ์ง๋ง ๊ทธ๋ ๊ฒ ํ ์ ์๋ค.
public static void main(String[] args)
{
NamedPoint p1 = new NamedPoint(1, 0, "hyejin");
NamedPoint p2 = new NamedPoint(1, 0, "chamo");
Set<NamedPoint> points = new TreeSet<>(new Comparator<NamedPoint>()
{
@Override
public int compare(NamedPoint p1, NamedPoint p2)
{
int result = Integer.compare(p1.getX(), p2.getX());
if (result == 0) {
result = Integer.compare(p1.getY(), p2.getY());
}
if (result == 0) {
result = p1.name.compareTo(p2.name);
}
return result;
}
});
points.add(p1);
points.add(p2);
System.out.println("points = " + points);
}
๋์ ์ด๋ ๊ฒ ์์ฑ์์ Comparator๋ฅผ ์ ๋ฌํด์ compare๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ด ์๊ธด ํ๋ฐ ๋น์ถํ๋ ๋ฐฉ๋ฒ์ด๋ค.
-> Composition์ ์ฌ์ฉํ์!!
public class Point implements Comparable<Point>
{
final int x, y;
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
@Override
public int compareTo(Point o)
{
int result = Integer.compare(this.x, o.x);
if (result == 0) {
result = Integer.compare(this.y, y);
}
return result;
}
}
public class NamedPoint implements Comparable<NamedPoint>
{
private final Point point;
private final String name;
public NamedPoint(Point point, String name)
{
this.point = point;
this.name = name;
}
public Point getPoint()
{
return this.getPoint();
}
@Override
public int compareTo(NamedPoint o)
{
int result = this.point.compareTo(o.point);
if (result == 0) {
result = this.name.compareTo(o.name);
}
return result;
}
}
-> Comparable์ ๊ตฌํํ ํด๋์ค๋ฅผ ํ์ฅํ๊ณ ๊ฐ ์ปดํฌ๋ํธ๋ฅผ ์ถ๊ฐํ๊ณ ์ถ๋ค๋ฉด ํ์ฅํ๋ ๋์ ๋ ๋ฆฝ์ ์ธ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ ์ด ํด๋์ค์ ์๋ ํด๋์ค ์ด๋ํด์ค๋ฅผ ๊ฐ๋ฆฌํค๋ ํ๋๋ฅผ ๋๊ณ , ๊ทธ ๋ค์ ๋ด๋ถ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ '๋ทฐ' ๋ฉ์๋(getPoint)๋ฅผ ์ ๊ณตํ๋ฉด ๋๋ค.