๐ฒ equals์ hashCode๋?
equals์ hashCode๋ ๋ชจ๋ Java ๊ฐ์ฒด์ ๋ถ๋ชจ ๊ฐ์ฒด์ธ Object ํด๋์ค์ ์ ์๋์ด ์๋ค.
๋ฐ๋ผ์ Java์ ๋ชจ๋ ๊ฐ์ฒด๋ Object ํด๋์ค์ ์ ์๋ equals์ hashCode ํจ์๋ฅผ ์์๋ฐ๊ณ ์๋ค.
๐ฑ equals() ๋?
public boolean equals(Object obj) {
return (this == obj);
}
๐ซง '==' ์ฐ์ฐ์์ ๋์ผ์ฑ(identity)
์๋ฐ์์ '==' ์ฐ์ฐ์๋ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋น๊ตํ๊ธฐ ๋๋ฌธ์ ๋ ๊ฐ์ฒด๊ฐ ์๋ก ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ํ ๋น๋์ด ์๋ค๋ฉด ๋ ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ ๊ฒ์ผ๋ก ํ๋จํ๋ค. ๋ฐ๋ผ์ '==' ์ฐ์ฐ์๋ ์ฃผ๋ก ๊ธฐ๋ณธ ํ์ ์ ๊ฐ์ด๋ ๊ฐ์ฒด์ ์ฐธ์กฐ ์์ฒด๋ฅผ ๋น๊ตํ ๋ ์ฌ์ฉ๋๋ค.
ํ์ง๋ง ๋๋ฑ์ฑ์ ์ฌ๋ฐ๋ฅด๊ฒ ํ๋จํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด์ ๋ด์ฉ์ด๋ ์ํ๋ฅผ ๋น๊ตํ๊ณ ์ ํ ๋๋ '==' ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๋๋ค.
๋์ผ์ฑ์ ๋น๊ต๋ ๊ฐ์ฒด์ ์ค์ ๋ด์ฉ๋ณด๋ค๋ ๊ฐ์ฒด๊ฐ ์์นํ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ์ด์ ์ ๋ง์ถ๋ค.
๐ซง 'equals()' ๋ฉ์๋์ ๋๋ฑ์ฑ(equality)์ ๊ด๊ณ
equals() ๋ฉ์๋๋ ๊ฐ์ฒด์ ๋ด์ฉ์ด๋ ์ํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ ๊ฐ์ฒด๊ฐ ๊ฐ์์ง๋ฅผ ํ๋จํ๋ค.
์๋ฐ์ 'Object' ํด๋์ค๋ฅผ ์์๋ฐ์ ๊ธฐ๋ณธ ์ํ์ 'equals()' ๋ฉ์๋๋ '==' ์ฐ์ฐ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ์ฒด์ ์ฐธ์กฐ๋ฅผ ๋น๊ตํ๋ค.
๋ฐ๋ผ์ ๊ฐ์ฒด์ ๋๋ฑ์ฑ ๋น๊ต๋ฅผ ์ํด์๋ 'equals()' ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ์ฌ ๊ฐ์ฒด์ ์ํ๋ ๊ฐ์ ๋น๊ตํ๋ ๋ก์ง์ ๊ตฌํํด์ผ ํ๋ค.
๐ฑ hashCode() ๋?
hashCode ๋ฉ์๋๋ ์คํ ์ค์(Runtime) ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ๋ฒ์ง๋ฅผ ์ด์ฉํด ์ ์ผํ integer ๊ฐ์ ๋ฐํํ๋ฉฐ, ์ด ๊ฐ์ ํด์ ๊ธฐ๋ฐ์ ์ปฌ๋ ์ ์์ ๊ฐ์ฒด๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
@Override
public int hashCode() {
return Objects.hash(name, age);
}
๐ซง 'hashCode()' ๋ฉ์๋์ ๋๋ฑ์ฑ(equality)
'equals()' ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ ๋๋ 'hashCode()' ๋ฉ์๋๋ ํจ๊ป ์ค๋ฒ๋ผ์ด๋ฉ ํ๋ ๊ฒ์ด ์ข๋ค. ์๋ํ๋ฉด ์๋ฐ์ ์ปฌ๋ ์ ํ๋ ์์ํฌ(HashTable, HashSet, HashMap)์์ ๊ฐ์ฒด๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ด๋ฆฌํ๊ธฐ ์ํด์๋, 'equals()' ๋ฉ์๋๊ฐ true๋ฅผ ๋ฐํํ๋ ๋ ๊ฐ์ฒด๋ ๊ฐ์ 'hashCode()' ๊ฐ์ ๊ฐ์ ธ์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์ ๋๋ฑํ ๊ฐ์ฒด๋ ๋ฐ๋์ ๊ฐ์ ํด์์ฝ๋๋ฅผ ๋ฐํํด์ผ ํ๋ค.
๐ค equals()์ hashcode() ์ค ํ๋๋ง ์ฌ์ ์ ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
equals()๋ง ์ฌ์ ์ํ๋ฉด ๊ฐ์ ๊ฐ ๊ฐ์ฒด๋ผ๋ hashcode๊ฐ์ด ๋ค๋ฅผ ์ ์๋ค. ๋ฐ๋ผ์ HashTable ๊ฐ์ ํด์๊ฐ์ Key ๊ฐ์ผ๋ก ์ฌ์ฉํ๋ ์๋ฃ๊ตฌ์กฐ์์ ํด๋น ๊ฐ์ฒด๊ฐ ์ ์ฅ๋ ๋ฒํท์ ์ฐพ์ ์ ์๋ค.
๋ฐ๋๋ก hashcode()๋ง ์ฌ์ ์ํ๋ฉด hashcode() ๋ฉ์๋๊ฐ ๋ง๋ ํด์๊ฐ์ ์ด์ฉํด ๊ฐ์ฒด๊ฐ ์ ์ฅ๋ ๋ฒํท์ ์ฐพ์ ์๋ ์์ง๋ง ํด๋น ๊ฐ์ฒด๊ฐ ์์ ๊ณผ ๊ฐ์ ๊ฐ์ฒด์ธ์ง ๊ฐ์ ๋น๊ตํ ์ ์๊ธฐ ๋๋ฌธ์ null์ ๋ฆฌํดํ๊ฒ ๋๋ค. ๋ฐ๋ผ์ ์ํ๋ ๊ฐ์ฒด๋ฅผ ์ฐพ์ ์ ์๋ค.
์ด๋ฌํ ์ด์ ๋ก ๊ฐ์ฒด์ ์ ํํ ๋๋ฑ, ๋์ผ ๋น๊ต๋ฅผ ์ํด์(ํนํ Hash ๊ด๋ จ ์ปฌ๋ ์
ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉ ์) Object์ equals() ๋ฉ์๋, hashCode() ๋ฉ์๋ ๋ ๋ค ์ฌ์ ์ํ์ฌ ๋
ผ๋ฆฌ์ ๋๋ฑ ๊ฐ์ฒด์ผ ๊ฒฝ์ฐ ๋์ผํ ํด์์ฝ๋๊ฐ ๋ฆฌํด๋๋๋ก ํด์ผ ํ๋ค.
๐ฒ equals() Override์ ํ์์ฑ
public class Student {
private Long id;
private String name;
private int age;
public Student(Long id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
}
์์ ๊ฐ์ด Student ํด๋์ค๊ฐ ์์ ๋ name๊ณผ age ํ๋๊ฐ์ด ๋๊ฐ์ ๋ Student ๊ฐ์ฒด๋ฅผ Object์ ์ฌ์ ์ํ์ง ์์ equals()๋ก ๋น๊ตํ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ๋ ๊น?
@Test
public void equalsTest() {
Student s1 = new Student(1L, "๊น๊ฐ๋", 20);
Student s2 = new Student(1L, "๊น๊ฐ๋", 20);
System.out.println("s1.equals(s2) = " + s1.equals(s2));
}
s1.equals(s2) = false
๊ฒฐ๊ณผ๋ false๊ฐ ๋์จ๋ค.
ํด๋น ๊ฐ์ฒด๋ ์๋ก ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ์ ์์นํ๊ธฐ ๋๋ฌธ์ ๋์ผํ(Identity) ๊ฐ์ฒด๊ฐ ์๋๋ค. ํ์ง๋ง ํ๋ก๊ทธ๋๋ฐ ์์ผ๋ก๋ ๊ฐ์ ๊ฐ์ ์ง๋๋ฏ๋ก ๊ฐ์ ๊ฐ์ฒด๋ก ์ธ์๋์ด์ผ ํ๋๋ฐ, ์ด๋ฌํ ๋๋ฑ์ฑ(Equality)์ ์ํด ๊ฐ์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋น๊ตํ๋๋ก equals ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํด์ฃผ๋ ๊ฒ์ด๋ค.
@Override
public boolean equals(Object obj) {
if (this == obj) return true; // ์ฐธ์กฐ๊ฐ์ด ๊ฐ์ ๊ฒฝ์ฐ true ๋ฆฌํด
if (obj == null || getClass() != obj.getClass()) return false; // ๋น๊ตํ๋ ๊ฐ์ฒด๊ฐ null์ด๊ฑฐ๋ ํด๋์ค ๋ถ์ผ์น ์ false ๋ฆฌํด
Student student = (Student) obj;
return (this.getId() == student.getId()); // ๊ฐ์ฒด ๊ณ ์ id ๊ฐ์ ๋น๊ตํ์ฌ ๋ฆฌํด
}
์ด์ equals์ ์ํ ๋ฌธ์ ๋ ํด๊ฒฐ๋๋ค.
ํ์ง๋ง Student๋ฅผ HashSet๊ณผ ๊ฐ์ ์๋ฃ๊ตฌ์กฐ์ ์ ์ฅํ๋ ค๊ณ ํ๋ฉด ๋ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ์๊ธฐ๊ฒ ๋๋ค.
๐ฒ hashCode() Override์ ํ์์ฑ
์์ ์ค๋ช ํ ๋๋ก HashTable์ด๋ HashSet, HashMap๊ณผ ๊ฐ์ ์๋ฃ๊ตฌ์กฐ๋ ์๋ฃ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ์์น๋ฅผ ์ ํํ๊ธฐ ์ํด hashCode๋ฅผ ์ด์ฉํ๋ค. ๊ทธ๋ ๋ค๋ฉด Student์ HashCode๋ฅผ ์กฐํํด ๋ณด๋ฉด ์ด๋ค ๊ฒฐ๊ณผ๊ฐ ๋์ฌ๊น?
s1.equals(s2) = true
s1.hashCode() = 3093793
s2.hashCode() = 4023425
Object ํด๋์ค์ hashCode() ๋ฉ์๋๋ ํด๋น ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ์ ๋ฐํํ๊ธฐ ๋๋ฌธ์ s1๊ณผ s2๋ ๋ค๋ฅธ ํด์๊ฐ์ ๋ฐํํ๋ ๊ฒ์ด๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด hashCode ๋ฉ์๋๋ Student ํด๋์ค์ ์ค๋ฒ๋ผ์ด๋ํ์ฌ ์์ ํด์ฃผ์ด์ผ ํ๋ค.
@Override
public int hashCode() {
final int PRIME = 31;
int result = 1;
result = PRIME * result + getId();
return result;
}
์ด์ฒ๋ผ Student ํด๋์ค์ hashCode๋ฅผ ์์ ๊ฐ์ด ์ค๋ฒ๋ผ์ด๋ฉ ํ ๊ฒฝ์ฐ, ๊ฐ์ฒด ๊ณ ์ id๊ฐ์ด ๊ฐ์ผ๋ฉด hashCode ๊ฐ๋ ๊ฐ์์ง๊ฒ ๋๋ค.
[Java] equals์ hashCode ํจ์
์๋ฐ์ ๋๋ฑ์ฑ๊ณผ ๋์ผ์ฑ ์ดํดํ๊ธฐ
[java] hashcode()์ equals() ๋ฉ์๋๋ ์ธ์ ์ฌ์ฉํ๊ณ ์ ์ฌ์ฉํ ๊น?
'Study' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์คํ์์ค] Spring Boot ํ๋ก์ ํธ ์ปจํธ๋ฆฌ๋ทฐํฐ ๋๊ธฐ (0) | 2024.04.29 |
---|---|
[Java] Method Area๋ Heap ์์ญ์ด ์๋๋ค! (1) | 2024.02.19 |
[Java] ์๋ฐ ๋ฐํ์ ๋ฐ์ดํฐ ์์ญ(Runtime Data Area) (0) | 2024.02.19 |
[Java] ๋ณ์์ ๊ฐ์ฒด ๋ฐ์ดํฐ ์ ์ฅ (0) | 2024.02.17 |
[DB] ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค(Isolation Level)์ด๋? (0) | 2024.02.16 |