μ, equals λ©μλλ java.lang.Object ν΄λμ€μ μ μλμ΄ μλ λ©μλμ
λλ€.
Object ν΄λμ€λ μλ°μμ λͺ¨λ ν΄λμ€μ μ΅μμ λΆλͺ¨ ν΄λμ€μ΄λ©°, λͺ¨λ κ°μ²΄λ μμμ μΌλ‘ Objectλ₯Ό μμλ°μ΅λλ€. Object ν΄λμ€λ μλ° κ°μ²΄λ€μ΄ 곡ν΅μ μΌλ‘ κ°μ ΈμΌ ν κΈ°λ³Έ λ©μλλ€μ μ μνκ³ μμ΅λλ€.
Object ν΄λμ€μ μ£Όμ λ©μλλ€:
public boolean equals(Object obj)- μν : λ κ°μ²΄μ λλ±μ±μ λΉκ΅νλ λ©μλμ λλ€.
- κΈ°λ³Έ ꡬν: λ κ°μ²΄μ **μ°Έμ‘°(λ©λͺ¨λ¦¬ μ£Όμ)**λ₯Ό λΉκ΅νμ¬ λμΌν κ°μ²΄μΈμ§ νμΈν©λλ€.
- μ€λ²λΌμ΄λ νμμ±: κ°μ²΄μ **λ΄μ©(μμ± κ°)**μ κΈ°μ€μΌλ‘ λΉκ΅νλ €λ©΄ μ΄ λ©μλλ₯Ό μ€λ²λΌμ΄λν΄μΌ ν©λλ€.
public int hashCode()- μν : κ°μ²΄μ ν΄μ μ½λλ₯Ό λ°ννλ λ©μλμ λλ€.
- μ¬μ© μ΄μ : ν΄μ κΈ°λ° μ»¬λ μ
(
HashMap,HashSetλ±)μμ κ°μ²΄λ₯Ό ν¨μ¨μ μΌλ‘ κ΄λ¦¬νκΈ° μν΄ μ¬μ©λ©λλ€. - μ€λ²λΌμ΄λ νμμ±:
equalsλ₯Ό μ€λ²λΌμ΄λνλ©΄hashCodeλ ν¨κ» μ€λ²λΌμ΄λν΄μΌ ν©λλ€.
public String toString()- μν : κ°μ²΄μ λ¬Έμμ΄ ννμ λ°ννλ λ©μλμ λλ€.
- κΈ°λ³Έ ꡬν: ν΄λμ€ μ΄λ¦κ³Ό ν΄μ μ½λλ₯Ό ν¬ν¨ν λ¬Έμμ΄μ λ°νν©λλ€.
- μ€λ²λΌμ΄λ νμμ±: κ°μ²΄μ μ μ©ν μ 보λ₯Ό ν¬ν¨νλλ‘ μ€λ²λΌμ΄λνλ κ²μ΄ μΌλ°μ μ λλ€.
protected Object clone() throws CloneNotSupportedException- μν : κ°μ²΄μ 볡μ λ³Έμ λ§λλ λ©μλμ λλ€.
- μ¬μ© 쑰건:
CloneableμΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€μμ μ¬μ© κ°λ₯ν©λλ€. - μ£Όμμ¬ν: κΉμ 볡μ¬μ μμ 볡μ¬λ₯Ό κ³ λ €ν΄μΌ ν©λλ€.
public final void wait(),wait(long timeout),wait(long timeout, int nanos)- μν : νμ¬ μ€λ λλ₯Ό μΌμ μ μ§νκ³ λ€λ₯Έ μ€λ λμμ
notify()λnotifyAll()μ νΈμΆν λκΉμ§ λκΈ°ν©λλ€. - μ¬μ© 쑰건: λ°λμ λκΈ°νλ 컨ν
μ€νΈ(
synchronizedλΈλ‘ λλ λ©μλ) λ΄μμ νΈμΆν΄μΌ ν©λλ€.
- μν : νμ¬ μ€λ λλ₯Ό μΌμ μ μ§νκ³ λ€λ₯Έ μ€λ λμμ
public final void notify()- μν :
wait()μ μν΄ λκΈ° μ€μΈ μ€λ λ μ€ νλλ₯Ό κΉ¨μλλ€. - μ¬μ© 쑰건: λκΈ°νλ 컨ν μ€νΈ λ΄μμ νΈμΆν΄μΌ ν©λλ€.
- μν :
public final void notifyAll()- μν :
wait()μ μν΄ λκΈ° μ€μΈ λͺ¨λ μ€λ λλ₯Ό κΉ¨μλλ€. - μ¬μ© 쑰건: λκΈ°νλ 컨ν μ€νΈ λ΄μμ νΈμΆν΄μΌ ν©λλ€.
- μν :
protected void finalize() throws Throwable- μν : κ°μ²΄κ° κ°λΉμ§ 컬λ μ λ λ νΈμΆλλ λ©μλμ λλ€.
- μ£Όμμ¬ν: μλ° 9λΆν°λ λ μ΄μ μ¬μ©μ΄ κΆμ₯λμ§ μμ΅λλ€(deprecated).
Object ν΄λμ€μ ꡬ쑰μ μν :
- ν¨ν€μ§:
java.lang - μ κ·Ό μ μ΄μ:
public class Object - μμ κ΄κ³: μλ°μμ λͺ¨λ ν΄λμ€μ μ΅μμ λΆλͺ¨ ν΄λμ€μ΄λ©°, λ€λ₯Έ ν΄λμ€λ₯Ό μμλ°μ§ μμ΅λλ€.
μν :
- κΈ°λ³Έ λ©μλ μ 곡: λͺ¨λ κ°μ²΄κ° κ°μ ΈμΌ ν κΈ°λ³Έ λ©μλ(
equals,hashCode,toStringλ±)λ₯Ό μ 곡ν©λλ€. - λκΈ°ν λ©μ»€λμ¦ μ§μ: μ€λ λ λκΈ°νλ₯Ό μν λ©μλ(
wait,notify,notifyAll)λ₯Ό μ 곡ν©λλ€.
equals λ©μλμ μμΈ μ€λͺ
:
-
λ©μλ μκ·Έλμ²:
public boolean equals(Object obj)
-
κΈ°λ³Έ ꡬν:
this == objμ κ°μ΄ μ°Έμ‘° λΉκ΅λ₯Ό μνν©λλ€.- μ¦, λ κ°μ²΄κ° λμΌν λ©λͺ¨λ¦¬ μ£Όμλ₯Ό κ°λ¦¬ν¬ λλ§
trueλ₯Ό λ°νν©λλ€.
-
μ€λ²λΌμ΄λ μ΄μ :
- κ°μ²΄μ λ΄μ©μ λΉκ΅νμ¬ λ
Όλ¦¬μ μΌλ‘ λλ±νμ§λ₯Ό νλ¨νλ €λ©΄
equalsλ©μλλ₯Ό μ€λ²λΌμ΄λν΄μΌ ν©λλ€.
- κ°μ²΄μ λ΄μ©μ λΉκ΅νμ¬ λ
Όλ¦¬μ μΌλ‘ λλ±νμ§λ₯Ό νλ¨νλ €λ©΄
-
μ€λ²λΌμ΄λ μ μ§μΌμΌ ν κ³μ½:
- λ°μ¬μ±(reflexive):
x.equals(x)λ νμtrueμ¬μΌ ν©λλ€. - λμΉμ±(symmetric):
x.equals(y)κ°trueμ΄λ©΄y.equals(x)λtrueμ¬μΌ ν©λλ€. - μΆμ΄μ±(transitive):
x.equals(y)μy.equals(z)κ°trueμ΄λ©΄x.equals(z)λtrueμ¬μΌ ν©λλ€. - μΌκ΄μ±(consistent): κ°μ²΄μ μνκ° λ³κ²½λμ§ μμλ€λ©΄, μ¬λ¬ λ² νΈμΆν΄λ κ²°κ³Όλ λμΌν΄μΌ ν©λλ€.
nullκ³Όμ λΉκ΅:x.equals(null)μ νμfalseμ¬μΌ ν©λλ€.
- λ°μ¬μ±(reflexive):
-
μμ:
public class Person { private String name; private int age; @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; Person other = (Person) obj; return age == other.age && Objects.equals(name, other.name); } @Override public int hashCode() { return Objects.hash(name, age); } }
- μ μμμμ
nameκ³Όageκ° κ°μΌλ©΄ κ°μ κ°μ²΄λ‘ νλ¨νλλ‘equalsλ₯Ό μ€λ²λΌμ΄λνμ΅λλ€. hashCodeλ ν¨κ» μ€λ²λΌμ΄λνμ¬equalsμμ κ³μ½μ μ§μΌ°μ΅λλ€.
- μ μμμμ
Object ν΄λμ€μ λ€λ₯Έ λ©μλλ€μ μμΈ μ€λͺ
:
hashCode()- μν : κ°μ²΄μ ν΄μ μ½λλ₯Ό λ°ννλ©°, ν΄μ κΈ°λ° μ»¬λ μ μμ κ°μ²΄λ₯Ό μ μ₯νκ±°λ κ²μν λ μ¬μ©λ©λλ€.
- μ€λ²λΌμ΄λ μ μ£Όμμ¬ν:
equalsκ° κ°μ λ κ°μ²΄λ λμΌνhashCodeλ₯Ό λ°νν΄μΌ ν©λλ€.
toString()-
μν : κ°μ²΄μ λ¬Έμμ΄ ννμ λ°νν©λλ€.
-
μ€λ²λΌμ΄λ μ΄μ : κ°μ²΄μ μ μ©ν μ 보λ₯Ό ν¬ν¨ν λ¬Έμμ΄μ λ°ννμ¬ λλ²κΉ λ° λ‘κΉ μ νμ©ν©λλ€.
-
μμ:
@Override public String toString() { return "Person{name='" + name + "', age=" + age + "}"; }
-
- λκΈ°ν κ΄λ ¨ λ©μλ
wait(),notify(),notifyAll()-
μν : μ€λ λ κ° ν΅μ μ μν λ©μλμ λλ€.
-
μ¬μ© λ°©λ²:
synchronized (lock) { while (쑰건) { lock.wait(); } // μμ μν }
-
μ£Όμμ¬ν: λ°λμ
synchronizedλΈλ‘ λ΄μμ νΈμΆν΄μΌ νλ©°, κ·Έλ μ§ μμΌλ©΄IllegalMonitorStateExceptionμ΄ λ°μν©λλ€.
-
μ€μν κ°λ λ€:
equalsμhashCodeμ κ΄κ³:- κ³μ½: λ κ°μ²΄κ°
equalsμ μν΄ κ°λ€λ©΄, λμΌνhashCodeλ₯Ό λ°νν΄μΌ ν©λλ€. - μ΄μ : ν΄μ κΈ°λ° μ»¬λ μ
(
HashMap,HashSetλ±)μhashCodeλ₯Ό κΈ°λ°μΌλ‘ κ°μ²΄λ₯Ό κ΄λ¦¬νλ―λ‘, μ΄ κ³μ½μ μ§ν€μ§ μμΌλ©΄ μμμΉ λͺ»ν λμμ΄ λ°μν μ μμ΅λλ€.
- κ³μ½: λ κ°μ²΄κ°
toStringλ©μλμ νμ©:- κ°μ²΄μ νμ¬ μνλ₯Ό μ¬λμ΄ μ΄ν΄νκΈ° μ¬μ΄ ννλ‘ ννν©λλ€.
- λλ²κΉ , λ‘κΉ , UI μΆλ ₯ λ± λ€μν κ³³μμ νμ©λ©λλ€.
- μ€λ λ λκΈ°νμ
Objectν΄λμ€:- λͺ¨λ κ°μ²΄λ κ³ μ ν λͺ¨λν° λ½(monitor lock)μ κ°μ§κ³ μμ΅λλ€.
synchronizedν€μλλ₯Ό ν΅ν΄ κ°μ²΄μ λͺ¨λν° λ½μ νλνμ¬ λκΈ°νλ μ½λλ₯Ό μμ±ν μ μμ΅λλ€.wait,notify,notifyAllλ©μλλ μ΄λ¬ν λκΈ°νλ 컨ν μ€νΈμμ μ€λ λ κ°μ ν΅μ μ κ°λ₯νκ² ν©λλ€.
κ²°λ‘ :
java.lang.Object ν΄λμ€λ μλ°μμ λͺ¨λ ν΄λμ€μ μ΅μμ λΆλͺ¨λ‘μ, κ°μ²΄κ° κΈ°λ³Έμ μΌλ‘ κ°μ ΈμΌ ν λ©μλλ€μ μ 곡ν©λλ€. equals λ©μλλ Object ν΄λμ€μ μ μλμ΄ μμΌλ©°, κΈ°λ³Έμ μΌλ‘ μ°Έμ‘° λΉκ΅λ₯Ό μνν©λλ€. κ·Έλ¬λ λλΆλΆμ κ²½μ° κ°μ²΄μ λ΄μ© λΉκ΅κ° νμνλ―λ‘, equals λ©μλλ₯Ό μ€λ²λΌμ΄λνμ¬ μνλ λμμ ꡬνν΄μΌ ν©λλ€.
λν, hashCode, toString, μ€λ λ λκΈ°νλ₯Ό μν λ©μλλ€λ μ 곡νμ¬ κ°μ²΄μ λμμ 컀μ€ν°λ§μ΄μ§νκ³ μ€λ λ μμ ν νλ‘κ·Έλ¨μ μμ±ν μ μκ² ν©λλ€.
μΆκ° μ°Έκ³ μλ£:
- Effective Java (Joshua Bloch μ ):
equalsμhashCodeμ€λ²λΌμ΄λμ λν λͺ¨λ² μ¬λ‘λ₯Ό λ€λ£¨κ³ μμ΅λλ€. - Java 곡μ λ¬Έμ:
- Java Language Specification:
μμ½:
equalsλObjectν΄λμ€μ μ μλ λ©μλλ‘, κ°μ²΄μ λλ±μ±μ λΉκ΅ν©λλ€.Objectν΄λμ€λ λͺ¨λ ν΄λμ€μ λΆλͺ¨μ΄λ©°, κ³΅ν΅ λ©μλλ₯Ό μ 곡ν©λλ€.- νμμ λ°λΌ
equals,hashCode,toStringλ±μ μ€λ²λΌμ΄λνμ¬ κ°μ²΄μ μνλ λμμ μ μν μ μμ΅λλ€. - μ€λ λ λκΈ°νμ κ΄λ ¨λ λ©μλλ€λ μ 곡νμ¬ λ©ν°μ€λ λ νκ²½μμμ μμ ν νλ‘κ·Έλλ°μ μ§μν©λλ€.