[Java] equals(), hashCode()

๐Ÿ”น equals()์™€ hashCode()๋ž€ ?

Java์—์„œ ๋ชจ๋“  ํด๋ž˜์Šค๋Š” Object ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์œผ๋ฉฐ, equals()์™€ hashCode() ๋ฉ”์„œ๋“œ๋Š” ์ด Object ํด๋ž˜์Šค์— ์ •์˜๋˜์–ด ์žˆ๋‹ค.

์ฆ‰, Java์˜ ๋ชจ๋“  ๊ฐ์ฒด๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ๋‘ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ํ•„์š”์— ๋”ฐ๋ผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ”น equals()

public boolean equals(Object obj)
  • equals()๋Š” ๋‘ ๊ฐ์ฒด๊ฐ€ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ฐ™์€์ง€(๋™๋“ฑ์„ฑ) ๋น„๊ตํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.
  • ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ ๊ตฌํ˜„์—์„œ๋Š” ๋‹จ์ˆœํžˆ ๋™์ผ์„ฑ(Identity)์„ ๋น„๊ตํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋˜์–ด์žˆ๋‹ค.
    • ์ฆ‰, this == obj์™€ ๋™์ผํ•˜๋‹ค.
public boolean equals(Object obj) {
    return (this == obj);
}

 

๐Ÿ”ธ ๋™์ผ์„ฑ(Identity) vs ๋™๋“ฑ์„ฑ(Equality)

  • ๋™์ผ์„ฑ(Identity) : == ์—ฐ์‚ฐ์ž์ฒ˜๋Ÿผ ๋‘ ๊ฐ์ฒด๊ฐ€ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋Š”์ง€ ๋น„๊ต
  • ๋™๋“ฑ์„ฑ(Equality) : ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง„ ๊ฐ’์ด ๊ฐ™์€์ง€ ๋น„๊ต

→ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ’์ด ๊ฐ™๋‹ค๊ณ  ํŒ๋‹จ๋˜๋Š” ๊ฐ์ฒดํ•˜๋ฉด, equals()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์„œ ๋™๋“ฑ์„ฑ์„ ๊ธฐ์ค€์œผ๋กœ ๋น„๊ตํ•ด์•ผ ํ•œ๋‹ค.

 

โœ… String ํด๋ž˜์Šค์˜ equals() ์˜ค๋ฒ„๋ผ์ด๋”ฉ ์˜ˆ์‹œ

String s1 = new String("Test");
String s2 = new String("Test");

System.out.println(s1 == s2);        // false (๋‹ค๋ฅธ ๊ฐ์ฒด)
System.out.println(s1.equals(s2));   // true (๊ฐ’์ด ๊ฐ™์Œ)

String ํด๋ž˜์Šค๋Š” equals() ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์„œ, ๋‚ด๋ถ€ ๋ฌธ์ž ๋ฐฐ์—ด์˜ ๊ฐ’์ด ๊ฐ™์€์ง€๋ฅผ ๋น„๊ตํ•˜๋„๋ก ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค.

public boolean equals(Object anObject) {
    if (this == anObject) return true;
    if (anObject instanceof String) {
        String anotherString = (String) anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char[] v1 = value;
            char[] v2 = anotherString.value;
            for (int i = 0; i < n; i++) {
                if (v1[i] != v2[i]) return false;
            }
            return true;
        }
    }
    return false;
}

 

๐Ÿ”น hashCode()

hashCode() ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด์˜ ํ•ด์‹œ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜(int)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ด ๊ฐ’์€ ํ•ด์‹œ ๊ธฐ๋ฐ˜ ์ปฌ๋ ‰์…˜(HashMap, HashSet ๋“ฑ)์—์„œ ๊ฐ์ฒด์˜ ์ €์žฅ ์œ„์น˜๋ฅผ ๊ฒฐ์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

 

โœ… ๊ธฐ๋ณธ ๊ตฌํ˜„

