λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

빈 ꡬ멍 μ±„μš°κΈ°

[Java] 객체의 ν•΄μ‹œ μ½”λ“œλž€ 무엇인가

좜처

ChatGPT

Gemini


객체의 ν•΄μ‹œ μ½”λ“œ(Hash Code)λŠ” 객체λ₯Ό μ‹λ³„ν•˜κΈ° μœ„ν•œ μ •μˆ˜ 값이닀. 이 값은 객체의 λ©”λͺ¨λ¦¬ μ£Όμ†Œλ‚˜ 객체의 μƒνƒœμ— κΈ°λ°˜ν•˜μ—¬ μƒμ„±λœλ‹€. ν•΄μ‹œ μ½”λ“œλŠ” 객체λ₯Ό 효율적으둜 λΉ„κ΅ν•˜κ±°λ‚˜ μ €μž₯ν•  수 μžˆλ„λ‘ 도와주며, 특히 ν•΄μ‹œ 기반 데이터 κ΅¬μ‘°μ—μ„œ μ€‘μš”ν•˜λ‹€.

 

ν•΄μ‹œ μ½”λ“œμ˜ μ€‘μš”μ„±

ν•΄μ‹œ 기반 데이터 κ΅¬μ‘°μ—μ„œ μ‚¬μš©

  • ν•΄μ‹œ 맡(HashMap), ν•΄μ‹œ 집합(HashSet), ν•΄μ‹œ ν…Œμ΄λΈ”(Hashtable)κ³Ό 같은 자료 κ΅¬μ‘°λŠ” 객체의 ν•΄μ‹œ μ½”λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό λΉ λ₯΄κ²Œ κ²€μƒ‰ν•˜κ±°λ‚˜ μ €μž₯ν•œλ‹€.
  • ν•΄μ‹œ μ½”λ“œκ°€ λ™μΌν•œ κ°μ²΄λŠ” 같은 버킷(bucket)에 μ €μž₯λ˜κ±°λ‚˜ 같은 μœ„μΉ˜μ—μ„œ κ²€μƒ‰λœλ‹€.

객체의 동등성 비ꡐ

  • ν•΄μ‹œ μ½”λ“œλŠ” 객체의 동등성을 비ꡐ할 λ•Œ μ€‘μš”ν•œ 역할을 ν•œλ‹€. 두 객체가 κ°™λ‹€λ©΄, 두 객체의 ν•΄μ‹œ μ½”λ“œλŠ” λ°˜λ“œμ‹œ κ°™μ•„μ•Ό ν•œλ‹€. ν•˜μ§€λ§Œ ν•΄μ‹œ μ½”λ“œκ°€ κ°™λ‹€κ³  ν•΄μ„œ 두 객체가 λ™μΌν•˜λ‹€λŠ” 보μž₯은 μ—†λ‹€. ν•΄μ‹œ 좩돌이 λ°œμƒν•  수 있기 λ•Œλ¬Έμ΄λ‹€.

 

ν•΄μ‹œ μ½”λ“œμ˜ 생성

hashCode() λ©”μ„œλ“œ

  • μžλ°”μ˜ λͺ¨λ“  κ°μ²΄λŠ” Object ν΄λž˜μŠ€μ—μ„œ 상속받은 hashCode() λ©”μ„œλ“œλ₯Ό 가지고 μžˆλ‹€. 이 λ©”μ„œλ“œλŠ” 객체의 ν•΄μ‹œ μ½”λ“œλ₯Ό λ°˜ν™˜ν•œλ‹€.
  • hashCode() λ©”μ„œλ“œλŠ” 객체의 λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό 기반으둜 ν•΄μ‹œ μ½”λ“œλ₯Ό μƒμ„±ν•˜μ§€λ§Œ, ν΄λž˜μŠ€μ—μ„œ 이 λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ“œν•˜μ—¬ 객체의 μƒνƒœμ— κΈ°λ°˜ν•œ ν•΄μ‹œ μ½”λ“œλ₯Ό 생성할 μˆ˜λ„ μžˆλ‹€.

예제 μ½”λ“œ

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age); // μžλ°” 7 μ΄μƒμ—μ„œ μ œκ³΅ν•˜λŠ” μœ ν‹Έλ¦¬ν‹° λ©”μ„œλ“œ
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Person person = (Person) obj;
        return age == person.age && Objects.equals(name, person.name);
    }
}

 

  • μœ„ μ½”λ“œμ—μ„œ hashCode() λ©”μ„œλ“œλŠ” nameκ³Ό ageλ₯Ό 기반으둜 ν•΄μ‹œ μ½”λ“œλ₯Ό μƒμ„±ν•œλ‹€. 이 ν•΄μ‹œ μ½”λ“œλŠ” Objects.hash() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μƒμ„±λœλ‹€.
더보기

좜처 : https://docs.oracle.com/javase/7/docs/api/java/util/Objects.html#hash(java.lang.Object...)

 

java.lang.Objects

public final class Objects extends Object

 

This class consists of static utility methods for operating on objects. These utilities include null-safe or null-tolerant methods for computing the hash code of an object, returning a string for an object, and comparing two objects.

 

이 ν΄λž˜μŠ€λŠ” 객체 μž‘μ—…μ„ μœ„ν•œ 정적 μœ ν‹Έλ¦¬ν‹° λ©”μ†Œλ“œλ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€. μ΄λŸ¬ν•œ μœ ν‹Έλ¦¬ν‹°μ—λŠ” 객체의 ν•΄μ‹œ μ½”λ“œλ₯Ό κ³„μ‚°ν•˜κ³ , 객체에 λŒ€ν•œ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜κ³ , 두 객체λ₯Ό λΉ„κ΅ν•˜κΈ° μœ„ν•œ null μ•ˆμ „ λ˜λŠ” null ν—ˆμš© λ©”μ„œλ“œκ°€ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

 

public static int hash(Object... values)
 
Generates a hash code for a sequence of input values. The hash code is generated as if all the input values were placed into an array, and that array were hashed by calling Arrays.hashCode(Object[]).
 
μž…λ ₯ κ°’ μ‹œν€€μŠ€μ— λŒ€ν•œ ν•΄μ‹œ μ½”λ“œλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. ν•΄μ‹œ μ½”λ“œλŠ” λͺ¨λ“  μž…λ ₯ 값이 배열에 배치되고 ν•΄λ‹Ή 배열이 Arrays.hashCode(Object[])λ₯Ό ν˜ΈμΆœν•˜μ—¬ ν•΄μ‹œλœ κ²ƒμ²˜λŸΌ μƒμ„±λ©λ‹ˆλ‹€.
 

 

This method is useful for implementing Object.hashCode() on objects containing multiple fields. For example, if an object that has three fields, x, y, and z, one could write:

 

이 λ©”μ„œλ“œλŠ” μ—¬λŸ¬ ν•„λ“œκ°€ ν¬ν•¨λœ κ°œμ²΄μ— Object.hashCode()λ₯Ό κ΅¬ν˜„ν•˜λŠ” 데 μœ μš©ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ 객체에 x, y, zλΌλŠ” μ„Έ 개의 ν•„λ“œκ°€ μžˆλŠ” 경우 λ‹€μŒκ³Ό 같이 μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

 @Override public int hashCode() {
     return Objects.hash(x, y, z);
 }

 

Warning: When a single object reference is supplied, the returned value does not equal the hash code of that object reference. This value can be computed by calling hashCode(Object).

 

κ²½κ³ : 단일 개체 μ°Έμ‘°κ°€ 제곡되면 λ°˜ν™˜λœ 값은 ν•΄λ‹Ή 개체 참쑰의 ν•΄μ‹œ μ½”λ“œμ™€ λ™μΌν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ΄ 값은 hashCode(Object)λ₯Ό ν˜ΈμΆœν•˜μ—¬ 계산할 수 μžˆμŠ΅λ‹ˆλ‹€.

  • equals() λ©”μ„œλ“œλŠ” 객체의 동등성을 λΉ„κ΅ν•˜λŠ” λ©”μ„œλ“œλ‘œ, ν•΄μ‹œ μ½”λ“œμ™€ μΌμΉ˜ν•˜λŠ” κ²½μš°μ—λ§Œ 두 객체가 κ°™λ‹€κ³  νŒλ‹¨ν•  수 μžˆλ‹€.

 

ν•΄μ‹œ μ½”λ“œμ˜ κ·œμΉ™

동일 객체의 ν•΄μ‹œ μ½”λ“œ : 일관성

ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ λ™μ•ˆ λ™μΌν•œ κ°μ²΄λŠ” 항상 λ™μΌν•œ ν•΄μ‹œ μ½”λ“œλ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€.

동일 κ°μ²΄λŠ” κ°™μ•„μ•Ό ν•œλ‹€ : κ³ μœ μ„±

hashCode()κ°€ 같은 두 κ°μ²΄λŠ” equals() λ©”μ„œλ“œλ₯Ό 톡해 μ„œλ‘œ 동일해야 ν•œλ‹€.

ν•΄μ‹œ 좩돌

ν•΄μ‹œ μΆ©λŒμ€ 두 객체가 λ‹€λ₯Έ κ²½μš°μ—λ„ ν•΄μ‹œ μ½”λ“œκ°€ 동일할 수 μžˆμŒμ„ μ˜λ―Έν•œλ‹€. 이λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ ν•΄μ‹œ 기반 데이터 κ΅¬μ‘°λŠ” μΆ©λŒμ„ 관리할 수 μžˆλŠ” μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•œλ‹€.

 

ν•΄μ‹œ μ½”λ“œ 계산 방법

Object 클래슀의 hashCode() λ©”μ†Œλ“œ

λͺ¨λ“  κ°μ²΄λŠ” Object 클래슀λ₯Ό μƒμ†λ°›μœΌλ―€λ‘œ hashCode() λ©”μ†Œλ“œλ₯Ό 가지고 μžˆλ‹€. 일반적으둜 객체의 λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό 기반으둜 ν•΄μ‹œ μ½”λ“œλ₯Ό κ³„μ‚°ν•œλ‹€.

ν΄λž˜μŠ€λ³„ μž¬μ •μ˜

ν΄λž˜μŠ€μ—μ„œ hashCode() λ©”μ†Œλ“œλ₯Ό μž¬μ •μ˜ν•˜μ—¬ 객체의 νŠΉμ • ν•„λ“œ 값을 기반으둜 ν•΄μ‹œ μ½”λ“œλ₯Ό 계산할 수 μžˆλ‹€. 이 경우 equals() λ©”μ†Œλ“œμ™€ ν•¨κ»˜ μž¬μ •μ˜ν•˜μ—¬ 일관성을 μœ μ§€ν•΄μ•Ό ν•œλ‹€.

 

ν•΄μ‹œ μ½”λ“œμ™€ equals() λ©”μ†Œλ“œμ˜ 관계

일관성

λ§Œμ•½ 두 객체가 equals() λ©”μ†Œλ“œλ₯Ό 톡해 κ°™λ‹€κ³  νŒλ‹¨λœλ‹€λ©΄, ν•΄λ‹Ή κ°μ²΄λ“€μ˜ ν•΄μ‹œ μ½”λ“œλ„ λ°˜λ“œμ‹œ κ°™μ•„μ•Ό ν•œλ‹€.

역은 μ„±λ¦½ν•˜μ§€ μ•ŠμŒ

ν•΄μ‹œ μ½”λ“œκ°€ κ°™λ‹€κ³  ν•΄μ„œ λ°˜λ“œμ‹œ 두 객체가 같은 것은 μ•„λ‹ˆλ‹€. (ν•΄μ‹œ 좩돌 λ°œμƒ)

 


 

ChatGPT의 좜처

참고 자료

  • Oracle Java Documentation - Object.hashCode() Method
  • Effective Java by Joshua Bloch - 이 책은 객체의 ν•΄μ‹œ μ½”λ“œμ™€ 동등성 비ꡐ에 κ΄€ν•œ μ€‘μš”ν•œ 정보λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

 

Gemini의 좜처

https://rensverhage.medium.com/java-lombok-a-tale-of-two-islands-5718e75feadd

 

Java & Lombok, a tale of two islands

This is the first in a two-part series on spicing up Java with Lombok.

rensverhage.medium.com

https://github.com/Aishwaryamudalagi/TY_CG_HTD_BangloreNovember_JFS_AishwaryaFS

 

GitHub - Aishwaryamudalagi/TY_CG_HTD_BangloreNovember_JFS_AishwaryaFS

Contribute to Aishwaryamudalagi/TY_CG_HTD_BangloreNovember_JFS_AishwaryaFS development by creating an account on GitHub.

github.com