equals λ©μλλ μ¬μ μνκΈ° μ¬μ 보μ΄μ§λ§ κ³³κ³³μ ν¨μ μ΄ λμ¬λ¦¬κ³ μλ€. κ°μ₯ μ¬μ΄ κΈΈμ μμ μ¬μ μνμ§ μλ κ²μ΄λ€.
κ°μ΄ κ°μ μΈμ€ν΄μ€κ° λ μ΄μ λ§λ€μ΄μ§μ§ μλ μΈμ€ν΄μ€ ν΅μ ν΄λμ€λΌλ©΄
equals
λ₯Ό μ¬μ μνμ§ μμλ λ©λλ€. μ΄λ° κ²½μ°μλ κ°μ²΄μ μλ³μ±(Identity)κ³Ό λ Όλ¦¬μ λμΉμ±(Equality)μ΄ λμΌνκ² μ·¨κΈλκΈ° λλ¬Έμ λλ€.
κ°μ νννλ κ² μλλΌ λμνλ κ°μ²΄λ₯Ό νννλ ν΄λμ€κ° μ¬κΈ° ν΄λΉνλ€. λνμ μΈ μλ‘ Thread, Controller, Service λ±μ΄ μ΄ μ‘°κ±΄μ λΆν©νλ€.
public class MyService {
// μλΉμ€ λ‘μ§ κ΅¬ν
public void execute() {
// μ€ν μ½λ
}
}
// μ¬μ© μμ
MyService service1 = new MyService();
MyService service2 = new MyService();
// μλ‘ λ€λ₯Έ μλΉμ€ μΈμ€ν΄μ€λ λ³Έμ§μ μΌλ‘ κ³ μ ν©λλ€.
System.out.println(service1.equals(service2)); // false
2) μΈμ€ν΄μ€μ λ Όλ¦¬μ λμΉμ±(logical equality)1μ κ²μ¬ν μΌμ΄ μμ λ
Patternμ μΈμ€ν΄μ€κ° κ°μ μ κ· ννμμ λνλ΄λμ§ κ²μ¬νκ±°λ Random ν΄λμ€μ equals λ©μλκ° ν° μλ―Έλ₯Ό κ°μ§μ§ λͺ»νλ κ²μ²λΌ ν΄λΌμ΄μΈνΈκ° μ΄ λ°©μμ΄ νμ μλ€κ³ νλ¨λλ©΄ equalsλ₯Ό μ¬μ μ νμ§ μμλ λλ€.
Pattern pattern1 = Pattern.compile("[a-z]*");
Pattern pattern2 = Pattern.compile("[a-z]*");
// Pattern ν΄λμ€λ equalsλ₯Ό μ¬μ μνμ§ μμμΌλ―λ‘ μ°Έμ‘° λΉκ΅λ₯Ό ν©λλ€.
System.out.println(pattern1.equals(pattern2)); // false
// κ·Έλ¬λ λμΌν μ κ· ννμμ λνλ
λλ€.
String testStr = "abc";
System.out.println(pattern1.matcher(testStr).matches()); // true
System.out.println(pattern2.matcher(testStr).matches()); // true
νμ ν΄λμ€μμλ μ¬μ©νκΈ°μ μ ν©ν equlasλΌλ©΄ μ¬μ μν νμ μμ΄ μμλ°μ μ¬μ©νλ©΄ λλ€
- Set ꡬν체λ Abstractsetμ΄ κ΅¬νν equalsλ₯Ό μμλ°μ μ°κ³ , List ꡬν체λ€μ AbstractListλ‘λΆν°, Map ꡬν체λ€μ AbstractMapμΌλ‘λΆν° μμλ°μ κ·Έλλ‘ μ΄λ€.
4) ν΄λμ€κ° private λλ package-private(default)μ΄κ³ equals λ©μλλ₯Ό νΈμΆν μΌμ΄ μμ λ
equalsκ° νΈμΆλ μΌμ΄ μμ΄ μ€μλ‘λΌλ νΈμΆλλ κ±Έ λ§κ³ μΆλ€λ©΄ λ€μκ³Ό κ°μ΄ ꡬννλ©΄ λλ€.
class PackagePrivateClass {
// ν΄λμ€ λ΄μ©
@Override
public boolean equals(Object o) {
throw new AssertionError("equals λ©μλλ νΈμΆλ μ μμ΅λλ€.");
}
}
// μ¬μ© μμ
PackagePrivateClass obj1 = new PackagePrivateClass();
PackagePrivateClass obj2 = new PackagePrivateClass();
// equals λ©μλλ₯Ό νΈμΆνλ©΄ AssertionErrorκ° λ°μν©λλ€.
boolean isEqual = obj1.equals(obj2); // AssertionError λ°μ
- AssertionError μ¬μ© μ΄μ :
equals
λ©μλκ° νΈμΆλμ§ μλλ‘ λ³΄μ₯νλ©°, λ§μ½ νΈμΆλλ©΄ νλ‘κ·Έλλ¨Έμκ² μ¦κ°μ μΈ νΌλλ°±μ μ 곡νλ€. - μ£Όμμ¬ν:
AssertionError
λ μΌλ°μ μΌλ‘ μμμΉ λͺ»ν μν©μμ μ¬μ©λλ©°, λ°νμ νκ²½μμ μ€λ₯λ₯Ό λνλΈλ€. λ°λΌμ μ΄ λ°©μμ μ¬μ©ν λλ ν΄λΉ ν΄λμ€μ μ¬μ© λ²μμ λͺ©μ μ λͺ νν ν΄μΌ ννλ€.
κ°μ²΄μ μλ³μ±μ΄ μλ λ Όλ¦¬μ λμΉμ±μ νμΈν΄μΌ νλλ°, μμ ν΄λμ€μ equals
κ° λ Όλ¦¬μ λμΉμ±
μ λΉκ΅νλλ‘ μ¬μ μλμ§ μμμ λ ν΄μΌνλ€.
μ£Όλ‘ Stringμ΄λ Integerμ κ°μ κ° ν΄λμ€κ° μ΄μ ν΄λΉνλ€.
κ° ν΄λμ€μ equalsλ₯Ό μ¬μ μ ν λ λ Όλ¦¬μ λμΉμ±μ νμΈνλλ‘ μ¬μ μν΄λλ©΄, κ°μ λΉκ΅νλ κ² λΏλ§μλλΌ Mapμ ν€λ Setμ μμλ‘ μ¬μ©ν μ μκ² λλ€.
// κ°μ λΉκ΅
@Override
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
- κ°μ΄ κ°μ μΈμ€ν΄μ€κ° λ μ΄μ λ§λ€μ΄μ§μ§ μλ μΈμ€ν΄μ€ ν΅μ ν΄λμ€λΌλ©΄ equalsλ₯Ό μ¬μ μνμ§ μμλ λλ€.
- λνμ μΈ μλ‘
Enum
νμ μ΄ μμΌλ©°, μ΄λ¬ν ν΄λμ€μμλequals
λ©μλλ₯Ό μ¬μ μνμ§ μμλ λλ€. - λ Όλ¦¬μ μΌλ‘ κ°μ μΈμ€ν΄μ€κ° 2κ° μ΄μ λ§λ€μ΄μ§μ§ μμΌλ λ Όλ¦¬μ λμΉμ±κ³Ό κ°μ²΄ μλ³μ±μ΄ λκ°μ μλ―ΈλΌκ³ λ³Ό μ μλ€.
Enum
νμ μ μλ°μμ μΈμ€ν΄μ€ ν΅μ ν΄λμ€2μ λνμ μΈ μ- κ° μ΄κ±° μμλ μ μΌν μΈμ€ν΄μ€μ΄λ©°, λμΌν μ΄κ±° μμμ λν΄ μ¬λ¬ μΈμ€ν΄μ€κ° μμ±λμ§ μλλ€.
- λ°λΌμ
Enum
νμ μμλequals
λ©μλλ₯Ό μ¬μ μνμ§ μμλ λλ€. - κ°μ²΄μ μλ³μ±κ³Ό λ
Όλ¦¬μ λμΉμ±μ΄ λμΌνλ―λ‘,
==
μ°μ°μλ‘ λΉκ΅ν΄λ μΆ©λΆλ€.
μμ μ½λ:
public enum Color {
RED, GREEN, BLUE;
}
// μ¬μ© μμ
Color color1 = Color.RED;
Color color2 = Color.RED;
// λμΌν μΈμ€ν΄μ€μ΄λ―λ‘ μ°Έμ‘° λΉκ΅κ° κ°λ₯
System.out.println(color1 == color2); // true
System.out.println(color1.equals(color2)); // true
// λ€λ₯Έ μΈμ€ν΄μ€μ λΉκ΅
Color color3 = Color.GREEN;
System.out.println(color1 == color3); // false
System.out.println(color1.equals(color3)); // false
Color.RED
λ μ μΌν μΈμ€ν΄μ€μ΄λ―λ‘color1
κ³Όcolor2
λ λμΌν κ°μ²΄λ₯Ό μ°Έμ‘°νλ€.- λ°λΌμ
==
μ°μ°μμequals
λ©μλ λͺ¨λtrue
λ₯Ό λ°νννλ€. equals
λ©μλλ₯Ό μ¬μ μνμ§ μμμ§λ§,Object
ν΄λμ€μ κΈ°λ³Έ ꡬνμΌλ‘λ λ Όλ¦¬μ λμΉμ±μ μ¬λ°λ₯΄κ² νλ¨ν μ μλ€.
- λ°μ¬μ±(reflexive):
x.equals(x)
λ νμtrue
μ¬μΌ νλ€. - λμΉμ±(symmetric):
x.equals(y)
κ°true
μ΄λ©΄y.equals(x)
λtrue
μ¬μΌ νλ€. - μΆμ΄μ±(transitive):
x.equals(y)
μ΄κ³y.equals(z)
μ΄λ©΄x.equals(z)
λtrue
μ¬μΌ νλ€. - μΌκ΄μ±(consistent): κ°μ²΄μ μνκ° λ³κ²½λμ§ μμλ€λ©΄ μ¬λ¬ λ² νΈμΆν΄λ νμ κ°μ κ²°κ³Όλ₯Ό λ°νν΄μΌ νλ€.
null
-μλ(non-nullity):x.equals(null)
μ νμfalse
μ¬μΌ λ€.
- ==μ°μ°μλ₯Ό μ¬μ©ν΄ μ λ ₯μ΄ μκΈ° μμ μ μ°Έμ‘°3μΈμ§ νμΈνλ€.
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true; // κ°μ κ°μ²΄μ΄λ―λ‘ true λ°ν(λΆνμν κ³μ° νΌν μ μμ)
}
// λλ¨Έμ§ λΉκ΅ λ‘μ§...
}
instanceof μ°μ°μ
λ‘ μ λ ₯μ΄ μ¬λ°λ₯Έ νμ μΈμ§ νμΈνλ€.
- μ
λ ₯ κ°μ²΄(
obj
)κ° μ¬λ°λ₯Έ νμ μΈμ§ νμΈ. - κ°μ²΄μ ν΄λμ€ νμ
μ΄ λ€λ₯΄λ€λ©΄, λ κ°μ²΄λ λ
Όλ¦¬μ μΌλ‘ λλ±ν μ μμΌλ―λ‘
false
λ₯Ό λ°ν - μ΄λ λΉκ΅νλ νμ μ μΌλ°μ μΌλ‘ ν΄λΉ ν΄λμ€ λλ νΉμ μΈν°νμ΄μ€μ΄λ€.
if (!(obj instanceof MyClass)) {
return false; // νμ
μ΄ λ€λ₯΄λ―λ‘ false λ°ν
}
if (!(obj instanceof MyInterface)) {
return false; // μΈν°νμ΄μ€λ₯Ό ꡬννμ§ μμΌλ©΄ false λ°ν
}
- μ λ ₯μ μ¬λ°λ₯Έ νμ μΌλ‘ νλ³ννλ€.
- 2λ¨κ³μμ νμ
κ²μ¬λ₯Ό ν΅κ³Όνλ€λ©΄, μ΄μ μ
λ ₯ κ°μ²΄λ₯Ό ν΄λΉ νμ
μΌλ‘
νλ³ν(casting)
ν μ μλ€. - νλ³νμ ν΅ν΄ μ λ ₯ κ°μ²΄μ νλλ λ©μλμ μ κ·Όν μ μλ€.
μ½λ μμ:
-
ν΄λμ€λ‘ νλ³ννλ κ²½μ°:
MyClass other = (MyClass) obj;
-
μΈν°νμ΄μ€λ‘ νλ³ννλ κ²½μ°:
MyInterface other = (MyInterface) obj;
- ν΅μ¬ νλλ€μ νλμ© λΉκ΅νμ¬ λ
Όλ¦¬μ λλ±μ±μ νλ¨
- νλμ νμ μ λ°λΌ μ μ ν λΉκ΅ λ°©λ²μ μ¬μ©
- λͺ¨λ νλκ° μΌμΉνλ©΄
true
λ₯Ό λ°ννκ³ , νλλΌλ λ€λ₯΄λ©΄false
λ₯Ό λ°νν©λλ€.
equalsλ jvmλ΄μ μλ κ°μ²΄λ§ κ°μ§κ³ νλ¨ν΄μΌ νλλ° λ€νΈμν¬λ₯Ό νκ² λλ©΄.. λ§€λ² λ¬λΌμ§κ² λλ€? ipμ λ°λΌ λ¬λΌμ§κ² λλ€κ³ νλ€..
{% embed url="https://stackoverflow.com/questions/3771081/proper-way-to-check-for-url-equality" %}
- float, dobleμ μ μΈν κΈ°λ³Έ νμ : == μ°μ°μλ‘ λΉκ΅νκΈ°
float
μdouble
νμ :Float.compare(float, float)
μDouble.compare(double, double)
μ μ λ©μλλ₯Ό μ¬μ©νλ€.- μ΄μ :
NaN
,-0.0f
λ± νΉμν λΆλμμμ κ°μ μ ννκ² μ²λ¦¬νκΈ° μν΄μ - μ£Όμ:
Float.equals(Object)
μDouble.equals(Object)
λ©μλλ μ€ν λ°μ±μ μ λ°νμ¬ μ±λ₯μ μν₯μ μ€ μ μμΌλ―λ‘ μ¬μ©μ μ§μ
- μ΄μ :
- μ°Έμ‘° νμ
νλ: ν΄λΉ κ°μ²΄μ
equals
λ©μλλ₯Ό μ¬μ©νμ¬ λΉκ΅ null
νμ© νλ: λΉκ΅ μnull
체ν¬λ₯Ό μννμ¬NullPointerException
μ λ°©μ§
- λ°°μ΄ νλ: λ°°μ΄μ κ° μμλ₯Ό μμ μΈκΈν λ°©μλλ‘ λΉκ΅νλ€.
- λͺ¨λ μμκ° ν΅μ¬ νλλΌλ©΄
Arrays.equals
λ©μλλ₯Ό νμ©ν μ μλ€.
Object.equals(Object, Object)λ‘ λΉκ΅ν΄ NPE λ°μμ λ°©μ§νλ€.
λΉκ΅νκΈ° 볡μ‘ν νλλ νλμ νμ€νμ μ μ₯ν ν λΉκ΅νλ€. λΆλ³ ν΄λμ€μ μ 격μ΄λ€.
- λΉκ΅ κ°λ₯μ±μ΄ λμ νλ λλ λΉκ΅ λΉμ©μ΄ μ μ νλλΆν° λΉκ΅νμ¬ μ±λ₯μ μ΅μ ννλ€.
- κ°μ²΄μ λ Όλ¦¬μ μνμ κ΄λ ¨ μλ νλ(μ: λκΈ°νμ© λ½ νλ)λ λΉκ΅νμ§ μλλ€.
- ν΅μ¬ νλλ‘λΆν° κ³μ° κ°λ₯ν νμ νλλ μΌλ°μ μΌλ‘ λΉκ΅ν νμκ° μμ§λ§, κ²½μ°μ λ°λΌ λΉκ΅κ° ν¨μ¨μ μΌ μ μλ€.
public final class PhoneNumber {
private final short areaCode, prefix, lineNum;
public PhoneNumber(int areaCode, int prefix, int lineNum) {
this.areaCode = rangeCheck(areaCode, 999, "μ§μ μ½λ");
this.prefix = rangeCheck(prefix, 999, "ν리ν½μ€");
this.lineNum = rangeCheck(lineNum, 9999, "κ°μ
μ λ²νΈ");
}
private static short rangeCheck(int val, int max, String argName) {
if (val < 0 || val > max)
throw new IllegalArgumentException(argName + ": " + val);
return (short) val;
}
@Override
public boolean equals(Object o) {
if (this == o) // μ°Έμ‘° λΉκ΅
return true;
if (!(o instanceof PhoneNumber)) // νμ
체ν¬
return false;
PhoneNumber pn = (PhoneNumber) o;
// ν΅μ¬ νλ λΉκ΅
return pn.lineNum == lineNum && pn.prefix == prefix && pn.areaCode == areaCode;
}
@Override
public int hashCode() {
return Objects.hash(areaCode, prefix, lineNum);
}
// κΈ°ν λ©μλ μλ΅
}
falseμΈ μ΄μ
public class Test {
private String name;
public Test(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Test) {
return this.name.equals(((Test) obj).name);
}
return false;
}
public static void main(String[] args) throws Exception {
Set<Test> set = new HashSet<>();
Test test = new Test("java");
set.add(test);
Test test2 = new Test("java");
System.out.println(set.contains(test2)); //false
}
}
μ μ½λμμ Set<Test>
μ λμΌν name
κ°μ κ°μ§ κ°μ²΄(test
μ test2
)λ₯Ό μΆκ°νκ³ , κ·Έ ν set.contains(test2)
κ° false
λ‘ μΆλ ₯λλ μ΄μ λ HashSet
μ΄ λ΄λΆμ μΌλ‘ equals
μ hashCode
λ©μλλ₯Ό λͺ¨λ μ¬μ©ν΄ κ°μ²΄μ λμΌμ±μ λΉκ΅νκΈ° λλ¬Έμ΄λ€.
HashSet
μ λ΄λΆμ μΌλ‘ ν΄μ κΈ°λ° μλ£κ΅¬μ‘°μ΄λ€. HashSet
μ΄ κ°μ²΄λ₯Ό μ μ₯νκ±°λ μ‘°νν λλ equals
λΏλ§ μλλΌ hashCode
λ©μλλ μ¬μ©νλ€.
equals
: λ κ°μ²΄κ° λμΌνμ§ λΉκ΅νλ λ©μμ΄λ€. νμ¬equals
λ©μλλ₯Ό μ€λ²λΌμ΄λνμ¬name
κ°λ§μ κΈ°μ€μΌλ‘ λΉκ΅νλλ‘ κ΅¬νλμ΄ μλ€. λ°λΌμtest
μtest2
λequals
λ©μλ μμΌλ‘λ λμΌν κ°μ²΄λ‘ νλ¨hashCode
: κ°μ²΄λ₯Ό ν΄μ ν μ΄λΈμμ λΉ λ₯΄κ² μ°ΎκΈ° μν΄ μ¬μ©λλ μ μ κ°μ΄λ€.HashSet
μ΄λHashMap
κ³Ό κ°μ ν΄μ κΈ°λ° μλ£κ΅¬μ‘°λ κ°μ²΄λ₯Ό λΉκ΅ν λ λ¨Όμ hashCode
λ₯Ό λΉκ΅νκ³ ,hashCode
κ° λμΌν κ²½μ°μλ§equals
λ©μλλ₯Ό νΈμΆνμ¬ μ΅μ’ μ μΌλ‘ λμΌμ±μ νλ¨νλ€.
λ¬Έμ λ νμ¬ Test
ν΄λμ€μμ hashCode
λ©μλκ° μ€λ²λΌμ΄λλμ΄ μμ§ μκΈ° λλ¬Έμ΄λ€. κΈ°λ³Έμ μΌλ‘ Object
ν΄λμ€μ hashCode
λ κ°μ²΄μ λ©λͺ¨λ¦¬ μ£Όμλ₯Ό κΈ°λ°μΌλ‘ ν΄μ κ°μ μμ±νλ―λ‘, test
μ test2
λ μλ‘ λ€λ₯Έ ν΄μ μ½λλ₯Ό κ°μ§λ€.
λ°λΌμ, HashSet
μ test
μ test2
λ₯Ό μλ‘ λ€λ₯Έ κ°μ²΄λ‘ μΈμνκ² λλ©°, set.contains(test2)
λ false
λ₯Ό λ°ννκ² λλ€.
hashCode
λ©μλλ₯Ό equals
μ μΌκ΄λκ² μ€λ²λΌμ΄λν΄μΌ νλ€. name
νλλ₯Ό κΈ°μ€μΌλ‘ hashCode
λ₯Ό μμ±νλ©΄ test
μ test2
κ° κ°μ ν΄μ μ½λλ₯Ό κ°μ§κ² λμ΄ HashSet
μ΄ λμΌ κ°μ²΄λ‘ μΈμνκ² λλ€.
μμ λ μ½λλ λ€μκ³Ό κ°λ€:
public class Test {
private String name;
public Test(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Test) {
return this.name.equals(((Test) obj).name);
}
return false;
}
@Override
public int hashCode() {
return name.hashCode(); // name νλλ₯Ό κΈ°μ€μΌλ‘ hashCode μμ±
}
public static void main(String[] args) throws Exception {
Set<Test> set = new HashSet<>();
Test test = new Test("java");
set.add(test);
Test test2 = new Test("java");
System.out.println(set.contains(test2)); // true
}
}
hashCode
μ€λ²λΌμ΄λ:hashCode
λ©μλλ₯Όname
νλλ₯Ό κΈ°μ€μΌλ‘ μ€λ²λΌμ΄λνμ¬,name
μ΄ λμΌν κ°μ²΄λ κ°μ ν΄μ μ½λλ₯Ό κ°μ§λλ‘ νμ΅λλ€.- μ΄μ
test
μtest2
λ κ°μ ν΄μ μ½λλ₯Ό κ°μ§λ©°,HashSet
μ΄ μ΄ λ κ°μ²΄λ₯Ό λμΌν κ°μ²΄λ‘ μΈμνκ² λ©λλ€.
μ΄μ set.contains(test2)
λ true
λ₯Ό λ°ννκ² λ©λλ€.
β¨ μ 리
κΌ νμν κ²½μ°κ° μλλ©΄ equalsλ₯Ό μ¬μ μνμ§ λ§μ. λ§μ κ²½μ°μ Objectμ equalsκ° μνλ λΉκ΅λ₯Ό μ νν μνν΄μ€λ€. μ¬μ μν΄μΌ ν λλ κ·Έ ν΄λμ€μ ν΅μ¬ νλ λͺ¨λλ₯Ό λΉ μ§μμ΄, λ€μ― κ°μ§ κ·μ½μ νμ€ν μ§μΌκ°λ©° λΉκ΅ν΄μΌ νλ€.
Footnotes
-
λ Όλ¦¬μ λμΉμ±μ λ κ°μ²΄μ μ€μ λ©λͺ¨λ¦¬ μ£Όμ(μ°Έμ‘°)κ° λμΌνμ§ μ¬λΆκ° μλ, κ°μ²΄κ° κ°μ§ μμ±μ΄λ μνκ° λμΌνμ§λ₯Ό λΉκ΅νλ κ²μ μλ―Έν©λλ€. μ¦, μλ‘ λ€λ₯Έ μΈμ€ν΄μ€μ΄μ§λ§ λ΄λΆ λ°μ΄ν°λ μνκ° λμΌνλ€λ©΄ λ Όλ¦¬μ μΌλ‘ λλ±νλ€κ³ νλ¨ν©λλ€.
μλ°μμ
equals
λ©μλλ₯Ό μ€λ²λΌμ΄λνμ¬ κ°μ²΄μ λ Όλ¦¬μ λμΉμ±μ μ μν μ μμ΅λλ€. κΈ°λ³Έμ μΌλ‘Object
ν΄λμ€μequals
λ©μλλ μ°Έμ‘° λΉκ΅(물리μ λμΉμ±)λ₯Ό μννμ¬ λ κ°μ²΄κ° λμΌν λ©λͺ¨λ¦¬ μ£Όμλ₯Ό κ°μ§λμ§ νμΈν©λλ€. κ·Έλ¬λ μ΄λ₯Ό μ€λ²λΌμ΄λνμ¬ κ°μ²΄μ μμ± κ°μ κΈ°λ°μΌλ‘ λΉκ΅νλλ‘ κ΅¬ννλ©΄ λ Όλ¦¬μ λμΉμ±μ νλ¨ν μ μμ΅λλ€. β© -
μΈμ€ν΄μ€ ν΅μ ν΄λμ€λ?
- μΈμ€ν΄μ€ ν΅μ ν΄λμ€(Instance-Controlled Class)λ λμΌν κ°μ κ°λ κ°μ²΄κ° λ¨ νλλ§ μ‘΄μ¬νλλ‘ μ€κ³λ ν΄λμ€μ λλ€.
- μ΄λ¬ν ν΄λμ€λ μμ±μλ₯Ό
private
μΌλ‘ μ ννκ³ , κ°μ²΄ μμ±μ ν΅μ νμ¬ λμΌν κ°μ λν΄ νλμ μΈμ€ν΄μ€λ§μ μ 곡ν©λλ€. - μ΄λ‘ μΈν΄ κ°μ²΄μ μλ³μ±(
==
μ°μ°μ μ¬μ©)κ³Ό λ Όλ¦¬μ λμΉμ±(equals
λ©μλ μ¬μ©)μ΄ λμΌν΄μ§λλ€.
μΈμ€ν΄μ€ ν΅μ ν΄λμ€μ ꡬν λ°©λ²
- μμ±μλ₯Ό
private
μΌλ‘ μ μΈνμ¬ μΈλΆμμ κ°μ²΄ μμ±μ λ§μ΅λλ€. - μ μ ν©ν 리 λ©μλλ₯Ό μ 곡νμ¬ κ°μ²΄ μμ±μ ν΅μ ν©λλ€.
- λμΌν κ°μ κ°μ§λ μμ²μ λν΄ μΊμ±λ μΈμ€ν΄μ€λ₯Ό λ°νν©λλ€.
μμ μ½λ:
javaμ½λ 볡μ¬public class Currency { private static final Map<String, Currency> instances = new HashMap<>(); private final String code; // μμ±μλ₯Ό privateμΌλ‘ μ μΈ private Currency(String code) { this.code = code; } // μ μ ν©ν 리 λ©μλλ‘ κ°μ²΄ μμ± ν΅μ public static Currency getInstance(String code) { synchronized (instances) { // μ΄λ―Έ μ‘΄μ¬νλ©΄ μΊμ±λ μΈμ€ν΄μ€ λ°ν if (instances.containsKey(code)) { return instances.get(code); } // μ‘΄μ¬νμ§ μμΌλ©΄ μ μΈμ€ν΄μ€ μμ± ν μΊμ± Currency currency = new Currency(code); instances.put(code, currency); return currency; } } public String getCode() { return code; } // equalsλ₯Ό μ¬μ μνμ§ μμ } // μ¬μ© μμ Currency usd1 = Currency.getInstance("USD"); Currency usd2 = Currency.getInstance("USD"); System.out.println(usd1 == usd2); // true System.out.println(usd1.equals(usd2)); // true
Currency
ν΄λμ€λ νΉμ ν΅ν μ½λλ₯Ό κ°μ§ μΈμ€ν΄μ€κ° νλλ§ μμ±λλλ‘ ν©λλ€.usd1
κ³Όusd2
λ λͺ¨λ"USD"
μ½λλ₯Ό κ°μ§λ©°, λμΌν μΈμ€ν΄μ€λ₯Ό μ°Έμ‘°ν©λλ€.- λ°λΌμ
==
μ°μ°μμequals
λ©μλ λͺ¨λtrue
λ₯Ό λ°νν©λλ€. equals
λ©μλλ₯Ό μ¬μ μνμ§ μμλ κ°μ²΄μ λλ±μ±μ μ¬λ°λ₯΄κ² νλ¨ν μ μμ΅λλ€.
κ°μ²΄ μλ³μ±κ³Ό λ Όλ¦¬μ λμΉμ±μ μΌμΉ
- κ°μ²΄ μλ³μ±(Identity): κ°μ²΄μ λ©λͺ¨λ¦¬ μ£Όμλ₯Ό λΉκ΅νμ¬ λμΌν κ°μ²΄μΈμ§ νλ¨ν©λλ€.
==
μ°μ°μλ₯Ό μ¬μ©ν©λλ€. - λ
Όλ¦¬μ λμΉμ±(Equality): κ°μ²΄μ μμ±μ΄λ μνλ₯Ό λΉκ΅νμ¬ λ
Όλ¦¬μ μΌλ‘ λλ±νμ§λ₯Ό νλ¨ν©λλ€.
equals
λ©μλλ₯Ό μ¬μ©ν©λλ€. - μΈμ€ν΄μ€ ν΅μ ν΄λμ€μμλ λμΌν κ°μ κ°μ§λ κ°μ²΄κ° νλλ§ μ‘΄μ¬νλ―λ‘, μλ³μ±κ³Ό λμΉμ±μ΄ μΌμΉν©λλ€.
-
μ°Έμ‘° λΉκ΅(Reference Comparison)λ₯Ό ν΅ν΄ λ κ°μ²΄κ° λμΌν μΈμ€ν΄μ€μΈμ§ νμΈν©λλ€. β©