Object ํด๋ž˜์Šค์˜ hashCode()๋Š” ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด์‹œ๊ฐ’์„ ์ƒ์„ฑํ•œ๋‹ค.

๋‹ค๋งŒ, ์ด ๋ฐฉ์‹์€ JVM ๊ตฌํ˜„์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค.

public native int hashCode();

์—ฌ๊ธฐ์„œ native ํ‚ค์›Œ๋“œ๋Š” ์ด ๋ฉ”์„œ๋“œ๊ฐ€ Java๊ฐ€ ์•„๋‹Œ C/C++ ๊ฐ™์€ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋˜์—ˆ๊ณ ,

JNI(Java Native Interface)๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœ๋œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

→ ์ผ๋ฐ˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด ๋ฉ”์„œ๋“œ์˜ ๋‚ด๋ถ€๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ง์ ‘ ๊ตฌํ˜„ํ•  ์ˆ˜๋Š” ์—†๋‹ค.

 

๐Ÿ”ธ hashCode() ์—ญํ• 

  • HashMap, HashSet, Hashtable ๋“ฑ ํ•ด์‹œ ๊ธฐ๋ฐ˜ ์ž๋ฃŒ๊ตฌ์กฐ์—์„œ ์‚ฌ์šฉ๋จ
  • ๊ฐ์ฒด์˜ ์ €์žฅ ์œ„์น˜๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ ํ™œ์šฉ๋จ
  • ๋น ๋ฅธ ๊ฒ€์ƒ‰, ์‚ฝ์ž…, ์‚ญ์ œ๋ฅผ ์œ„ํ•œ ํ•„์ˆ˜์ ์ธ ๋ฉ”์„œ๋“œ

 

๐Ÿ”ธ equals()์™€ hashCode()์˜ ๊ด€๊ณ„

equals()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•  ๊ฒฝ์šฐ, ๋ฐ˜๋“œ์‹œ hashCode()๋„ ํ•จ๊ป˜ ์˜ค๋ฒ„๋ผ์ด๋“œํ•ด์•ผ ํ•œ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ฐ™์€ ๊ฐ์ฒด๋ผ๋„ ํ•ด์‹œ ๊ธฐ๋‹จ ์ปฌ๋ ‰์…˜์—์„œ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ์ธ์‹๋  ์ˆ˜ ์žˆ๋‹ค.

 

 

๐Ÿ”ธ ๋‘ ๋ฉ”์„œ๋“œ์˜ ํ•„์ˆ˜ ๊ทœ์น™

  • ๊ฐ™์€ ๊ฐ์ฒด๋Š” ํ•ญ์ƒ ๊ฐ™์€ hashCode๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.
    • obj1.equals(obj2) == true๋ผ๋ฉด, ๋ฐ˜๋“œ์‹œ obj1.hashCode() == obj2.hashCode()์—ฌ์•ผ ํ•œ๋‹ค.
  • ํ•˜์ง€๋งŒ ๊ทธ ๋ฐ˜๋Œ€๋Š” ์„ฑ๋ฆฝํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ์ฆ‰, obj1.hashCode() == obj2.hashCode()๋ผ๊ณ  ํ•ด์„œ equals() ๊ฒฐ๊ณผ๊ฐ€ true์ธ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
    • ์ด๊ฒƒ์„ ํ•ด์‹œ ์ถฉ๋Œ์ด๋ผ ํ•˜๋ฉฐ, ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ตœ๋Œ€ํ•œ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
  • ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ, ๊ฐ™์€ ๊ฐ์ฒด์— ๋Œ€ํ•ด ํ•ญ์ƒ ๋™์ผํ•œ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.
    • ๋‹จ, Object์˜ ๊ธฐ๋ณธ ๊ตฌํ˜„์€ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ๋‹ฌ๋ผ์งˆ ์ˆ˜๋„ ์žˆ๋‹ค.

 

