μλ°μ equals() λ©μλλ λ κ°μ²΄κ° λ
Όλ¦¬μ μΌλ‘ κ°μμ§ λΉκ΅ν λ μ¬μ©νλ λ©μλμ΄λ€. μ΄λ βκ°λ€βμ κΈ°μ€μ λ¨μν κ°μ λ©λͺ¨λ¦¬ μ£Όμλ₯Ό κ°λ¦¬ν€λμ§λ₯Ό μλ―Ένλ κ²μ΄ μλ κ°μ²΄μ λ΄λΆ κ°μ΄ λμΌνμ§(λ
Όλ¦¬μ λλ±μ±)λ₯Ό μλ―Ένλ€.
String a = new String("BlueCool");
String b = new String("BlueCool");
System.out.println(a == b); // false (μ°Έμ‘°κ°μ΄ λ€λ¦)
System.out.println(a.equals(b)); // true (λ¬Έμμ΄μ΄ κ°μ)
μ μμμμ == μ°μ°μλ λ κ°μ²΄κ° κ°μ λ©λͺ¨λ¦¬ μ£Όμ(μ°Έμ‘°)λ₯Ό κ°μ§λμ§λ₯Ό λΉκ΅νλ€. λ°λΌμ new ν€μλλ‘ κ°κ° μμ±ν String κ°μ²΄λ μλ‘ λ€λ₯Έ λ©λͺ¨λ¦¬ 곡κ°μ μ‘΄μ¬νλ―λ‘ λ΄μ©μ΄ κ°λλΌλ falseλ₯Ό λ°ννλ€.
κ·Έλ¬λ String ν΄λμ€λ μ΄λ―Έ equals() λ©μλλ₯Ό μ€λ²λΌμ΄λ©νμ¬ λ¬Έμμ΄μ λ΄μ©μ΄ κ°μΌλ©΄ trueλ₯Ό λ°ννλλ‘ μ¬μ μλμ΄ μλ€.
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);
}
μ¦ String ν΄λμ€μμλ μ°Έμ‘° λμΌμ±(==) λμ λ
Όλ¦¬μ λμΌμ±μ κΈ°μ€μΌλ‘ λλ±μ±μ νλ¨νλ€. equals() λ©μλλ λͺ¨λ ν΄λμ€μ μ΅μμ λΆλͺ¨μΈ Object ν΄λμ€μ μ μλμ΄ μμΌλ©° κΈ°λ³Έ ꡬνμ λ¨μν μ°Έμ‘°κ°μ΄ κ°μμ§λ₯Ό λΉκ΅νλ€.
Object blue = new Object();
Object cool = new Object();
System.out.println(blue.equals(cool)); // false
System.out.println(blue == cool); // false
// μ€μ Object ν΄λμ€μ equals() κΈ°λ³Έ ꡬν
public boolean equals(Object obj) {
return (this == obj);
}
λ°λΌμ μ¬μ©μκ° μ§μ μ μν ν΄λμ€μμ κ°μ²΄μ λ
Όλ¦¬μ λλ±μ±μ νλ¨νλ €λ©΄ λ€μμ κ·μΉμ μ§ν€λ©° equals() λ©μλλ₯Ό μ€λ²λΌμ΄λ©ν΄μΌ νλ€.
x.equals(x)λ νμ trueμ¬μΌ νλ€. x.equals(y)κ° trueλ©΄ y.equals(x)λ trueμ¬μΌ νλ€. x.equals(y)μ y.equals(z)κ° trueλ©΄ x.equals(z)λ trueμ¬μΌ νλ€. equals()μ κ²°κ³Όλ νμ λμΌν΄μΌ νλ€. x.equals(null)μ νμ falseλ₯Ό λ°νν΄μΌ νλ€. hashCode()λ κ°μ²΄λ₯Ό μ«μλ‘ ννν ν΄μκ°μ λ°ννλ λ©μλμ΄λ€. μ΄ κ°μ HashMap, HashSetκ³Ό κ°μ ν΄μ κΈ°λ° μ»¬λ μ
μμ κ°μ²΄λ₯Ό λΉ λ₯΄κ² μ μ₯νκ³ νμνκΈ° μν λ²ν· μΈλ±μ€ ν€λ‘ μ¬μ©λλ€.
Developer dev = new Developer("BlueCool", 12);
int hash = dev.hashCode(); // μμ: 427492637
hashCode()μ μν μ λ¨μν μ«μλ₯Ό λ§λλ κ²μ΄ μλλΌ λλ±ν κ°μ²΄λ λ°λμ λμΌν ν΄μμ½λλ₯Ό κ°μ ΈμΌ νλ€λ κ·μ½μ μ§ν€λλ° μλ€.
Hash κΈ°λ° μ»¬λ μ
μ λ΄λΆμ μΌλ‘ hashCode() κ°μ μ΄μ©ν΄ μ μ₯ μμΉ(λ²ν·)μ κ³μ°νκ³ κ°μ λ²ν·μ μ¬λ¬ κ°μ²΄κ° μ‘΄μ¬νλ κ²½μ° equals() λ©μλλ₯Ό μ¬μ©ν΄ λ
Όλ¦¬μ μΌλ‘ κ°μ κ°μ²΄μΈμ§ μ΅μ’
νμΈνλ€.
λ°λΌμ equals()λ§ μ¬μ μνκ³ hashCode()λ₯Ό μ¬μ μνμ§ μμΌλ©΄ λ
Όλ¦¬μ μΌλ‘ κ°μ κ°μ²΄μ΄λλΌλ μλ‘ λ€λ₯Έ ν΄μκ°μ κ°μ§ μ μκ² λμ΄ HashMap, HashSet λ±μ 컬λ μ
μμ μ€λ³΅μΌλ‘ μ μ₯λκ±°λ μ‘°ν, μμ μ μ€ν¨νκ² λλ λ± μΉλͺ
μ μΈ μ€λ₯κ° λ°μνλ€.
λ°λΌμ equals()λ₯Ό μ¬μ μν λλ λ°λμ hashCode()λ ν¨κ» μ¬μ μν΄μΌνλ©° hashCode λ©μλλ₯Ό μ¬μ μ ν λλ λ€μκ³Ό κ°μ κ·μ½μ λ°λ₯Έλ€.
hashCode()μ κ°μ΄ λ³νμ§ μμμΌ νλ€. x.equals(y)κ° trueλ©΄ λ°λμ x.hashCode() == y.hashCode()μ¬μΌ νλ€. μ¬μ©μ μ μ ν΄λμ€μμ κ°μ²΄μ λ
Όλ¦¬μ λλ±μ±μ νλ¨νλ €λ©΄ equals()μ hashCode()λ₯Ό ν¨κ» μ¬μ μν΄μΌ νλ€. μΌλ°μ μΌλ‘ λ€μκ³Ό κ°μ λ°©μμΌλ‘ ꡬννλ€.
import java.util.Objects;
class Developer {
private String name;
private int age;
public Developer(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this === o) return true;
if (!(o instanceof Developer)) return false;
Developer dev = (Developer) o;
return age == dev.age && Objects.equals(name, dev.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
μ μ½λμμλ Objects.equals()μ Objects.hash()λ₯Ό μ¬μ©νμ¬ equals()μ hashCode()λ₯Ό κ°κ²°νκ² κ΅¬ννμλ€.
μ΄λ κ² κ΅¬ννλ©΄ λ Developer κ°μ²΄μ nameκ³Ό age κ°μ΄ λμΌν κ²½μ° κ°μ κ°μ²΄λ‘ νλ¨νλ©° λμΌν ν΄μμ½λλ₯Ό λ°ννκ² λλ€.
μ€λ¬΄μμλ Lombokμ μ¬μ©νμ¬ equals()μ hashCode()λ₯Ό μλμΌλ‘ μμ±νλ κ²½μ°λ λ§λ€.
import lombok.EqualsAndHashCode;
@EqualsAndHashCode
public class Developer {
private String name;
private int age;
}β
λλ @Data μ΄λ
Έν
μ΄μ
μ μ¬μ©νμ¬ equals(), hashCode(), getter, setter λ±μ ν¨κ» μλ μμ±ν μ μλ€.
