๋ชจ๋ ๊ฐ์ฒด์ ๊ณตํต ๋ฉ์๋
Object๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ ๊ตฌ์ฒด ํด๋์ค์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก ์์ํด์ ์ฌ์ฉํ๋๋ก ์ค๊ณ๋จ
Object์์ final์ด ์๋ ๋ฉ์๋๋ ๋ชจ๋ ์ฌ์ ์๋ฅผ ์ผ๋์ ๋๊ณ ์ค๊ณ๋์ด์ง.
๋ฐ๋ผ์, ์ด ๋ฉ์๋๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ค๋ฒ๋ผ์ด๋ฉํด์ผ๋ง ํด๋์ค๊ฐ ์ค๋์ ํ์ง ์๋๋ค.
์์ดํ 10 : equals๋ ์ผ๋ฐ ๊ท์ฝ์ ์ง์ผ ์ฌ์ ์ํ๋ผ
equals ๋ฉ์๋๋ ์ค๋ฒ๋ผ์ด๋ฉ ํ์ง ์์ผ๋ฉด ์ค์ง! ์๊ธฐ์์ ๋ง ๊ฐ๋ค. (๊ฐ์ฒด์๋ณ์ฑ์ผ๋ก ๋น๊ต)
- ์ค๋ฒ๋ผ์ด๋ฉ์ด ํ์ํ ๊ฒฝ์ฐ
- ๊ฐ์ฒด ์๋ณ์ด ์๋ '๋
ผ๋ฆฌ์ ๋์น์ฑ'์ ํ์ธ ํด์ผํ ๋
- ์ฃผ๋ก ๊ฐ ํด๋์ค ( new Inteager(2)๋ฅผ ๋๋ฒํ๋ฉด ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ค๋ฅธ ๊ฐ์ฒด์ด๋ ๋ ผ๋ฆฌ์ ์ผ๋ก๋ ๊ฐ์ ๊ฐ์ ๊ฐ์ง๋ ๊ฐ์ฒด๊ฐ ๋๋ค
- ๊ฐ์ฒด ์๋ณ์ด ์๋ '๋
ผ๋ฆฌ์ ๋์น์ฑ'์ ํ์ธ ํด์ผํ ๋
์์ง์ equals ๋ฉ์๋ ๊ตฌํ๋ฐฉ๋ฒ
1. == ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด ์ ๋ ฅ์ด ์๊ธฐ ์์ ์ ์ฐธ์กฐ์ธ์ง ํ์ธํ๋ค. (์๊ธฐ์์ ์ด๋ฉด true๋ฐํ)
2. instanceof ์ฐ์ฐ์๋ก ์ ๋ ฅ์ด ์ฌ๋ฐ๋ฅธ ํ์ ์ธ ์ง ํ์ธํ๋ค.
3. ์ ๋ ฅ์ ์ฌ๋ฐ๋ฅธ ํ์ ์ผ๋ก ํ๋ณํํ๋ค. -> 2๋ฒ๊ณผ์ ์ผ๋ก ์ธํด ๋ฌด์กฐ๊ฑด ํ๋ณํ ์ฑ๊ณต
4. ์ ๋ ฅ ๊ฐ์ฒด์ ๋์๋๋ ์๊ธฐ์์ ์ 'ํต์ฌ' ํ๋๋ค์ด ๋ชจ๋ ์ผ์นํ๋์ง ํ๋์ฉ ๊ฒ์ฌํ๋ค. ๋ชจ๋ ํ๋๊ฐ ์ผ์นํ๋ฉด true, ์๋๋ฉด false ๋ฐํ
# ์์ ๋น๋ฒ์ ์ ์ฉํ equals ๋ฉ์๋ ๊ตฌํ ์ฝ๋ #
// ์ฝ๋ 10-6 ์ ํ์ ์ธ equals ๋ฉ์๋์ ์ (64์ชฝ)
public final class PhoneNumber {
private final short areaCode, prefix, lineNum;
public PhoneNumber(int areaCode, int prefix, int lineNum) {
this.areaCode = rangeCheck(areaCode, 999, "์ง์ญ์ฝ๋");
this.prefix = rangeCheck(prefix, 999, "ํ๋ฆฌํฝ์ค");
this.lineNum = rangeCheck(lineNum, 9999, "๊ฐ์
์ ๋ฒํธ");
}
private static short rangeCheck(int val, int max, String arg) {
if (val < 0 || val > max)
throw new IllegalArgumentException(arg + ": " + val);
return (short) val;
}
@Override public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof PhoneNumber))
return false;
PhoneNumber pn = (PhoneNumber)o;
return pn.lineNum == lineNum && pn.prefix == prefix
&& pn.areaCode == areaCode;
}
// ๋๋จธ์ง ์ฝ๋๋ ์๋ต - hashCode ๋ฉ์๋๋ ๊ผญ ํ์ํ๋ค(์์ดํ
11)!
}
๋ง์ง๋ง์ผ๋ก equals๋ฅผ ์ฌ์ ์ํ ๋ hascode๋ ๋ฐ๋์ ์ฌ์ ์ํ์.
"ํต์ฌ์ ๋ฆฌ"
๊ผญ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด equals๋ฅผ ์ฌ์ ์ํ์ง๋ง๊ณ ํ์ํ ๊ฒฝ์ฐ ํด๋์ค์ ํต์ฌ ํ๋๋ฅผ ๋น ์ง์์ด ์ ํต์ฌ๊ท์ฝ์ ์ง์ผ๊ฐ๋ฉฐ ๋น๊ตํ์
์์ดํ 11 : equals๋ฅผ ์ฌ์ ์ํ๋ ค๊ฑฐ๋ hasecode๋ ์ฌ์ ์ํ๋ผ
hasecode๋ฅผ ์ฌ์ ์ํ์ง ์์ผ๋ฉด HashMap์ด๋ HashSet๊ฐ์ ์ปฌ๋ ์ ์ ์์๋ก ์ฌ์ฉํ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
- ๋ ผ๋ฆฌ์ ์ผ๋ก ๊ฐ์ ๊ฐ์ฒด๋ ๊ฐ์ ํด์์ฝ๋๋ฅผ ๋ฐํํด์ผํ๋ค. (ํ์ง๋ง ์ฌ์ ์ํ์ง ์์ผ๋ฉด ๋ค๋ฅธ ํด์์ฝ๋๋ฅผ ๋ฐํํ ์ ์๋ ๋ฌธ์ ๋ฐ์)
๋ ผ๋ฆฌ์ ์ผ๋ก ๊ฐ๋ค๋ ๊ฒ์ ์์ดํ 10๋ฒ์ ์กฐ๊ฑด์ ๋ง์กฑํ๊ณ ๋ชจ๋ ํ๋๊ฐ ๊ฐ๋ค๋ ๊ฒ์ด๋ค. ํ์ง๋ง hasecode๋ ์ธ์คํด์ค๋ง๋ค ๋ค๋ฅด๊ฒ ๋ถ์ฌ๋๋ฏ๋ก ๋ ผ๋ฆฌ์ ์ผ๋ก ๊ฐ์๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ก ์ธ์์ด ๋ ์ ์๋ค.
๋ฐ๋ผ์, hascode๋ฉ์๋๋ฅผ ํต์ฌ ํ๋๋ฅผ ์ด์ฉํ์ฌ hasecode๋ฅผ ๋ง๋๋ ๋ฐฉ์์ผ๋ก ๊ฐ์ ํ์. ์ด๋ ๊ฒ ๋๋ฉด ๋ ผ๋ฆฌ์ ์ผ๋ก ๋์น์ธ ๊ฐ์ฒด๋ ๊ฐ์ hasecode๋ฅผ ๊ฐ์ง ์ ์๊ฒ ๋๋ค.
@Override
public int hashCode() {
int result = Short.hashCode(areaCode);
result = 31 * result + Short.hashCode(prefix);
result = 31 * result + Short.hashCode(lineNum);
return result;
}
์์ดํ 12 : toString์ ํญ์ ์ฌ์ ์ํ๋ผ
toString์ ๊ท์ฝ์ "๋ชจ๋ ํ์ ํด๋์ค์์ ์ด ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๋ผ" ์ด๋ค. toString์ ๋จ์ง ํด๋์ค์ด๋ฆ@ํด์์ฝ๋๋ฅผ ๋ณด์ฌ์ค ๋ฟ ๋ณ ์๋ฏธ๊ฐ ์๋ค.
์ฐ๋ฆฌ๋ ์ด ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ ํ์ฌ ์ฌ๋์ด ์ฝ๊ธฐ ์ฌ์ด ์ ์ตํ ์ ๋ณด๋ก ๋ฐ๊ฟ์ค์ผํ๋ค.
toString()์ ์ ๊ตฌํํด๋๋ฉด ์ฌ์ฉํ๊ธฐ ํธํ๊ณ ๋๋ฒ๊น ์ ๋ง์ ๋์์ด ๋๋ค.
๊ตฌํ์ ์ฌ์ฉํ ํฌ๋ฉง์ ์ฃผ์์ผ๋ก ๋ช ์ํ๊ฑฐ๋ ์์๋ฅผ ๋ค์ด์ ์ค๋ช ํด๋ ์ ์๋ค. ํด๋์ค์ ์ฃผ์ ์ ๋ณด๋ฅผ ๋ชจ๋ ํํํ๋ ๊ฒ์ด ์ข๋ค.
์์ ํด๋์ค์ ์ด๋ฏธ ์๋ง๊ฒ ์ ์ํ๋ค๋ฉด ๊ทธ๋๋ก ๊ฐ์ ธ๋ค ์จ๋ ๋๋ค.
์์ดํ 13 : clone ์ฌ์ ์๋ ์ฃผ์ํด์ ์งํํด๋ผ
๋ฉ์๋ ํ๋ ์๋ Cloneable ์ธํฐํ์๋๋ Object์ protected ๋ฉ์๋์ธ clone์ ๋์ ๋ฐฉ์์ ๊ฒฐ์ ํ๋ค.
(์ฌ๊ธฐ์๋ ์ด๋ก์ ์ผ๋ก ๋ฉ์๋์ ๋์ ๋ฐฉ์ ๋ณ๊ฒฝ์ผ๋ก ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ค)
Cloneable์ ๊ตฌํํ ํด๋์ค๋ clone๋ฉ์๋๋ฅผ public์ผ๋ก ์ ๊ณตํ๊ฒ ๋๊ณ clone์ ํตํด ๋ณต์ ๊ฐ ์ ๋๋ก ๋ ๊ฑฐ๋ผ ๊ธฐ๋ํ๋ค.
ํ์ง๋ง, ํด๋นํด๋์ค๋ ์์ ํด๋์ค๋ค์ด ์์ฑ์๋ฅผ ํธ์ถํ์ง ์๊ณ ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๊ฐ๋ฅํ ๊น??
ํด๋์ค๊ฐ ๋ถ๋ณ์ธ ๊ฒฝ์ฐ์๋ clone์ด ๊ฐ๋ฅํ ์ ์์ง๋ง ํด๋์ค ๋ด๋ถ์ ์ฐธ์กฐ๊ฐ์ฒด ๊ฐ์ ๊ฒ์ด ์๋ค๋ฉด ๋ณต์ฌํ ๊ฐ์ฒด๊ฐ ๋๊ฐ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฅดํค์ง ์๋๋ก ๊ฐ์ฒด๋ฅผ ์๋ก ์์ฑํ๊ฑฐ๋ ํด์ค์ผํ๋ค.
์ด์ฉ ์ ์์ด cloneable์ ๊ตฌํํ ํด๋์ค๋ฅผ ํ์ฅํ๋ค๋ฉด clone์ ์ ์๋ํ๋๋ก ๊ตฌํํด์ผ๋ง ํ๋ค.
ํ์ง๋ง, ๊ทธ๋ ์ง ์์ ์ํฉ(cloneable์ ๊ตฌํํ์ง ์์๋ ๋๋ ์ํฉ)์์๋ '๋ณต์ฌ ์์ฑ์'์ '๋ณต์ฌ ํฉํฐ๋ฆฌ'๋ผ๋ ๋ ๋์ ๊ฐ์ฒด ๋ณต์ฌ ๋ฐฉ์์ ์ ๊ณตํ ์ ์๋ค.
public Yum(Yum yum) {...}; // ์๊ธฐ ์์ ๊ณผ ๊ฐ์ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ธ์๋ก ๋ฐ๋ ์์ฑ์
public static Yum newInstance(Yum yum) {...}; // ๋ณต์ฌ ์์ฑ์๋ฅผ ๋ชจ๋ฐฉํ ์ ์ ํฉํฐ๋ฆฌ
์ด ๋ ๊ฐ์ง ๋ฐฉ์์ ์์ฑ์๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ํํ ๊ฐ์ฒด ์์ฑ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ง ์๋๋ค.
"ํต์ฌ ์ ๋ฆฌ"
์๋ก์ด ์ธํฐํ์ด์ค ์์ฑ ์ ์ ๋ Cloneable ํ์ฅํ์ง ๋ง๊ณ , ์๋ก์ด ํด๋์ค๋ ์ด๋ฅผ ๊ตฌํํ์ง ๋ง์.
๋ณต์ ๊ธฐ๋ฅ์ ์์ฑ์์ ํฉํฐ๋ฆฌ๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด ์ต๊ณ ๋ค. (๋ฐฐ์ด์ ์์ธ)
์์ดํ 14 : Comparable์ ๊ตฌํํ ์ง ๊ณ ๋ คํ๋ผ
compareTo๋ Object์ ๋ฉ์๋๊ฐ ์๋๋ค. ์ด ๋ฉ์๋๋ ๋จ์ ๋์น์ฑ ๋น๊ต์ ๋ํด ์์๊น์ง ๋น๊ตํ ์ ์๋ค.
์ด๋ฅผ ํตํด Comparable์ ๊ตฌํํ ํด๋์ค๋ Arrays.sort(); ์ฒ๋ผ ์์ฝ๊ฒ ์ ๋ ฌ์ด ๊ฐ๋ฅํ๋ค.
- Comparable์ ๊ตฌํํ๋ฉด ์ด ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ๋ ๋ง์ ์๊ณ ๋ฆฌ์ฆ๊ณผ ์ปฌ๋ ์ ์ ์ฌ์ฉํ ์ ์๋ค.
- ์ํ๋ฒณ, ์ซ์, ์ฐ๋์ ๊ฐ์ด ์์๊ฐ ๋ช ํํ ๊ฐ ํด๋์ค๋ฅผ ์์ฑํ๋ค๋ฉด ๋ฐ๋์ ๊ตฌํํ์
- Comparable์ ๊ตฌํํ์ง ์์ ํ๋๋ ํ์ค์ด ์๋ ์์๋ก ๋น๊ตํด์ผ ํ๋ค๋ฉด Comparator๋ฅผ ๋์ ์ฌ์ฉํ๋ค.
์ ๋ค๋ฆญ ์ธํฐํ์ด์ค์ด๋ฏ๋ก compareTo์ ๋ฉ์๋์ ์ธ์ ํ์ ์ ์ปดํ์ผ ํ์ ์ ์ ํด์ง๋ค.
public final class CaseInsensetiveString implements Comparable<CaseInsensitiveString> {
public int compareTo(CaseInsensitiveString cis) {
return String.CASE_INSENSITIVE_ORDER.compare(s. cis.s);
}
}
ํด๋์ค์ ํต์ฌ ํ๋๊ฐ ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ ๊ฐ์ฅ ํต์ฌ์ ์ธ ํ๋๋ถํฐ ๋น๊ตํ์. ๋น๊ต ๊ฒฐ๊ณผ๊ฐ 0์ด ์๋๋ผ๋ฉด ์ฆ, ์์๊ฐ ๊ฒฐ์ ๋์๋ค๋ฉด ์ฆ์ ๋ฐํํ๋ฉด ๋๋ค. ์๋๋ผ๋ฉด ์ดํ ํ๋์์ ๊ณ์ ๋น๊ต๋ฅผ ์งํํด ๋๊ฐ๋ค.
public int compareTo(PhoneNumber pn) {
int result = Short.compare(areaCode, pn.areaCode);
if (result == 0) {
result = Short.compare(prefix, pn.prefix);
if (result == 0) {
result = Short.compare(linenum, pn.lineNum);
}
}
return result;
}
์๋ฐ 8์์ ์ถ๊ฐ๋ ๋น๊ต์ ์์ฑ ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํ ์ ๋ ์๋ค. ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง๋ค.
// ์ฝ๋ 14-3 ๋น๊ต์ ์์ฑ ๋ฉ์๋๋ฅผ ํ์ฉํ ๋น๊ต์ (92์ชฝ)
private static final Comparator<PhoneNumber> COMPARATOR =
comparingInt((PhoneNumber pn) -> pn.areaCode)
.thenComparingInt(pn -> pn.prefix)
.thenComparingInt(pn -> pn.lineNum);
public int compareTo(PhoneNumber pn) {
return COMPARATOR.compare(this, pn);
}
์ด๋ฐ๊ธ '๊ฐ์ ์ฐจ'๋ฅผ ๊ธฐ์ค์ผ๋ก ์์์ 0 ๊ทธ๋ฆฌ๊ณ ์์์ ๊ฐ์ ๋ฐํํ๋ CompareTo ๋ฉ์๋๋ฅผ ๋ง์ฃผํ ์ ์๋ค.
์ด ๋ฐฉ์์ ์ ์ ์ค๋ฒํ๋ก์ฐ๋ ๋ถ๋์์์ ๊ณ์ฐ ๋ฐฉ์์ ์ค๋ฅ๋ฅผ ๋ฐ์์ํฌ ์ ์์ผ๋ฏ๋ก ์ฌ์ฉํ๋ฉด ์๋๋ค.
๋ฐ๋ผ์ ์๋์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์.
static Comparator<Object> hasCodeOrder = new Comparator<>() {
public int compare(Object o1, Object o2) {
return Integer.compare(o1.haseCode(), o2.haseCode());
}
}
'๐์ฝ์ ์ฑ ์ ๋ฆฌ > ์ดํํฐ๋ธ์๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ดํํฐ๋ธ ์๋ฐ] 7์ฅ : ๋๋ค์ ์คํธ๋ฆผ (0) | 2022.03.23 |
---|---|
[์ดํํฐ๋ธ ์๋ฐ] 6์ฅ : ์ด๊ฑฐ ํ์ ๊ณผ ์ ๋ํ ์ด์ (0) | 2022.03.21 |
[์ดํํฐ๋ธ ์๋ฐ] 5์ฅ : ์ ๋ค๋ฆญ (0) | 2022.03.14 |
[์ดํํฐ๋ธ ์๋ฐ] 4์ฅ : ํด๋์ค์ ์ธํฐํ์ด์ค (0) | 2022.03.14 |
[์ดํํฐ๋ธ ์๋ฐ] 2์ฅ : ๊ฐ์ฒด ์์ฑ๊ณผ ํ๊ดด (0) | 2022.03.08 |