• ABOUT
  • PORTFOLIO
  • POSTS
  • GUESTBOOK

ยฉ 2025-2026 BlueCool12 All rights reserved.

2025.10.26Java

๐Ÿ”— ์ž๋ฐ”์˜ ๊ฐ์ฒด ๋น„๊ต - equals()์™€ hashCode()๋ฅผ ํ•จ๊ป˜ ์žฌ์ •์˜ํ•ด์•ผ ํ•˜๋Š” ์ด์œ 

1. equals() 

์ž๋ฐ”์˜ equals() ๋ฉ”์„œ๋“œ๋Š” ๋‘ ๊ฐ์ฒด๊ฐ€ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ฐ™์€์ง€ ๋น„๊ตํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค. ์ด๋•Œ โ€œ๊ฐ™๋‹คโ€์˜ ๊ธฐ์ค€์€ ๋‹จ์ˆœํžˆ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š”์ง€๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๊ฐ’์ด ๋™์ผํ•œ์ง€(๋…ผ๋ฆฌ์  ๋™๋“ฑ์„ฑ)๋ฅผ ์˜๋ฏธํ•œ๋‹ค. 

String a = new String("BlueCool");
String b = new String("BlueCool");

System.out.println(a == b); // false (์ฐธ์กฐ๊ฐ’์ด ๋‹ค๋ฆ„)
System.out.println(a.equals(b)); // true (๋ฌธ์ž์—ด์ด ๊ฐ™์Œ)

์œ„ ์˜ˆ์‹œ์—์„œ == ์—ฐ์‚ฐ์ž๋Š” ๋‘ ๊ฐ์ฒด๊ฐ€ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ(์ฐธ์กฐ)๋ฅผ ๊ฐ€์ง€๋Š”์ง€๋ฅผ ๋น„๊ตํ•œ๋‹ค. ๋”ฐ๋ผ์„œ new ํ‚ค์›Œ๋“œ๋กœ ๊ฐ๊ฐ ์ƒ์„ฑํ•œ String ๊ฐ์ฒด๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ์กด์žฌํ•˜๋ฏ€๋กœ ๋‚ด์šฉ์ด ๊ฐ™๋”๋ผ๋„ false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. 

๊ทธ๋Ÿฌ๋‚˜ String ํด๋ž˜์Šค๋Š” ์ด๋ฏธ equals() ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์—ฌ ๋ฌธ์ž์—ด์˜ ๋‚ด์šฉ์ด ๊ฐ™์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์žฌ์ •์˜๋˜์–ด ์žˆ๋‹ค. 

public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
return (anObject instanceof String aString)
&& (!COMPACT_STRINGS || this.coder == aString.coder)
&& StringLatin1.equals(value, aString.value);
}

์ฆ‰ String ํด๋ž˜์Šค์—์„œ๋Š” ์ฐธ์กฐ ๋™์ผ์„ฑ(==) ๋Œ€์‹  ๋…ผ๋ฆฌ์  ๋™์ผ์„ฑ์„ ๊ธฐ์ค€์œผ๋กœ ๋™๋“ฑ์„ฑ์„ ํŒ๋‹จํ•œ๋‹ค. 

equals() ๋ฉ”์„œ๋“œ๋Š” ๋ชจ๋“  ํด๋ž˜์Šค์˜ ์ตœ์ƒ์œ„ ๋ถ€๋ชจ์ธ Object ํด๋ž˜์Šค์— ์ •์˜๋˜์–ด ์žˆ์œผ๋ฉฐ ๊ธฐ๋ณธ ๊ตฌํ˜„์€ ๋‹จ์ˆœํžˆ ์ฐธ์กฐ๊ฐ’์ด ๊ฐ™์€์ง€๋ฅผ ๋น„๊ตํ•œ๋‹ค. 

Object blue = new Object();
Object cool = new Object();

System.out.println(blue.equals(cool)); // false
System.out.println(blue == cool); // false

// ์‹ค์ œ Object ํด๋ž˜์Šค์˜ equals() ๊ธฐ๋ณธ ๊ตฌํ˜„
public boolean equals(Object obj) {
return (this == obj);
}

๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ •์˜ํ•œ ํด๋ž˜์Šค์—์„œ ๊ฐ์ฒด์˜ ๋…ผ๋ฆฌ์  ๋™๋“ฑ์„ฑ์„ ํŒ๋‹จํ•˜๋ ค๋ฉด ๋‹ค์Œ์˜ ๊ทœ์น™์„ ์ง€ํ‚ค๋ฉฐ equals() ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์•ผ ํ•œ๋‹ค. 

  • ๋ฐ˜์‚ฌ์„ฑ 
    x.equals(x)๋Š” ํ•ญ์ƒ true์—ฌ์•ผ ํ•œ๋‹ค.
  • ๋Œ€์นญ์„ฑ 
    x.equals(y)๊ฐ€ true๋ฉด y.equals(x)๋„ true์—ฌ์•ผ ํ•œ๋‹ค.
  • ์ถ”์ด์„ฑ 
    x.equals(y)์™€ y.equals(z)๊ฐ€ true๋ฉด x.equals(z)๋„ true์—ฌ์•ผ ํ•œ๋‹ค.
  • ์ผ๊ด€์„ฑ 
    ๋น„๊ต ๋Œ€์ƒ์ด ๋ณ€ํ•˜์ง€ ์•Š์œผ๋ฉด equals()์˜ ๊ฒฐ๊ณผ๋Š” ํ•ญ์ƒ ๋™์ผํ•ด์•ผ ํ•œ๋‹ค.
  • null ์•ˆ์ •์„ฑ 
    ์–ด๋–ค ๊ฐ์ฒด x์— ๋Œ€ํ•ด์„œ๋„ x.equals(null)์€ ํ•ญ์ƒ false๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.


2. hashCode() 

hashCode()๋Š” ๊ฐ์ฒด๋ฅผ ์ˆซ์ž๋กœ ํ‘œํ˜„ํ•œ ํ•ด์‹œ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค. ์ด ๊ฐ’์€ HashMap, HashSet๊ณผ ๊ฐ™์€ ํ•ด์‹œ ๊ธฐ๋ฐ˜ ์ปฌ๋ ‰์…˜์—์„œ ๊ฐ์ฒด๋ฅผ ๋น ๋ฅด๊ฒŒ ์ €์žฅํ•˜๊ณ  ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•œ ๋ฒ„ํ‚ท ์ธ๋ฑ์Šค ํ‚ค๋กœ ์‚ฌ์šฉ๋œ๋‹ค. 

Developer dev = new Developer("BlueCool", 12); 
int hash = dev.hashCode(); // ์˜ˆ์‹œ: 427492637

hashCode()์˜ ์—ญํ• ์€ ๋‹จ์ˆœํžˆ ์ˆซ์ž๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋™๋“ฑํ•œ ๊ฐ์ฒด๋Š” ๋ฐ˜๋“œ์‹œ ๋™์ผํ•œ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค๋Š” ๊ทœ์•ฝ์„ ์ง€ํ‚ค๋Š”๋ฐ ์žˆ๋‹ค. 

Hash ๊ธฐ๋ฐ˜ ์ปฌ๋ ‰์…˜์€ ๋‚ด๋ถ€์ ์œผ๋กœ hashCode() ๊ฐ’์„ ์ด์šฉํ•ด ์ €์žฅ ์œ„์น˜(๋ฒ„ํ‚ท)์„ ๊ณ„์‚ฐํ•˜๊ณ  ๊ฐ™์€ ๋ฒ„ํ‚ท์— ์—ฌ๋Ÿฌ ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ equals() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ฐ™์€ ๊ฐ์ฒด์ธ์ง€ ์ตœ์ข… ํ™•์ธํ•œ๋‹ค. 

๋”ฐ๋ผ์„œ equals()๋งŒ ์žฌ์ •์˜ํ•˜๊ณ  hashCode()๋ฅผ ์žฌ์ •์˜ํ•˜์ง€ ์•Š์œผ๋ฉด ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ฐ™์€ ๊ฐ์ฒด์ด๋”๋ผ๋„ ์„œ๋กœ ๋‹ค๋ฅธ ํ•ด์‹œ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด HashMap, HashSet ๋“ฑ์˜ ์ปฌ๋ ‰์…˜์—์„œ ์ค‘๋ณต์œผ๋กœ ์ €์žฅ๋˜๊ฑฐ๋‚˜ ์กฐํšŒ, ์‚ญ์ œ์— ์‹คํŒจํ•˜๊ฒŒ ๋˜๋Š” ๋“ฑ ์น˜๋ช…์ ์ธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. 

๋”ฐ๋ผ์„œ equals()๋ฅผ ์žฌ์ •์˜ํ•  ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ hashCode()๋„ ํ•จ๊ป˜ ์žฌ์ •์˜ํ•ด์•ผํ•˜๋ฉฐ hashCode ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ ํ•  ๋•Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์•ฝ์„ ๋”ฐ๋ฅธ๋‹ค. 

  • ์ผ๊ด€์„ฑ 
    ๊ฐ์ฒด์˜ ์ƒํƒœ๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฐ™์€ ์‹คํ–‰ ์ค‘์—๋Š” hashCode()์˜ ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.
  • ๋™์น˜ ๋™์ผ ํ•ด์‹œ 
    x.equals(y)๊ฐ€ true๋ฉด ๋ฐ˜๋“œ์‹œ x.hashCode() == y.hashCode()์—ฌ์•ผ ํ•œ๋‹ค.
  • ์ถฉ๋Œ ํ—ˆ์šฉ 
    ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ผ๋„ ๊ฐ™์€ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐ€๋Šฅํ•œ ์ถฉ๋Œ์„ ์ค„์ด๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. 


3. equals()์™€ hashCode() ๊ตฌํ˜„ ์˜ˆ์‹œ

์‚ฌ์šฉ์ž ์ •์˜ ํด๋ž˜์Šค์—์„œ ๊ฐ์ฒด์˜ ๋…ผ๋ฆฌ์  ๋™๋“ฑ์„ฑ์„ ํŒ๋‹จํ•˜๋ ค๋ฉด equals()์™€ hashCode()๋ฅผ ํ•จ๊ป˜ ์žฌ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.

import java.util.Objects;

class Developer {

private String name;
private int age;

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

@Override
public boolean equals(Object o) {
if (this === o) return true;
if (!(o instanceof Developer)) return false;

Developer dev = (Developer) o;
return age == dev.age && Objects.equals(name, dev.name);
}

@Override
public int hashCode() {
return Objects.hash(name, age);
}
}

์œ„ ์ฝ”๋“œ์—์„œ๋Š” Objects.equals()์™€ Objects.hash()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ equals()์™€ hashCode()๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•˜๋ฉด ๋‘ Developer ๊ฐ์ฒด์˜ name๊ณผ age ๊ฐ’์ด ๋™์ผํ•œ ๊ฒฝ์šฐ ๊ฐ™์€ ๊ฐ์ฒด๋กœ ํŒ๋‹จํ•˜๋ฉฐ ๋™์ผํ•œ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค.

์‹ค๋ฌด์—์„œ๋Š” Lombok์„ ์‚ฌ์šฉํ•˜์—ฌ equals()์™€ hashCode()๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ๋‹ค.

import lombok.EqualsAndHashCode;

@EqualsAndHashCode
public class Developer {
private String name;
private int age;
}โ€‹

๋˜๋Š” @Data ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ equals(), hashCode(), getter, setter ๋“ฑ์„ ํ•จ๊ป˜ ์ž๋™ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

ๅ‰ใฎ่จ˜ไบ‹
โš™๏ธ ์šด์˜ ํ™˜๊ฒฝ๊นŒ์ง€ ๊ณ ๋ คํ•œ JPA ์„ค์ • ๊ฐ€์ด๋“œ
ๆฌกใฎ่จ˜ไบ‹
๐Ÿ”ค Java์˜ String์ด ํŠน๋ณ„ํ•œ ์ด์œ  - String์˜ ํ•ต์‹ฌ ํŠน์ง• 3๊ฐ€์ง€
่ฃ…้ฃพใƒญใ‚ด