πŸ‘©πŸ»‍πŸ’» Developer/JAVA

[Java] hashCode()와 equals()λž€?

Junyung 2024. 3. 31. 11:49

Javaλ₯Ό κ³΅λΆ€ν•˜λ‹€λ³΄λ©΄, ν”„λ‘œκ·Έλž˜λ° μ‹œ 'hashCode()' 와 'equals()' λ©”μ†Œλ“œμ— λŒ€ν•΄ 많이 μ ‘ν•˜κ²Œ λœλ‹€. 

이 λ©”μ†Œλ“œλ“€μ€ 객체의 동등성 비ꡐ와 ν•΄μ‹œ λ§΅(HashMap) λ“±μ˜ 자료 κ΅¬μ‘°μ—μ„œ 효율적인 검색을 μœ„ν•΄ μ‚¬μš©λ˜λŠ” μ€‘μš”ν•œ λ©”μ†Œλ“œμ΄λ‹€.

 

이번 κΈ€μ—μ„œλŠ” hashCode()와 equals() λ©”μ†Œλ“œμ— λŒ€ν•΄ μžμ„Έν•˜κ²Œ 정리해보렀고 ν•œλ‹€. 

 

hashCode() Method

hashCode() λ©”μ†Œλ“œλŠ” 객체의 ν•΄μ‹œμ½”λ“œλ₯Ό λ°˜ν™˜ν•˜λŠ” λ©”μ†Œλ“œμ΄λ‹€. 

λ¨Όμ €, ν•΄μ‹œμ½”λ“œλž€ 데이터λ₯Ό λΉ λ₯΄κ²Œ μ €μž₯ν•˜κ³  κ²€μƒ‰ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” μž„μ˜μ˜ 길이의 κ³ μ •λœ 크기의 값이닀.

μ΄λŠ” hashCode() λ©”μ†Œλ“œλ₯Ό 톡해 객체의 ν•΄μ‹œμ½”λ“œλ₯Ό 얻을 수 μžˆλ‹€.

일반적으둜 hashCode() λ©”μ†Œλ“œλŠ” 객체의 ν•„λ“œλ₯Ό 기반으둜 ν•΄μ‹œ μ½”λ“œλ₯Ό μƒμ„±ν•˜λ©°, μ£Όμš” λͺ©μ μ€ λΉ λ₯Έ 검색을 μœ„ν•΄ 객체λ₯Ό ν•΄μ‹œλ‘œ λ§€ν•‘ν•˜λŠ” 것, 즉 이λ₯Ό 톡해 객체의 동등성 비ꡐ와 ν•΄μ‹œκΈ°λ°˜ 자료 κ΅¬μ‘°μ—μ„œμ˜ 효율적인 검색이 κ°€λŠ₯ν•˜λ„λ‘ ν•œλ‹€.

 

[νŠΉμ§•]

- λ™μΌν•œ 객체에 λŒ€ν•΄ μ—¬λŸ¬ 번 ν˜ΈμΆœλ˜λ”λΌλ„ 항상 같은 μ •μˆ˜λ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€. 

- μ„œλ‘œ λ‹€λ₯Έ 객체라면 ν•΄μ‹œ 좩돌이 λ°œμƒν•˜μ§€ μ•Šλ„λ‘ λ‹€λ₯Έ ν•΄μ‹œ μ½”λ“œλ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€. 

 

equals() Method

equals() λ©”μ†Œλ“œλŠ” 두 객체가 λ…Όλ¦¬μ μœΌλ‘œ 같은지λ₯Ό ν™•μΈν•˜λŠ” λ©”μ†Œλ“œμ΄λ‹€. 

즉, 객체의 동등성 비ꡐ에 자주 μ‚¬μš©λ˜λŠ” λ©”μ†Œλ“œμ΄λ‹€. 

 

[νŠΉμ§•]

- 두 객체가 κ°™λ‹€λ©΄ (λ‚΄μš©μ΄ λ™μΌν•˜κ±°λ‚˜, 같은 개체λ₯Ό μ°Έμ‘°ν•˜λŠ” 경우) : equals() λ©”μ†Œλ“œλŠ” 'true'λ₯Ό λ°˜ν™˜ν•œλ‹€. 

- equals() λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”© ν•  λ•ŒλŠ” λ°˜λ“œμ‹œ 'hashCode()' λ©”μ†Œλ“œλ„ ν•¨κ»˜ μ˜€λ²„λΌμ΄λ”© ν•΄μ•Ό ν•œλ‹€. 

- λŒ€μΉ­μ„±, 좔이성, 일관성, null μ—¬λΆ€ λ“± 'equals()'λ©”μ†Œλ“œμ˜ 일반적인 κ·œμ•½μ„ 따라야 ν•œλ‹€.

**μ˜€λ²„λΌμ΄λ”© μ •μ˜**
μ˜€λ²„λΌμ΄λ”©(Overriding)은 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ 상속관계에 μžˆλŠ” ν΄λž˜μŠ€λ“€ 간에 λ°œμƒν•˜λŠ” κ°œλ…μ΄λ‹€. 
λ©”μ†Œλ“œ μ˜€λ²„λΌμ΄λ”©μ€ ν•˜μœ„ν΄λž˜μŠ€ κ°€ μƒμœ„ν΄λž˜μŠ€λ‘œλΆ€ν„° 상솑받은 λ©”μ†Œλ“œλ₯Ό μž¬μ •μ˜ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€.

 

hashCode() 와 equals() μ‚¬μš©

import java.util.Objects; 

public class Book {
	private String title;
    private String author;
    private int year;
    
    public Book(String title, String author, int year) {
    	this.title = title;
        this.author = author;
        this.year = year;
    }
    
    //hashCode()λ©”μ†Œλ“œ κ΅¬ν˜„
    @Override
    public int hashCode() {
    	int result = 17;
        result = 31 * result + Objects.hash(title, author, year);
        return result;
    }
    
    //equals() λ©”μ†Œλ“œ κ΅¬ν˜„
    @Override
    public boolean equals(Object obj) {
    	if (this == obj)
        	return true;
        if (obj == null || getClass() != obj.getClass())
        	return false;
        Book book = (Book) obj;
        return year == book.year &&
        			Objects.equals(title, book.title) &&
                    Objects.equals(author, book.author);
   }
   //Getters and Setters
}

λ”°λΌμ„œ 제λͺ©, μ €μž, μΆœνŒλ…„λ„ ν•„λ“œλ₯Ό 기반으둜 hashCode() λ©”μ†Œλ“œλ₯Ό 톡해 ν•΄μ‹œμ½”λ“œλ₯Ό μƒμ„±ν•˜κ³ , equals() λ©”μ†Œλ“œλ₯Ό 톡해 두 객체가 λ™μΌν•œμ§€ μ—¬λΆ€λ₯Ό 비ꡐ할 수 μžˆλ‹€.

 

  • hashCode() λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•  λ•ŒλŠ” 객체의 ν•„λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ ν•΄μ‹œ μ½”λ“œλ₯Ό μƒμ„±ν•˜λŠ” 것이 μΌλ°˜μ μ΄λ‹€. 
    μ΄λ•Œ, ν•΄μ‹œ 좩돌이 일어날 수 있기 λ•Œλ¬Έμ— 이 μΆ©λŒμ„ μ΅œμ†Œν™”ν•˜κΈ° μœ„ν•΄ 잘 μ„€κ³„λœ ν•΄μ‹œ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. 
  • equals() λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•  λ•ŒλŠ” 두 객체가 λ™λ“±ν•œμ§€λ₯Ό νŒλ‹¨ν•˜λŠ” λ‘œμ§μ„ μž‘μ„±ν•΄μ•Ό ν•œλ‹€. 
    보톡 객체의 각 ν•„λ“œλ₯Ό λΉ„κ΅ν•˜μ—¬ λ™μΌν•œμ§€ μ—¬λΆ€λ₯Ό κ²°μ •ν•˜κ²Œ λœλ‹€.
정리 
즉, hashCode() 와 equals() λ©”μ†Œλ“œλ₯Ό μ œλŒ€λ‘œ κ΅¬ν˜„ν•˜κ³  μ΄ν•΄ν•˜λŠ” 것은 Java의 핡심 κ°œλ…μΈ 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ„ μ΄ν•΄ν•˜λŠ”λ° μžˆμ–΄ 핡심적인 뢀뢄이닀. 객체의 동일성과 동등성을 μ˜¬λ°”λ₯΄κ²Œ 닀루기 μœ„ν•΄ 이 두 λ©”μ†Œλ“œμ— λŒ€ν•œ 이해λ₯Ό ν™•μ‹€νžˆ ν•  ν•„μš”κ°€ μžˆλ‹€.