[JAVA] HashCode์ equals ์ค๋ฒ๋ผ์ด๋ฉ
ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ์์น Id๋ก ์ค๋ณต์ ์ ๊ฑฐํ๋ ๋ก์ง์ด ์์ด์ hashCode๋ equals๋ฅผ ์ฌ์ ์ํ๋ค.!
๊ทผ๋ฐ ๋ด๊ฐ ์ด ๋ ๊ฐ๋ฅผ ์์ธํ ๊ณต๋ถํด ๋ณธ ์ ์ด ์์๋ ์ถ์ด์ ์ด์ฐธ์ ์ ๋ฆฌํด์ ์ดํดํด๋ณด๋ ค๊ณ ํ๋ค!
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
GetAllPlaceResDto that = (GetAllPlaceResDto) o;
return Objects.equals(placeId, that.placeId);
}
@Override
public int hashCode() {
return Objects.hash(placeId);
}
ํ๋ก์ ํธ์์ ์ฌ์ฉํ ์ฝ๋ !
๐ฑ equals ๋ฉ์๋๋?
์ด๋ค ๋ ์ฐธ์กฐ ๋ณ์ ๊ฐ์ด ๊ฐ์์ง ๋ค๋ฅธ์ง ๋๋ฑ ์ฌ๋ถ๋ฅผ ๋น๊ตํ ๋ ์ฌ์ฉํ๋ ๊ฒ์ด equals() ๋ฉ์๋์ด๋ค.
์๋ฐ์์ ๋ณ์๋ฅผ ๋น๊ตํ๋ ๋ฐฉ์์ด ๋ ๊ฐ์ง๊ฐ ์๋๋ฐ equals(๋๋ฑ์ฑ)์ ==(๋์ผ์ฑ)์ด๋ค.
๋๋ฑ์ฑ : ๊ฐ์ฒด๊ฐ ์ฃผ์๊ฐ์ด ๋ค๋ฅด๋๋ผ๋ ๋ด์ฉ์ด ๊ฐ๋ค๋ฉด ๊ฐ๋ค๊ณ ๋ณด๋ ๊ฒ
๋์ผ์ฑ : ๊ฐ์ฒด๊ฐ ์ฃผ์๊ฐ์ด ๋ค๋ฅด๋ฉด ์๋ฌด๋ฆฌ ๋ค๋ฅธ ๋ด์ฉ์ด๋ผ๋ ๊ฐ์ง ์๋ค๊ณ ๋ณด๋ ๊ฒ
String s1 = "a";
String s2 = "a";
System.out.println(s1 == s2); // false
System.out.println(s1.equals(s2)); // true
์ด์ฒ๋ผ ๋ณ์๋ฅผ ๋น๊ตํ ๋๋ ๋ ๋ฐฉ์์ด ๋ค๋ฅธ ๊ฐ์ด ์ถ๋ ฅ๋๋ค.
ํ์ง๋ง, ๊ฐ์ฒด๋ฅผ ๋น๊ตํ๋ ๊ฒฝ์ฐ์๋ equals()์ ==์ด ๊ฐ์ ์๋ฏธ๋ก ์ฌ์ฉ๋๋ค.
๐ค ์ ๊ทธ๋ด๊น?
์๋ฐ ์ต์์ ํด๋์ค์ธ Object ํด๋์ค์ ์๋ equals()๋ ๋น๊ต์ฐ์ฐ์์ธ ==์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํ๋ค.
์ฆ, ์๋์ equals๋ ์ฐธ์กฐ๊ฐ์ด ๊ฐ์์ง ํ์ธํ๋ ๊ธฐ๋ฅ์ด๋ค.
public boolean equals(Object obj) {
return (this == obj);
}
์ฆ, String ํด๋์ค์์๋ equals ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํด์ ์ฌ์ฉํ๊ณ ์๋ค๋ ๋ง์ด๋ค.
// String ํด๋์ค์ equals ๋ฉ์๋
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
return (anObject instanceof String aString)
&& (!COMPACT_STRINGS || this.coder == aString.coder)
&& StringLatin1.equals(value, aString.value);
}
๊ทธ๋ผ ์ด์ equals()๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํด๋ณด์
Member ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ํ ์คํธํด๋ณด์๋ค!
public class Member {
private String name;
public Member(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true; // ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ์ฌ ์ฐธ์กฐ๊ฐ์ด ๊ฐ์๊ฒฝ์ฐ true๋ฅผ ๋ฐ๋ก ๋ฆฌํดํด์ค๋ค.
if (o == null || getClass() != o.getClass()) return false; //๋น๊ตํ๋ ๊ฐ์ฒด๊ฐ null์ธ์ง ํด๋์ค๊ฐ ๊ฐ์์ง ์ฒดํฌํ๋ค.
Member member = (Member) o;
return Objects.equals(name, member.name); //๊ฐ์ฒด ๋ด๋ถ์ ๊ฐ๋ค์ ๋น๊ตํ์ฌ ๋ฆฌํดํ๋ค.
}
}
Member member1 = new Member("name");
Member member2 = new Member("name");
System.out.println("member 1 == member2 : " + member1.equals(member2));
System.out.println("member1 hashcode : " + member1.hashCode());
System.out.println("member2 hashcode : " + member2.hashCode());
๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด member1๊ณผ member2์ ๊ฐ์ฒด๊ฐ ๊ฐ๋ค๋ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐํํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค!
ํ์ง๋ง hashcode๋ ๋์ผํ์ง ์์ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ฐ๋ผ์ equals๋ฅผ ์ฌ์ ์ ํ๋ค๋ฉด hashcode ๋ํ ์ฌ์ ์ ํด์ค์ผ ํ๋ค!
๐ฑ HashCode๋?
๊ฐ์ฒด๋ฅผ ์๋ณํ๋ ํ๋์ ๊ณ ์ ์ ์๊ฐ์ ์๋ฏธํ๋ค.
์ฆ, ๊ฐ์ฒด์ ์ฃผ์ ๊ฐ์ ์ด์ฉํด์ ํด์ฑ ๊ธฐ๋ฒ์ ํตํด ํด์ ์ฝ๋๋ฅผ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด๋ ๊ฐ์ ํด์ ์ฝ๋๋ฅผ ๊ฐ์ง ์ ์๋ค.
์๋ฐ์์ ์ปฌ๋ ์ ํ๋ ์์ํฌ (HashSet, HashMap, HashTable)์์๋ hashCode๋ฅผ ์ด์ฉํด์ ๋๋ฑ์ฑ ๋น๊ต๋ฅผ ํ๋๋ฐ ์ด๋ hashCode๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํด์ฃผ์ง ์๋๋ค๋ฉด ๋ค๋ฅธ ๊ฐ์ผ๋ก ์ธ์ํด์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค!
@Override
public int hashCode() {
return Objects.hash(name);
}
๋ฐ๋ผ์ ๋ค์ Member ๊ฐ์ฒด์ ํด์์ฝ๋๋ฅผ ์ฌ์ ์ํ๊ณ ๋์ ์คํํด ๋ณด๋, ๊ฐ์ ํด์ ๊ฐ์ ์ป์ ์ ์๊ฒ ๋์๋ค.
์ถ๊ฐ์ ์ผ๋ก ๋ด ํ๋ก์ ํธ์์๋ HashSet์ ์ด์ฉํด์ ์์น ์ ๋ณด๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ hashCode๋ฅผ ์ฌ์ ์ ํ ๊ฒ์ด๋ค!
Set<GetAllPlaceResDto> getAllPlaceResDtoList = new HashSet<>();
์ฌ๊ธฐ์์๋ DTO์์ equals๋ hashcode๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ๋ค!!