๐Ÿ”น equals()์™€ hashCode()์˜ Override

๐Ÿ”ธ equals() Override์˜ ํ•„์š”์„ฑ

์•„๋ž˜์™€ ๊ฐ™์€ Employee ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

public class Employee {
    private Integer id;
    private String firstname;
    private String lastName;
    private String department;
}

์ด ํด๋ž˜์Šค์—์„œ id๋Š”๊ณ ์œ  ์‹๋ณ„์ž๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
์ฆ‰, id ๊ฐ’์ด ๊ฐ™์œผ๋ฉด ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ฐ™์€ ๊ฐ์ฒด๋กœ ๊ฐ„์ฃผ๋˜์–ด์•ผ ํ•œ๋‹ค.
ํ•˜์ง€๋งŒ equals()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ Object ํด๋ž˜์Šค์˜ equals()๋ฅผ ๋”ฐ๋ฅด๊ฒŒ ๋˜๋ฉฐ, ์ด๋Š” ์ฐธ์กฐ(๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ)๋ฅผ ๋น„๊ตํ•˜๊ฒŒ ๋œ๋‹ค. 

Employee e1 = new Employee();
Employee e2 = new Employee();

e1.setId(100);
e2.setId(100);

System.out.println(e1.equals(e2));  // false (equals() ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์ง€ ์•Š์Œ)

โœ… equals() ์˜ค๋ฒ„๋ผ์ด๋”ฉ ์˜ˆ์‹œ

@Override
public boolean equals(Object o) {
    if (o == null) return false;
    if (this == o) return true;
    if (getClass() != o.getClass()) return false;

    Employee e = (Employee) o;
    return this.id != null && this.id.equals(e.getId());
}
  • == ๋Œ€์‹  .equals()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Integer ๊ฐ’ ๋น„๊ต
  • null ์ฒดํฌ ๋ฐ ํด๋ž˜์Šค ํƒ€์ž… ์ฒดํฌ๋กœ ์•ˆ์ •์„ฑ ํ–ฅ์ƒ

 

๐Ÿ“ equals()๋งŒ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ–ˆ์„ ๋•Œ์˜ ๋ฌธ์ œ์ 

equals()๋งŒ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๊ณ  hashCode()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์ง€ ์•Š์œผ๋ฉด, HashSet, HashMap ๊ฐ™์€ ํ•ด์‹œ ๊ธฐ๋ฐ˜ ์ปฌ๋ ‰์…˜์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ฐ™์€ ๊ฐ์ฒด๋ผ๋„ ์„œ๋„ ๋‹ค๋ฅธ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ™์€ ๊ฐ์ฒด๋กœ ์ธ์‹๋˜์ง€ ์•Š๊ณ  ์ค‘๋ณต ์ €์žฅ๋  ์ˆ˜ ์žˆ๋‹ค.

Set<Employee> set = new HashSet<>();
set.add(e1);
set.add(e2);

System.out.println(set.size());  // 2 (๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ฐ™์ง€๋งŒ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ์ธ์‹๋จ)

โœ… ๋”ฐ๋ผ์„œ equals()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๋ฉด ๋ฐ˜๋“œ์‹œ hashCode()๋„ ํ•จ๊ป˜ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์•ผ ํ•œ๋‹ค.

 

๐Ÿ”ธ hashCode() Override์˜ ํ•„์š”์„ฑ

์•ž์„œ ์„ค๋ช…ํ–ˆ๋“ฏ์ด HashTable, HashSet, HashMap ๊ฐ™์€ ํ•ด์‹œ ๊ธฐ๋ฐ˜ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•  ๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ hashCode() ๊ฐ’์„ ์ด์šฉํ•ด ์ €์žฅ ์œ„์น˜๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด equals()๋งŒ ์˜ค๋ฒ„๋ผ์ด๋“œํ•œ Employee ํด๋ž˜์Šค๋ฅผ HashSet์— ์ €์žฅํ•˜๋ฉด ์–ด๋–ค ์ผ์ด ์ƒ๊ธธ๊นŒ ?

import java.util.HashSet;
import java.util.Set;

public class EqualsTest {
    public static void main(String[] args) {
        Employee e1 = new Employee();
        Employee e2 = new Employee();

        e1.setId(100);
        e2.setId(100);

        // equals()๊ฐ€ ์˜ค๋ฒ„๋ผ์ด๋”ฉ๋˜์–ด ์žˆ๋‹ค๋ฉด true ์ถœ๋ ฅ๋จ
        System.out.println(e1.equals(e2)); // true

        Set<Employee> employees = new HashSet<>();
        employees.add(e1);
        employees.add(e2);

        // equals()๋Š” true์ง€๋งŒ hashCode()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์ง€ ์•Š์œผ๋ฉด,
        // ๋‘ ๊ฐ์ฒด์˜ ํ•ด์‹œ๊ฐ’์ด ๋‹ฌ๋ผ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ํŒ๋‹จ๋˜์–ด ๋‘˜ ๋‹ค ์ €์žฅ๋จ
        System.out.println(employees); // [e1, e2] — ๋‘ ๊ฐ์ฒด๊ฐ€ ๋ชจ๋‘ ์ถœ๋ ฅ๋จ
    }
}

์œ„ ์ฝ”๋“œ์—์„œ equals()๋Š” ์˜ค๋ฒ„๋ผ์ด๋”ฉ๋˜์–ด ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ฐ™์€ ๊ฐ์ฒด๋กœ ํŒ๋‹จ๋˜์ง€๋งŒ, hashCode()๋Š” ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— Object์˜ ๊ธฐ๋ณธ ๊ตฌํ˜„์ด ์‚ฌ์šฉ๋œ๋‹ค.

์ฆ‰, ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋กœ ๋‹ค๋ฅธ ํ•ด์‹œ๊ฐ’์ด ์ƒ์„ฑ๋˜๋ฏ€๋กœ HashSet์€ ๋‘ ๊ฐ์ฒด๋ฅผ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ์ธ์‹ํ•˜๊ณ  ๋ชจ๋‘ ์ €์žฅํ•˜๊ฒŒ ๋œ๋‹ค.

 

โœ… hashCode() ์˜ค๋ฒ„๋ผ์ด๋”ฉ ์˜ˆ์‹œ

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด hashCode()๋„ ์•„๋ž˜์ฒ˜๋Ÿผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์ค˜์•ผ ํ•œ๋‹ค.

@Override
public int hashCode() {
    final int PRIME = 31;
    int result = 1;
    result = PRIME * result + (id != null ? id.hashCode() : 0);
    return result;
}
  • id๊ฐ€ null์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ null ์ฒดํฌ ํฌํ•จ
  • Integer๋Š” ๊ฐ์ฒด์ด๋ฏ€๋กœ hashCode() ํ˜ธ์ถœ ๊ฐ€๋Šฅ
  • PRIME ์ƒ์ˆ˜ ๊ณฑ์…ˆ์€ ํ•ด์‹œ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์„ ์ค„์ด๊ธฐ ์œ„ํ•œ ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด

 

โœ… ๊ฒฐ๊ณผ

์ด์ œ equals()์™€ hashCode()๋ฅผ ๋ชจ๋‘ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋™์ผํ•œ id๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋Š” HashSet์—์„œ๋„ ์ค‘๋ณต ์—†์ด ํ•œ ๋ฒˆ๋งŒ ์ €์žฅ๋œ๋‹ค.

System.out.println(employees);  // ์ด์ œ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋งŒ ์ถœ๋ ฅ๋จ

 

๐Ÿ”น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ Override

