์๋ฐ์ ๋ชจ๋ ํด๋์ค๋ Object ํด๋์ค๋ฅผ ์์๋ฐ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ Objectํด๋์ค์๋ equals() ์ hashCode() ๋ผ๋ ๋ฉ์๋๊ฐ ์ ์ธ๋์ด ์์ต๋๋ค.
์ด ๋ฉ์๋๋ค์ ๊ฐ๊ฐ ์ด๋ค ์ญํ ์ผ๊น์? ์ด ๋์ ์ฐจ์ด์ ์ ๋ฌด์์ผ๊น์?
equals()์ hashCode() ๋ฉ์๋๋ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ์ค์ํ ๋ฉ์๋๋ก, ๊ฐ์ฒด ๊ฐ์ ๋์ผ์ฑ๊ณผ ๋๋ฑ์ฑ์ ๋ค๋ฃจ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๋ค์ด๊ฐ๊ธฐ ์ ์
๋์ผ์ฑ์ Identity = ๋ฉ๋ชจ๋ฆฌ ๋ด ์ฃผ์๊ฐ์ด ๊ฐ์์ง ๋น๊ตํฉ๋๋ค.
๋๋ฑ์ฑ์ Equality = ๋ ผ๋ฆฌ์ ์ง์๊ฐ ๋๋ฑํ์ง ๋น๊ตํฉ๋๋ค.
์๋ฅผ๋ค์ด, ์ ํ ๏ฃฟ ์์ดํฐ์ด 2๋์๋ค. ๋ ํด๋ํฐ์ ๊ธฐ์ข ๋ ๊ฐ๊ณ ๋์ผํ ์์ ๋์ผํ ์คํ์ ๊ฐ์ง๊ณ ์๋ค. ์ด ๋ ๊ฐ์ ํด๋ํฐ์ ๋์ผํ๊ฐ?
๋ต์ ์๋๋ค. ํด๋ํฐ์ ๊ฐ ๊ธฐ๊ธฐ๋ง๋ค ๊ณ ์ ์ฃผ์๊ฐ ์๊ณ ์์ดํฐ์ MAC ์ฃผ์๊ฐ ์กด์ฌํ๋ค. ์ฆ, ๋์ผํ ์คํ์ด์ง๋ง ์์ฐํ ๋ ๊ธฐ๊ธฐ๋ ๊ฐ์ ์ ๋ํฌํ ํน์ฑ์ ๊ฐ๊ณ ์๋ค๊ณ ํ ์ ์๋ค. (= ๋์ผํ์ง ์๋ค๋ ๊ฒ)
์ด๋ฒ์๋ ๊ทธ๋ผ ๋๋ฑํ๊ฐ? ๋ต์ ๊ทธ๋ ๋ค. ์ฌํ์ ์ผ๋ก ๋์ผํ ์คํ๊ณผ ์ฌ์ง์ด๋ ์ปฌ๋ฌ๊ฐ ๋ฌ๋ผ๋ ์คํ์ด ๋์ผํ ๊ฐ์ ์๋ฆฌ์ฆ์ ๊ธฐ๊ธฐ๋ผ๋ฉด ๊ฐ์ ํด๋ํฐ์ด๋ผ๊ณ ๋งํ๋ค. "์ด๊ฑด ์์ดํฐ15 ๋ธ๋ฃจ์ผ", "์ด๊ฑด ์์ดํฐ15 ๊ทธ๋ฆฐ์ด์ผ" ์ด๋ ๊ฒ ๋งํ์ง ์์์์..? ๊ทธ๋ฅ "์ ์์ดํฐ 15~", "์ ์์ดํฐ 15ํ๋ก~" ์ด์ ๋๋ก๋ง ๊ตฌ๋ถํ๋ค. ๋ฐ๋ก ๊ทธ ์ด์ ๋ ์ฌํ์ ์ผ๋ก ๋ ๊ธฐ๊ณ๋ ๋ ผ๋ฆฌ์ ์ง์๊ฐ ๋๋ฑํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ผญ ์๊ณ ๊ฐ๊ธฐ
์ผ๋จ ๋๋ฑ์ฑ์ ๋จผ์ ์ฃผ๋ชฉํด๋ณด๋ฉด, ๋๋ฑ์ฑ์ ํ๋จํ๊ธฐ ์ํด ์คํ์ด ๊ฐ๋ค๋ ๋ ผ๋ฆฌ์ ๊ธฐ์ค์ด ์๋ค. ๋ ผ๋ฆฌ์ ๊ธฐ์ค์ ์ ๋์ ๊ธฐ์ค๊ณผ๋ ์กฐ๊ธ ๋ค๋ฅด๋ค. ๋ค์๋งํ๋ฉด ๋ ผ๋ฆฌ์ ๊ธฐ์ค์ ๊ฐ๋ฐ์๊ฐ ์ธ์ ๋ ์ ํ ์ ์๋ค๋ ๊ฒ์ด๋ค๐ฑ
๋ ผ๋ฆฌ์ ๊ธฐ์ค์ ๊ฐ๋ฐ์๊ฐ ๋ง๋ค ํ์๊ฐ ์๋?
๊ฐ๋ฐ์ ํ๋ฉด์ ๋ฉ๋ชจ๋ฆฌ ๋ด ์ฃผ์๊ฐ์ด ๋ค๋ฅธ, ๋ณ๊ฐ์ ๊ฐ์ฒด๋ผ ํ ์ง๋ผ๋, ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด ๋ ผ๋ฆฌ์ ์ผ๋ก ๊ฐ์ ๊ฐ์ฒด๋ก ๋ค๋ค์ผํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ฑฐ๋ ์..๊ทธ๋ฆฌ๊ณ ๊ทธ ํน์ ์กฐ๊ฑด์, ๋งค๋ฒ ๋ฌ๋ผ์ง ์ ์์ด์ผ ํ๋ต๋๋ค โ โฟโ ...
๋ฐ๋ก ์ด๋ฐ ์ด์ ๋ค ๋๋ฌธ์ ๊ฐ๋ฐ์๋ ๊ฐ์ฒด๋ฅผ ๋ค๋ฃฐ ๋ "์, ์ง๊ธ๋ถํฐ ์ด ๋๊ฐ๊ฐ ๊ฐ์๊ฑฐ์ผ!"๋ผ๋ ๋ ผ๋ฆฌ์ ๊ธฐ์ค์ ์ ํ๊ณ , ๊ทธ ๊ธฐ์ค์ ์ ์ฉํด์ผ ํ๋ค. ์ฌ๊ธฐ์ ํ์ํ ๊ฐ๋ ์ด equals()์ค๋ฒ๋ผ์ด๋ฉ์ด๋ค.
๊ทธ๋ฐ๋ฐ equals()๋ง ์ค๋ฒ๋ผ์ด๋ฉํด์ ๋๋ง์ ๊ธฐ์ค์ ์ ํด์ฃผ๋ฉด ๋ ๊น?
์๊น ์์ ๋์ผ์ฑ์ ํ๋จํ๋ ค๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ด์ ์ฃผ์ ๊ฐ์ด ๊ฐ์์ง ๋น๊ตํ๋ค๊ณ ํ๋ค.. ๋ ผ๋ฆฌ์ ๊ธฐ์ค์ ์ด์ฐํ๋คํด๋ ๋ฉ๋ชจ๋ฆฌ๋ ์ด์ฉ๋..(?)์ฌ๊ธฐ์ ๋ฐ๋ก ๊ทธ๊ฑธ ํด๊ฒฐํ ์ ์๋ ๊ฒ์ด hashCode() ์ค๋ฒ๋ผ์ด๋ฉ์ด๋ค. ์์ hash๊น์ง ๋์ผํ ๊ฒ์ผ๋ก ์ทจ๊ธ๋ ์ ์๊ฒ ํด์ฃผ๋ฉด ์.์ .๋ฒ.์ฃ.๐
๋ฐ๋ผ์ ๋ ๊ฐ์ ๋ฉ์๋๋ ํญ์ ๋ถ์ด๋ค๋๋ฉด์ ์์ ๋ฒ์ฃ๋ฅผ ํ๊ฒ ๋๋คใ ใ
[+ 11.01 ์ถ๊ฐ] ๋์ผ์ฑ์ ๊ฐ๊ฒ ํด์ฃผ๊ธฐ ์ํด hashCode() ์ค๋ฒ๋ผ์ด๋ฉ ํ๋๊ฑด๊ฐ์?
๋์ผํ๋ค๋ ์๋ฏธ๋ฅผ ์ฃผ๊ธฐ์ํด hashCode()๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ๋ค๊ณ ์ดํดํ๋ ๊ฒ์ ์ ์ ํ ๋ฐฉํฅ์ด ์๋๋๋ค๐ฑ๊ทธ ๋์,, ์ ํฉํ ๋น๊ต๋์์ด ์๋์์...! ์ด๋ค ๋ฌธ์ ๊ฐ ์๊ธฐ๋์ง ์ค๋ช ํด๋ณด๊ฒ ์ต๋๋ค.
hash ๊ฐ์ ์ฌ์ฉํ๋ Collection(HashMap, HashSet, HashTable)์์ ๋ฌธ์ ๊ฐ ์๊ธฐ๋๋ฐ์. ๊ฐ์ฒด๊ฐ ๋
ผ๋ฆฌ์ ์ผ๋ก ๊ฐ์์ง equals ๋น๊ตํ ๋ ์ ์ฐจ๋ฅผ ์ดํด๋ณด๋ฉด
1. HashCode()๋ฆฌํด๊ฐ์ ํ์ธ
1-1. ๊ฐ์๊ฒฝ์ฐ, equals() ๋ฆฌํด๊ฐ์ ํ์ธ
1-2. ๋ค๋ฅผ๊ฒฝ์ฐ, ๋ค๋ฅธ๊ฐ์ฒด๋ก ์ฒ๋ฆฌ
2. equals()์ ๋ฆฌํด๊ฐ์ ํ์ธ
2-1. ๊ฐ์๊ฒฝ์ฐ, ๋๋ฑํ ๊ฐ์ฒด๋ก ์ฒ๋ฆฌ
2-2. ๋ค๋ฅผ๊ฒฝ์ฐ, ๋ค๋ฅธ๊ฐ์ฒด๋ก ์ฒ๋ฆฌ
์ด๋ ๊ฒ ์ฒ๋ฆฌ๋ฉ๋๋ค! ๋ฐ๋ผ์ hashCode๋ง ๋์ผํ ๊ฒ์ ๋ค๋ฅธ ๊ฐ์ฒด๋ก ํ๋จ๋์ง ์์ต๋๋คโบ๏ธ(์์ ๋ฒ์ฃ์ ์คํจํ๊ฑฐ์ฃ ใ
ใ
)
๊ฐ์ฒด์ ์ค๋ณต์ ํ์ฉํ์ง ์๋ HashSet์ ๋์ผํ ์ด๋ฆ์ ๊ฐ์ฒด๋ฅผ addํ๊ณ hashCode()๋ง ์ค๋ฒ๋ผ์ด๋ฉ์ ํ ํ set์ ๊ฒฐ๊ณผ๋ฅผ ์ดํด๋ณด๋ฉด ๋ ๊ฐ๊ฐ add ๋ฉ๋๋ค! ์ฝ๋๋ฅผ ๋ณผ๊น์?
public class User{
private final String name;
public User(String name){
this.name = name;
}
@Override
public int hashCode(){
//์ด๋ฆ์ผ๋ก ํด์ฑํฉ๋๋ค.
return Objects.hashCode(name)
}
public static void main(String[] args){
Set<User> set = new HashSet<>();
User user1 = new User("judy");
User user2 = new User("pobi");
//๋๋ช
์ ์ฌ๋์ user set์ ์ถ๊ฐ
set.add(user1);
set.add(user2);
// ์ค๋ณต์์ด ๋ฐ์ดํฐ๋ค์ ๋ด์ ๊ฒฐ๊ณผ๋?
System.out.println(set.size());
}
}
2
๋ ๊ฐ์ ํด์๊ฐ์ด ์๋ก ๋ฌ๋ผ์ ๋ค์ด๊ฐ๊ฒ ์๋๊น?
(์ฃผ๋ ํน,, override๊ฐ ์ ๋๋ก ์๋ ๊ฒ์ ์์ฌํจ. ์ ๋ ๋ณธ์ธ์ด ์๋ชป์ด๋ผ๊ณ ์๊ฐ๋ชปํจ โ โฟโ ) ์ฝ๋๋ก ํ์ธํด๋ณผ๊น์?
public class User{
private final String name;
public User(String name){
this.name = name;
}
@Override
public int hashCode(){
//์ด๋ฆ์ผ๋ก ํด์ฑํฉ๋๋ค.
return Objects.hashCode(name)
}
public static void main(String[] args){
Set<User> set = new HashSet<>();
User user1 = new User("judy");
User user2 = new User("pobi");
//๋๋ช
์ ์ฌ๋์ user set์ ์ถ๊ฐ
set.add(user1);
set.add(user2);
System.out.println(user1.hashCode());
System.out.println(user2.hashCode());
}
}
99162322
99162322
๊ฒฐ๊ณผ์ ์ผ๋ก hashCode()๋ ๊ฐ์ผ๋ ๋ ๊ฐ์ฒด๋ ๋๋ฑ์ฑ์ ์ธ์ ํ์ง ์์๊ธฐ ๋๋ฌธ์ ๋๋ฑํ ๊ฒ์ผ๋ก ์ทจ๊ธํ์ง ์์ ๊ฒ์ ๋๋ค.
๋ฌด์กฐ๊ฑด ์ฌ์ ์๋ฅผ ํด์ผํ๋ ‘๋๋Collection์ ์์ธ๊ฑฐ๋ผ๋ฉด???’
๋ฌด์กฐ๊ฑด ์ฌ์ ์ํด์ผํ๋ค๊ณ ๋งํ ์ ์์ง๋ง ํต์์ ์ผ๋ก ๊ฐ์ด ์ฌ์ ์ํ๊ธฐ ๋๋ฌธ์ ์ต๊ด์ ๊ฐ์ ธ๊ฐ๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ฐ์ฒด์ ๋ํ ์ผ๊ด์ฑ์ ์ ์งํ๋ ์ธก๋ฉด์์๋ ์ฌ์ ์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
equals() ๋ฉ์๋
๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ equals() ๋ฉ์๋๋ ๋๋ฑ์ฑ(equivalence) ๋น๊ต์ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ๋ฉ์๋๋ ๋ ๊ฐ์ฒด๊ฐ ๋๋ฑํ์ง(=๋ด์ฉ์ด ๊ฐ์์ง)๋ฅผ ๋น๊ตํฉ๋๋ค. ์๋ฐ์ equals() ๋ฉ์๋๋ Object ํด๋์ค์ ์ ์๋์ด ์๊ณ , ๋ชจ๋ ์๋ฐ ํด๋์ค๋ Object ํด๋์ค๋ฅผ ์์๋ฐ์ผ๋ฏ๋ก ์ด ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋(์ฌ์ ์)ํ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ ๊ตฌํ์ ๊ฐ์ฒด์ ๋ ํผ๋ฐ์ค(๋ฉ๋ชจ๋ฆฌ ์์น)๊ฐ ๊ฐ์์ง๋ฅผ ๋น๊ตํฉ๋๋ค. ์ฆ, ๊ฐ์ฒด์ ์ค์ ๋ด์ฉ์ ๋น๊ตํ๋ ๊ฒ์ด ์๋๋ผ, ๊ฐ์ฒด๊ฐ ๋์ผํ ์ธ์คํด์ค์ธ์ง๋ฅผ ํ์ธํฉ๋๋ค. ํ์ํ๋ค๋ฉด, ํด๋์ค๋ง๋ค ์ด ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ์ฌ ๋ ๊ฐ์ฒด๊ฐ ๋๋ฑํ์ง๋ฅผ ๋น๊ตํ๋๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
hashCode() ๋ฉ์๋
HashCode() ๋ฉ์๋๋ ํด์ ์ฝ๋ ์์ฑ์ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ๋ฉ์๋๋ ๊ฐ์ฒด๋ฅผ ํด์๋งต๊ณผ ๊ฐ์ ํด์ ๊ธฐ๋ฐ ์๋ฃ ๊ตฌ์กฐ์์ ์ฌ์ฉํ๊ธฐ ์ํ ํด์ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค. hashCode() ๋ฉ์๋์ ๊ธฐ๋ณธ ๊ตฌํ์ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ์์น์ ๊ธฐ๋ฐํ ํด์ ์ฝ๋๋ฅผ ๋ฐํํฉ๋๋ค. ์ด๋ ๊ฐ์ฒด๊ฐ ๋ค๋ฅด๋ฉด ๋ค๋ฅธ ํด์ ์ฝ๋๋ฅผ ๋ฐํํ๋ฏ๋ก, ๊ฐ์ฒด๋ฅผ ํด์๋งต์ ์ ์ฅํ ๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ก ์ทจ๊ธ๋ฉ๋๋ค.
๊ฐ์ฒด์ hashCode() ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ์ฌ ๊ฐ์ฒด ๋ด์ฉ์ ๊ธฐ๋ฐํ ๊ณ ์ ํ ํด์ ์ฝ๋๋ฅผ ๋ฐํํ๋๋ก ์ฌ์ ์ํ ์ ์์ต๋๋ค.
equals() ์ hashCode()์ ์ฐจ์ด
equals() ๋ฉ์๋๋ ๋ ๊ฐ์ฒด์ ๋ด์ฉ์ด ๋์ผํ์ง๋ฅผ ํ์ธํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, ๋๋ฑ์ฑ(equivalence)์ ํ๋จํฉ๋๋ค.
hashCode() ๋ฉ์๋๋ ๊ฐ์ฒด๋ฅผ ํด์๋งต๊ณผ ๊ฐ์ ํด์ ๊ธฐ๋ฐ ์๋ฃ ๊ตฌ์กฐ์์ ์๋ณํ๊ธฐ ์ํ ํด์ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค. ๊ฐ์ฒด๊ฐ ์๋ก ๋ค๋ฅด๋ฉด ๋ค๋ฅธ ํด์ ์ฝ๋๋ฅผ ๋ฐํํ๋ฉฐ, ๊ฐ์ ๊ฐ์ฒด์ ๋ํด์๋ ํญ์ ๊ฐ์ ํด์ ์ฝ๋๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค.
๊ฐ์ฒด๋ฅผ ํด์ ๊ธฐ๋ฐ ์๋ฃ ๊ตฌ์กฐ์ ์ ์ฅํ๋ ค๋ฉด equals()์ hashCode() ๋ฉ์๋๋ฅผ ์ผ๊ด๋๊ฒ ๊ตฌํํด์ผ ํฉ๋๋ค.
equals() ๋ฉ์๋๋ ๋๋ฑ์ฑ์ ํ๋จํ๊ณ , hashCode() ๋ฉ์๋๋ก ๊ฐ์ฒด๋ฅผ ์๋ณํ๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค.