251230 ์˜ TIL ๐Ÿ“–

ํ˜ธ๋‘ยท2025๋…„ 12์›” 30์ผ

โœ”๏ธ Java / Spring

๋ชฉ๋ก ๋ณด๊ธฐ
16/25

์˜ค๋Š˜๋ถ€ํ„ฐ ๋‹ค์‹œ ๋ธ”๋กœ๊ทธ์— ๋งค์ผ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค.
ํ•œ๋™์•ˆ ๊ตฟ๋…ธํŠธ์— ์†์œผ๋กœ ์“ฐ๋ฉด์„œ ์ •๋ฆฌํ–ˆ๋Š”๋ฐ ๋ธ”๋กœ๊ทธ ํ˜•์‹์œผ๋กœ ์ •๋ฆฌํ•˜๋Š”๊ฒŒ ๋” ๋‚ด์šฉ์ •๋ฆฌ๊ฐ€ ํ™•์‹คํ•  ๊ฑฐ ๊ฐ™์•„์š”.


์˜ค๋Š˜์€ ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ Set์—์„œ ์•ž์—์„œ ๋ฐฐ์šด ์ˆซ์ž ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฌธ์ž์™€ ๊ฐ์ฒด๋„ ํ•ด์‹œ์ฝ”๋“œ๋กœ ๋ณ€๊ฒฝํ•ด์„œ ํ•ด์‹œ์ธ๋ฑ์Šค๋กœ ์ €์žฅํ•˜๋Š” ๋ฒ•์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค.


โœ… ์ž๋ฐ”์˜ hashCode()

ํ•ด์‹œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€, ๊ฒ€์ƒ‰, ์‚ญ์ œ ์„ฑ๋Šฅ์ด O(n) ์œผ๋กœ ๋งค์šฐ ๋น ๋ฅด๋‹ค. ์•ž์—์„œ ๋ฐฐ์šด int, Integer ์™ธ์— ์ž๋ฐ”์—๋Š” boolean, String ๋“ฑ ์—ฌ๋Ÿฌ ํƒ€์ž…์ด ์กด์žฌํ•œ๋‹ค. ์ž๋ฐ”์˜ ๋ชจ๋“  ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด๋ฅผ ์ž๋ฃŒ๊ตฌ์กฐ์— ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ทธ๊ฒƒ์— ํ•ด๋‹นํ•˜๋Š” ์ˆซ์ž ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.


Object ์˜ hashCode()

Object.hashCode() โžก๏ธ ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ์ž์‹ ๋งŒ์˜ ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ํ‘œํ˜„ ๊ฐ€๋Šฅ

  • ์ด ๋ฉ”์„œ๋“œ๋ฅผ ๋ณดํ†ต ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•ด์„œ ์‚ฌ์šฉ
  • ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜์ง€ ์•Š์œผ๋ฉด ์ฐธ์กฐ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑ, Object์˜ hashCode() ๋Š” ๊ฐ์ฒด ์‹๋ณ„์šฉ์ด๋‹ค.
  • ์ž๋ฐ”๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ํ•ด์‹œ์ฝ”๋“œ ๋ฉ”์„œ๋“œ์—์„œ๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ๋‹ค๋ฅด๋ฉด ํ•ด์‹œ์ฝ”๋“œ๋„ ๋‹ค๋ฅด๋‹ค.

hashCode() ์˜ค๋ฒ„๋ผ์ด๋”ฉ

@Override
    public int hashCode() {
        return Objects.hashCode(id);
    }

Object์˜ hashCode()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•ด์„œ ์‚ฌ์šฉ๋œ๋‹ค. ์ž๋ฐ”์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ํƒ€์ž…์— ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ๋˜์–ด์žˆ๋‹ค.


Object ํ•ด์‹œ์ฝ”๋“œ์™€ ์ž๋ฐ”์˜ ๊ธฐ๋ณธ ํด๋ž˜์Šค ํ•ด์‹œ์ฝ”๋“œ

โœ”๏ธ Object ์˜ hashCode : ๊ฐ์ฒด์˜ ์ฐธ์กฐ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ํ•ด์‹œ์ฝ”๋“œ ์ƒ์„ฑํ•ด์„œ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋ฉด ๋‹ค๋ฅธ ํ•ด์‹œ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋จ โžก๏ธ ๋‹คํ˜•์„ฑ์œผ๋กœ ํ™œ์šฉโ€ผ๏ธ

โœ”๏ธ ์ž๋ฐ”์˜ ๊ธฐ๋ณธ ํ•ด์‹œ์ฝ”๋“œ : ๋Œ€๋ถ€๋ถ„ ๋‚ด๋ถ€ ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด์‹œ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๋„๋ก ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋˜์–ด์žˆ์Œ


equals() ์˜ค๋ฒ„๋ผ์ด๋”ฉ

hashCode ๋Š” ๋น ๋ฅด๊ฒŒ ์ฐพ๊ธฐ์œ„ํ•œ ๋ถ„๋ฅ˜์šฉ
equals ๋Š” ์ง„์งœ ๊ฐ™์€์ง€ ์ตœ์ข… ํ™•์ธ์šฉ

๋‹ค๋ฅธ ๊ฐ์ฒด๋ผ๋„ ๊ฐ™์€ hashCode๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค. โžก๏ธ ํ•ด์‹œ ์ถฉ๋Œ๐Ÿ’ฅ
๋˜ equals๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ๋น„๊ตํ•ด์•ผํ•ด์„œ ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง. ๊ทธ๋ž˜์„œ hashCode๋กœ ๋จผ์ € ๊ฑฐ๋ฅธ๋‹ค.

@Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Member member = (Member) o;
        return Objects.equals(id,member.id);
    }

1. ์ฐธ์กฐ ๋™์ผ์„ฑ ๋น„๊ต
if (this == o) return true;
: ๊ฐ™์€ ์ธ์Šคํ„ด์Šค์ผ ๊ฒฝ์šฐ / ๋ฌด์กฐ๊ฑด ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ๋” ํ™•์ธํ•  ํ•„์š” ์—†์ด true๋ฅผ ๋ฐ˜ํ™˜

2. ๋น„๊ต ๋Œ€์ƒ ๊ฒ€์ฆ (NPE, ํƒ€์ž… ์•ˆ์ •์„ฑ)
if (o == null || getClass() != o.getClass()) return false;
: ์ €์žฅํ•˜๋ ค๋Š” ๊ฐ์ฒด๊ฐ€ null์ด๊ฑฐ๋‚˜ ๋น„๊ตํ•˜๋ ค๋Š” ๋‘ ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ํƒ€์ž…์ผ ๊ฒฝ์šฐ / NullPointerException(NPE) ๋ฐœ์ƒ, ๋‹ค๋ฅธ ํƒ€์ž…์ด๋ฉด ๋‹น์—ฐํžˆ ๋™๋“ฑ์„ฑ โŒ

3. ์‹ค์ œ ๋™๋“ฑ์„ฑ ํŒ๋‹จ (ํ•„๋“œ ๊ฐ’ ๋น„๊ต)
Member member = (Member) o;
: Object ํƒ€์ž…์ธ o ๋ฅผ ๋น„๊ตํ•˜๋ ค๋Š” ๊ฐ์ฒด์˜ ํƒ€์ž…์œผ๋กœ ๋‹ค์šด์บ์ŠคํŒ… / ์ •ํ™•ํ•œ ๋น„๊ต๋ฅผ ์œ„ํ•ด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋„๋ก


์‹ค์ œ ํ•ด์‹œ์ฝ”๋“œ ์‚ฌ์šฉ ์‹œ ์‹ค์ œ ํ๋ฆ„

๊ฐ์ฒด โ†’ hashCode() ํ˜ธ์ถœ

๊ฐ™์€ hashCode ๋ฒ„ํ‚ท์œผ๋กœ ์ด๋™

๋ฒ„ํ‚ท ์•ˆ์—์„œ

  • equals()๋กœ ๋น„๊ต
  • ์ง„์งœ ๊ฐ™์€ ํ‚ค์ธ์ง€ ํ™•์ธ

์ง์ ‘ ๋งŒ๋“  ํƒ€์ž…์˜ ํ•ด์‹œ์ฝ”๋“œ

์ž๋ฐ”์˜ ๊ธฐ๋ณธ ํƒ€์ž…์€ ์ด๋ฏธ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ๋˜์–ด์žˆ๋‹ค. ๋‚ด๊ฐ€ ๋งŒ๋“  ํด๋ž˜์Šค๋Š” ๋‚ด๊ฐ€ ์ง์ ‘ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•ด์•ผํ•œ๋‹ค.

public class Member {
...
@Override
    public int hashCode() {
        return Objects.hashCode(id);
    }
 }
  • ์ฐธ์กฐ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” Object์˜ hashCode() ๋ฅผ ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ง ๋‹ค.

  • ํ•ด์‹œ์ฝ”๋“œ๋Š” ์Œ์ˆ˜๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์–ด์„œ ํ•ด์‹œ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ Math.abs() ๋ฅผ ๋„ฃ์–ด์•ผ ํ•œ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€