Apache Commons Lang ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด HashCodeBuilder์™€ EqualsBuilder๋ฅผ ํ†ตํ•ด hashCode()์™€ equals() ๋ฉ”์„œ๋“œ๋ฅผ ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•  ์ˆ˜ ์žˆ๋‹ค

.

โœ… ์˜ˆ์‹œ ์ฝ”๋“œ : Apache Commons๋ฅผ ํ™œ์šฉํ•œ equals() & hashCode()

import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;

public class Employee {
    private Integer id;
    private String firstname;
    private String lastName;
    private String department;

    // Getter & Setter ์ƒ๋žต

    @Override
    public int hashCode() {
        final int PRIME = 31;
        // ์ง์ˆ˜ ID์˜ ๊ฒฝ์šฐ ID+1์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด์‹œ ์ถฉ๋Œ ๋ฐฉ์ง€
        return new HashCodeBuilder(getId() % 2 == 0 ? getId() + 1 : getId(), PRIME)
                   .toHashCode();
    }

    @Override
    public boolean equals(Object o) {
        if (o == null) return false;
        if (this == o) return true;
        if (getClass() != o.getClass()) return false;

        Employee e = (Employee) o;

        // id๊ฐ€ ๊ฐ™์œผ๋ฉด ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋™์ผํ•œ ๊ฐ์ฒด๋กœ ํŒ๋‹จ
        return new EqualsBuilder()
                   .append(getId(), e.getId())
                   .isEquals();
    }
}

 

๐Ÿ”ธ equals() & hashCode() Override ์‹œ ์ฃผ์˜์‚ฌํ•ญ

  • ๋‘ ๋ฉ”์„œ๋“œ๋Š” ํ•ญ์ƒ ํ•จ๊ป˜ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์•ผ ํ•œ๋‹ค.
  • ๊ฐ™์€ ์†์„ฑ(id ๋“ฑ)์„ ๊ธฐ์ค€์œผ๋กœ ๋‘ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ์ผ๊ด€์„ฑ์ด ์œ ์ง€๋œ๋‹ค.
  • equals() ๊ฒฐ๊ณผ๊ฐ€ true์ด๋ฉด, hashCode()๋„ ๋ฐ˜๋“œ์‹œ ๊ฐ™์•„์•ผ ํ•œ๋‹ค.
  • ๊ฐ์ฒด๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด equals()์™€ hashCode() ๊ฒฐ๊ณผ๋„ ๋ณ€ํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.

 

๐Ÿ”ธ ORM ์‚ฌ์šฉ ์‹œ Getter ์‚ฌ์šฉ ๊ถŒ์žฅ

  • JPA ๊ฐ™์€ ORM ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์—”ํ‹ฐํ‹ฐ์˜ ํ•„๋“œ๋Š” Lazy Loading๋  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด๋•Œ ํ•„๋“œ๋ฅผ ์ง์ ‘ ์ ‘๊ทผํ•˜๋ฉด ๊ฐ’์ด ์•„์ง ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•„ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋™์ž‘์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ๋น„๊ต๋‚˜ ํ•ด์‹œ์ฝ”๋“œ ์ƒ์„ฑ ์‹œ์—๋Š” ์ง์ ‘ ์ ‘๊ทผ ๋Œ€์‹  getter ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ์ด ๊ถŒ์žฅ๋œ๋‹ค.
   ์‚ฌ์šฉ๋ฐฉ์‹    ์•ˆ์ „ ์—ฌ๋ถ€    ์„ค๋ช…
   this.id    โŒ ์œ„ํ—˜    ๊ฐ’์ด ๋กœ๋”ฉ๋˜์ง€ ์•Š์•„ null์ผ ์ˆ˜ ์žˆ์Œ
   this.getId()    โœ… ์•ˆ์ „    ํ˜ธ์ถœ ์‹œ ORM์ด ๊ฐ’์„ ๋กœ๋”ฉํ•จ

 

 

 

 

 

๐Ÿ“ƒ reference