10 ~ 14

ยท Object๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ตฌ์ฒด ํด๋ž˜์Šค์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ์†ํ•ด์„œ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ๋‹ค.

ยท Object์—์„œ final์ด ์•„๋‹Œ ๋ฉ”์„œ๋“œ(equals, hashCode, toString, clone, finalize)๋Š” ๋ชจ๋‘ ์žฌ์ •์˜(overriding)๋ฅผ ์—ผ๋‘์— ๋‘๊ณ  ์„ค๊ณ„๋œ ๊ฒƒ์ด๋ผ ์žฌ์ •์˜ ์‹œ ์ง€์ผœ์•ผ ํ•˜๋Š” ์ผ๋ฐ˜ ๊ทœ์•ฝ์ด ๋ช…ํ™•ํžˆ ์ •์˜๋˜์–ด ์žˆ๋‹ค.

- ๋ฉ”์„œ๋“œ๋ฅผ ์ž˜๋ชป ๊ตฌํ˜„ํ•˜๋ฉด ๋Œ€์ƒ ํด๋ž˜์Šค๊ฐ€ ์ด ๊ทœ์•ฝ์„ ์ค€์ˆ˜ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ํด๋ž˜์Šค(HashMap๊ณผ HashSet ๋“ฑ)์ด ์˜ค์ž‘๋™ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

ยท ์ด ์žฅ์—์„œ๋Š” Object ๋ฉ”์„œ๋“œ๋“ค์ด ์–ธ์ œ ์–ด๋–ป๊ฒŒ ์žฌ์ •์˜ํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๋‹ค๋ฃฌ๋‹ค. Comparable.compareTo ๋˜ํ•œ ์„ฑ๊ฒฉ์ด ๋น„์Šทํ•˜์—ฌ ์ด๋ฒˆ ์žฅ์—์„œ ํ•จ๊ป˜ ๋‹ค๋ฃฌ๋‹ค.

์•„์ดํ…œ 10. equals๋Š” ์ผ๋ฐ˜ ๊ทœ์•ฝ์„ ์ง€์ผœ ์žฌ์ •์˜ํ•˜๋ผ


ยท equals ๋ฉ”์„œ๋“œ๋Š” ์ž˜๋ชป ์žฌ์ •์˜ํ•˜๋ฉด ๋”์ฐํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•œ๋‹ค. ๋ฌธ์ œ๋ฅผ ํšŒํ”ผํ•˜๋Š” ๊ฐ€๋Šฅ ์‰ฌ์šด ๊ธธ์€ ์•„์˜ˆ ์žฌ์ •์˜ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ƒฅ ๋‘๋ฉด ๊ทธ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋Š” ์˜ค์ง ์ž๊ธฐ ์ž์‹ ๊ณผ๋งŒ ๊ฐ™๊ฒŒ ๋œ๋‹ค.

equals๋ฅผ ์žฌ์ •์˜ํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๋Š” ์ƒํ™ฉ

1. ๊ฐ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ณธ์งˆ์ ์œผ๋กœ ๊ณ ์œ ํ•˜๋‹ค.

- ๊ฐ’์„ ํ‘œํ˜„ํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๋™์ž‘ํ•˜๋Š” ๊ฐœ์ฒด๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์—ฌ๊ธฐ์— ํ•ด๋‹นํ•œ๋‹ค. ex) Thread

2. ์ธ์Šคํ„ด์Šค์˜ ๋…ผ๋ฆฌ์  ๋™์น˜(logical equality)๋ฅผ ๊ฒ€์‚ฌํ•  ์ผ์ด ์—†๋‹ค.

3. ์ƒ์œ„ ํด๋ž˜์Šค์—์„œ ์žฌ์ •์˜ํ•œ equals๊ฐ€ ํ•˜์œ„ ํด๋ž˜์Šค์—๋„ ๋”ฑ ๋“ค์–ด๋งž๋Š”๋‹ค.

ex) ๋Œ€๋ถ€๋ถ„์˜ Set ๊ตฌํ˜„์ฒด๋Š” AbstractSet์ด ๊ตฌํ˜„ํ•œ equals๋ฅผ ์ƒ์† ๋ฐ›์•„ ์“ด๋‹ค. List์™€ AbstractList, Map๊ณผ AbstracMap๋„ ๊ทธ๋ ‡๋‹ค.

4. ํด๋ž˜์Šค๊ฐ€ private์ด๊ฑฐ๋‚˜ package-private์ด๊ณ  equals ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ผ์ด ์—†๋‹ค.

ยท equals๋ฅผ ์‹ค์ˆ˜๋กœ๋ผ๋„ ํ˜ธ์ถœ๋˜๋Š” ๊ฑธ ๋ง‰๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ์ฒ˜๋Ÿผ ๊ตฌํ˜„ํ•ด๋‘์ž.

@Override public boolean equals(Object o) {
    throw new AssertionError(); // ํ˜ธ์ถœ ๊ธˆ์ง€
}

equals๋ฅผ ์žฌ์ •์˜ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ

ยท ๊ฐ์ฒด ์‹๋ณ„์„ฑ ์•„๋‹ˆ๋ผ ๋…ผ๋ฆฌ์  ๋™์น˜์„ฑ์„ ํ™•์ธํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ์ด๊ณ , ์ƒ์œ„ ํด๋ž˜์Šค์˜ equals๊ฐ€ ๋…ผ๋ฆฌ์  ๋™์น˜์„ฑ์„ ๋น„๊ตํ•˜๋„๋ก ์žฌ์ •์˜๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด equals๋ฅผ ์žฌ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.

- ์ฃผ๋กœ ๊ฐ’ ํด๋ž˜์Šค(Integer, String)๋“ค์ด ์—ฌ๊ธฐ ํ•ด๋‹นํ•œ๋‹ค.

- ๊ฐ’ ํด๋ž˜์Šค๋ผ๋„ ๊ฐ’์ด ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋‘˜ ์ด์ƒ ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์Œ์„ ๋ณด์žฅํ•˜๋Š” ์ธ์Šคํ„ด์Šค ํ†ต์ œ ํด๋ž˜์Šค(์•„์ดํ…œ 1)๋ผ๋ฉด equals๋ฅผ ์žฌ์ •์˜ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ex) Enum

- ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๊ฐ€ 2๊ฐœ ์ด์ƒ ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์œผ๋ฉด, ๋…ผ๋ฆฌ์  ๋™์น˜์„ฑ๊ณผ ๊ฐ์ฒด ์‹๋ณ„์„ฑ์ด ์‚ฌ์‹ค์ƒ ๋˜‘๊ฐ™์€ ์˜๋ฏธ๊ฐ€ ๋œ๋‹ค.

- ๊ฐ์ฒด ์‹๋ณ„์„ฑ: Object identity, ๋‘ ๊ฐ์ฒด๊ฐ€ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๊ฐ™์€๊ฐ€

ยท equals๊ฐ€ ๋…ผ๋ฆฌ์  ๋™์น˜์„ฑ์„ ํ™•์ธํ•˜๋„๋ก ์žฌ์ •์˜ํ•˜๋ฉด, Map์˜ ํ‚ค์™€ Set์˜ ์›์†Œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

ยท equals ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•  ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ ์ผ๋ฐ˜ ๊ทœ์•ฝ์„ ๋”ฐ๋ผ์•ผ ํ•œ๋‹ค.

- ์ด ๊ทœ์•ฝ์„ ์–ด๊ธฐ๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์ด์ƒํ•˜๊ฒŒ ๋™์ž‘ํ•˜๊ฑฐ๋‚˜ ์ข…๋ฃŒ๋  ๊ฒƒ์ด๊ณ , ์›์ธ์ด ๋˜๋Š” ์ฝ”๋“œ๋Š” ์ฐพ๊ธฐ ๊ต‰์žฅํžˆ ์–ด๋ ค์šธ ๊ฒƒ์ด๋‹ค.

Object ๋ช…์„ธ์— ์ ํžŒ ๊ทœ์•ฝ

ยท equals ๋ฉ”์„œ๋“œ๋Š” ๋™์น˜๊ด€๊ณ„(equivalence relation)๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ, ๋‹ค์Œ์„ ๋งŒ์กฑํ•œ๋‹ค.

1. ๋ฐ˜์‚ฌ์„ฑ(reflexivity): null์ด ์•„๋‹Œ ๋ชจ๋“  ์ฐธ์กฐ ๊ฐ’ x์— ๋Œ€ํ•ด, x.equals(x)๋Š” true๋‹ค.

- ๊ฐ์ฒด๋Š” ์ž๊ธฐ ์ž์‹ ๊ณผ ๊ฐ™์•„์•ผ ํ•œ๋‹ค.

2. ๋Œ€์นญ์„ฑ(symmetry): null์ด ์•„๋‹Œ ๋ชจ๋“  ์ฐธ์กฐ ๊ฐ’ x, y์— ๋Œ€ํ•ด, x.equals(y)๊ฐ€ true๋ฉด y.equals(x)๋„ true๋‹ค.

- ๋‘ ๊ฐ์ฒด๋Š” ์„œ๋กœ์— ๋Œ€ํ•œ ๋™์น˜ ์—ฌ๋ถ€์— ๋˜‘๊ฐ™์ด ๋‹ตํ•ด์•ผ ํ•œ๋‹ค.

3. ์ถ”์ด์„ฑ(transitivity): null์ด ์•„๋‹Œ ๋ชจ๋“  ์ฐธ์กฐ ๊ฐ’ x, y, z์— ๋Œ€ํ•ด, x.equals(y)๊ฐ€ true์ด๊ณ  y.equals(z)๋„ true๋ฉด x.equals(z)๋„ true๋‹ค.

- ์ฒซ ๋ฒˆ์งธ ๊ฐ์ฒด์™€ ๋‘ ๋ฒˆ์งธ ๊ฐ์ฒด๊ฐ€ ๊ฐ™๊ณ , ๋‘ ๋ฒˆ์งธ ๊ฐ์ฒด์™€ ์„ธ๋ฒˆ์งธ ๊ฐ์ฒด๊ฐ€ ๊ฐ™๋‹ค๋ฉด, ์ฒซ ๋ฒˆ์งธ ๊ฐ์ฒด์™€ ์„ธ ๋ฒˆ์งธ ๊ฐ์ฒด๋„ ๊ฐ™์•„์•ผ ํ•œ๋‹ค.

4. ์ผ๊ด€์„ฑ(consistency): null์ด ์•„๋‹Œ ๋ชจ๋“  ์ฐธ์กฐ ๊ฐ’ x, y์— ๋Œ€ํ•ด, x.equals(y)๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ํ˜ธ์ถœํ•˜๋ฉด ํ•ญ์ƒ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ํ•ญ์ƒ false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

-

5. null-์•„๋‹˜: null์ด ์•„๋‹Œ ๋ชจ๋“  ์ฐธ์กฐ ๊ฐ’ x์— ๋Œ€ํ•ด, x.equals(null)์€ false๋‹ค.

ยท ๋™์น˜๊ด€๊ณ„๋ž€ ์ง‘ํ•ฉ์„ ์„œ๋กœ ๊ฐ™์€ ์›์†Œ๋“ค๋กœ ์ด๋ค„์ง„ ๋ถ€๋ถ„์ง‘ํ•ฉ์œผ๋กœ ๋‚˜๋ˆ„๋Š” ์—ฐ์‚ฐ์ด๋‹ค.

- ์ด ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ๋™์น˜๋ฅ˜(equivalence class; ๋™์น˜ ํด๋ž˜์Šค)๋ผ ํ•œ๋‹ค.

- equals ๋ฉ”์„œ๋“œ๊ฐ€ ์“ธ๋ชจ ์žˆ์œผ๋ ค๋ฉด ๋ชจ๋“  ์›์†Œ๊ฐ€ ๊ฐ™์€ ๋™์น˜๋ฅ˜์— ์†ํ•œ ์–ด๋–ค ์›์†Œ์™€๋„ ์„œ๋กœ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

ยท ๊ตฌ์ฒด ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•ด ์ƒˆ๋กœ์šด ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋ฉด equals ๊ทœ์•ฝ์„ ๋งŒ์กฑ์‹œํ‚ฌ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

(๊ฐ์ฒด ์ง€ํ–ฅ์  ์ถ”์ƒํ™”์˜ ์ด์ ์„ ํฌ๊ธฐํ•˜์ง€ ์•Š๋Š” ํ•œ)

- ์ด๋Š” ์ถ”์ด์„ฑ์„ ๊นจ๋Š” ํ–‰์œ„๋‹ค.

- ๋ชจ๋“  ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด์˜ ๋™์น˜๊ด€๊ณ„์—์„œ ๋‚˜ํƒ€๋‚˜๋Š” ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๋‹ค.

- ์šฐํšŒ ๋ฐฉ๋ฒ•: ์ƒ์†์ด ์•„๋‹Œ ์ปดํฌ์ง€์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค.

์–‘์งˆ์˜ equals ๋ฉ”์„œ๋“œ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

1. == ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ์ž…๋ ฅ์ด ์ž๊ธฐ ์ž์‹ ์˜ ์ฐธ์กฐ์ธ์ง€ ํ™•์ธํ•œ๋‹ค. ์ž๊ธฐ ์ž์‹ ์ด๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

- ์ด๋Š” ๋‹จ์ˆœํ•œ ์„ฑ๋Šฅ ์ตœ์ ํ™”์šฉ์ด๋‹ค.

2. instanceof ์—ฐ์‚ฐ์ž๋กœ ์ž…๋ ฅ์ด ์˜ฌ๋ฐ”๋ฅธ ํƒ€์ž…์ธ์ง€ ํ™•์ธํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

- ์˜ฌ๋ฐ”๋ฅธ ํƒ€์ž…์€ equals๊ฐ€ ์ •์˜๋œ ํด๋ž˜์Šค์ธ ๊ฒƒ์ด ๋ณดํ†ต์ด์ง€๋งŒ, ๊ฐ€๋”์€ ๊ทธ ํด๋ž˜์Šค๊ฐ€ ๊ตฌํ˜„ํ•œ ํŠน์ • ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๋‹ค.

- ์–ด๋–ค ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ž์‹ ์„ ๊ตฌํ˜„ํ•œ ์„œ๋กœ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ผ๋ฆฌ๋„ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋„๋ก equals ๊ทœ์•ฝ์„ ์ˆ˜์ •ํ•˜๊ธฐ๋„ ํ•œ๋‹ค. ์ด๋Ÿฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋ผ๋ฉด equals์— ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ex) Set, List, Map, Map.Entry

3. ์ž…๋ ฅ์„ ์˜ฌ๋ฐ”๋ฅธ ํƒ€์ž…์œผ๋กœ ํ˜•๋ณ€ํ™˜ํ•œ๋‹ค.

- ์•ž์„œ instanceof ๊ฒ€์‚ฌ๋ฅผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋‹จ๊ณ„๋Š” 100% ์„ฑ๊ณต ํ•œ๋‹ค.

4. ์ž…๋ ฅ ๊ฐ์ฒด์™€ ์ž๊ธฐ ์ž์‹ ์˜ ๋Œ€์‘๋˜๋Š” ํ•ต์‹ฌ ํ•„๋“œ๋“ค์ด ๋ชจ๋‘ ์ผ์น˜ํ•˜๋Š”์ง€ ํ•˜๋‚˜์”ฉ ๊ฒ€์‚ฌํ•œ๋‹ค. ๋ชจ๋“  ํ•„๋“œ๊ฐ€ ์ผ์น˜ํ•˜๋ฉด true๋ฅผ ํ•˜๋‚˜๋ผ๋„ ๋‹ค๋ฅด๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

- 2๋‹จ๊ณ„์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์š”ํ–ˆ๋‹ค๋ฉด ์ž…๋ ฅ ํ•„๋“œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋„ ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

TODO: p63 ์ดํ›„

์•„์ดํ…œ 11. equals๋ฅผ ์žฌ์ •์˜ํ•˜๋ ค๊ฑฐ๋“  hashCode๋„ ์žฌ์ •์˜ํ•˜๋ผ


ยท equals๋ฅผ ์žฌ์ •์˜ํ•œ ํด๋ž˜์Šค ๋ชจ๋‘์—์„œ hashCode๋„ ์žฌ์ •์˜ ์žฌ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.

- ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด hashCode ์ผ๋ฐ˜ ๊ทœ์•ฝ์„ ์–ด๊ธฐ๊ฒŒ ๋˜์–ด ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ HashMap, HashSet ๋“ฑ ์ปฌ๋ ‰์…˜์˜ ์›์†Œ๋กœ ์‚ฌ์šฉํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

ยท ์•„๋ž˜๋Š” Object ๋ช…์„ธ์˜ hashCode ๊ด€๋ จ ๊ทœ์•ฝ์„ ๋ฐœ์ทŒํ•œ ๊ฒƒ์ด๋‹ค. hashCode ์žฌ์ •์˜๋ฅผ ์ž˜๋ชปํ–ˆ์„ ๋•Œ, ๋‘ ๋ฒˆ์งธ ์กฐํ•ญ์ด ํฌ๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค.

- ์ฆ‰, ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ฐ™์€ ๊ฐ์ฒด๋Š” ๊ฐ™์€ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

- equals๋Š” ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋‹ค๋ฅธ ๋‘ ๊ฐ์ฒด๋ฅผ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ฐ™๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ Object์˜ ๊ธฐ๋ณธ haCode ๋ฉ”์„œ๋“œ๋Š” ์ด ๋‘˜์ด ์ „ํ˜€ ๋‹ค๋ฅด๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

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

ยท ์ข‹์€ ํ•ด์‹œ ํ•จ์ˆ˜๋ผ๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค์— ๋‹ค๋ฅธ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผํ•œ๋‹ค.

- ์œ„ ๊ทœ์•ฝ์˜ ์„ธ ๋ฒˆ์งธ ๊ทœ์•ฝ์ด ์š”๊ตฌํ•˜๋Š” ์†์„ฑ์ด๋‹ค.

- ๋‹ค์Œ์€ ๋™์น˜์ธ ๋ชจ๋“  ๊ฐ์ฒด์—์„œ ๋˜‘๊ฐ™์€ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ตœ์•…์ด์ง€๋งŒ ์ ๋ฒ•ํ•œ ์ฝ”๋“œ๋‹ค. ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ํ•ด์‹œํ…Œ์ด๋ธ” ๋ฒ„ํ‚ท ํ•˜๋‚˜์— ๋‹ด๊ฒจ ๋งˆ์น˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์ฒ˜๋Ÿผ ๋™์ž‘ํ•œ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ํ‰๊ท  ์ˆ˜ํ–‰ ์‹œ๊ฐ„์ด O(1)์ธ ํ•ด์‹œํ…Œ์ด๋ธ”์ด O(n)์œผ๋กœ ๋Š๋ ค์ง„๋‹ค.

// ์ตœ์•…์ด์ง€๋งŒ ์ ๋ฒ•ํ•œ hashCode ๊ตฌํ˜„.
// ๋™์น˜์ธ ๋ชจ๋“  ๊ฐ์ฒด์—์„œ ๋˜‘๊ฐ™์€ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
@Override
public int hashCode() {
    return 42;
}

์ข‹์€ hashCode๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์š”๋ น

  • 1. int ๋ณ€์ˆ˜ result ๋ฅผ ์„ ์–ธํ•œ ํ›„ ๊ฐ’ c๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. ์ด๋•Œ c๋Š” ํ•ด๋‹น ๊ฐ์ฒด์˜ ์ฒซ ๋ฒˆ์งธ ํ•ต์‹ฌ ํ•„๋“œ๋ฅผ ๋‹จ๊ณ„ 2.a ๋ฐฉ์‹์œผ๋กœ ๊ณ„์‚ฐํ•œ ํ•ด์‹œ์ฝ”๋“œ๋‹ค. - ํ•ต์‹ฌ ํ•„๋“œ: equals ๋น„๊ต์— ์‚ฌ์šฉ๋˜๋Š” ํ•„๋“œ

  • 2. ํ•ด๋‹น ๊ฐ์ฒด์˜ ๋‚˜๋จธ์ง€ ํ•ต์‹ฌ ํ•„๋“œ f ๊ฐ๊ฐ์— ๋Œ€ํ•ด ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

    • a. ํ•ด๋‹น ํ•„๋“œ์˜ ํ•ด์‹œ์ฝ”๋“œ c๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.

      • i. ๊ธฐ๋ณธ ํƒ€์ž… ํ•„๋“œ๋ผ๋ฉด, Type.hashCode(f)๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ Type์€ ํ•ด๋‹น ๊ธฐ๋ณธ ํƒ€์ž…์˜ ๋ฐ•์‹ฑ ํด๋ž˜์Šค๋‹ค.

      • ii. ์ฐธ์กฐ ํƒ€์ž… ํ•„๋“œ๋ฉด์„œ ์ด ํด๋ž˜์Šค์˜ equals ๋ฉ”์„œ๋“œ๊ฐ€ ์ด ํ•„๋“œ์˜ equals๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœํ•ด ๋น„๊ตํ•œ๋‹ค๋ฉด, ์ด ํ•„๋“œ์˜ ํ‘œ์ค€ํ˜•(canonical representation)์„ ๋งŒ๋“ค์–ด ๊ทธ ํ‘œ์ค€ํ˜•์˜ hashCode๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ํ•„๋“œ์˜ ๊ฐ’์ด null ์ด๋ฉด 0์„ ์‚ฌ์šฉํ•œ๋‹ค(๋‹ค๋ฅธ ์ƒ์ˆ˜๋„ ๊ดœ์ฐฎ์ง€๋งŒ ์ „ํ†ต์ ์œผ๋กœ 0์„ ์‚ฌ์šฉํ•œ๋‹ค).

      • iii. ํ•„๋“œ๊ฐ€ ๋ฐฐ์—ด์ด๋ผ๋ฉด, ํ•ต์‹ฌ ์›์†Œ ๊ฐ๊ฐ์„ ๋ณ„๋„ ํ•„๋“œ์ฒ˜๋Ÿผ ๋‹ค๋ฃฌ๋‹ค. ์ด์ƒ์˜ ๊ทœ์น™์„ ์žฌ๊ท€์ ์œผ๋กœ ์ ์šฉํ•ด ๊ฐ ํ•ต์‹ฌ ์›์†Œ์˜ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๊ณ„์‚ฐํ•œ ๋‹ค์Œ, ๋‹จ๊ณ„ 2.b ๋ฐฉ์‹์œผ๋กœ ๊ฐฑ์‹ ํ•œ๋‹ค. ๋ฐฐ์—ด์— ํ•ต์‹ฌ ์›์†Œ๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋‹ค๋ฉด ๋‹จ์ˆœํžˆ ์ƒ์ˆ˜(0์„ ์ถ”์ฒœํ•œ๋‹ค)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋ชจ๋“  ์›์†Œ๊ฐ€ ํ•ต์‹ฌ ์›์†Œ๋ผ๋ฉด Arrays.hashCode๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

    • b. ๋‹จ๊ณ„ 2.a์—์„œ ๊ณ„์‚ฐํ•œ ํ•ด์‹œ์ฝ”๋“œ c๋กœ result๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค. ์ฝ”๋“œ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

      • result = 31 * result + c

  • 3. result ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

ยท 2.b์—์„œ ๊ณฑํ•  ์ˆซ์ž๋ฅผ 31๋กœ ์ •ํ•œ ์ด์œ ๋Š” 31์ด ํ™€์ˆ˜์ด๋ฉด์„œ ์†Œ์ˆ˜(prime)์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

- ์ด ์ˆซ์ž๊ฐ€ ์ง์ˆ˜์ด๊ณ  ์˜ค๋ฒ„ํ”Œ๋กœ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ์ •๋ณด๋ฅผ ์žƒ๊ฒŒ ๋œ๋‹ค. 2๋ฅผ ๊ณฑํ•˜๋Š” ๊ฒƒ์€ ์‹œํ”„ํŠธ ์—ฐ์‚ฐ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

- ์†Œ์ˆ˜๋ฅผ ๊ณฑํ•˜๋Š” ์ด์œ ๋Š” ๋ช…ํ™•ํ•˜์ง€ ์•Š๊ณ , ์ „ํ†ต์ ์œผ๋กœ ๊ทธ๋ฆฌ ํ•ด์™”๋‹ค.

- 31์„ ์ด์šฉํ•˜๋ฉด ์ด ๊ณฑ์…ˆ์„ ์‹œํ”„ํŠธ ์—ฐ์‚ฐ๊ณผ ๋บ„์…ˆ์œผ๋กœ ๋Œ€์ฒดํ•ด ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. (31 * 1 == (1 << 5) - i) ์š”์ฆ˜ VM๋“ค์€ ์ด๋Ÿฐ ์ตœ์ ํ™”๋ฅผ ์ž๋™์œผ๋กœ ํ•ด์ค€๋‹ค.

์ถ”๊ฐ€์ ์ธ ํŒ

ยท hashCode๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค๋ฉด, ๋™์น˜์ธ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•ด ๋˜‘๊ฐ™์€ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ• ์ง€ ์ž๋ฌธํ•˜๊ณ , ๊ฒ€์ฆํ•  ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜์ž.

- equals์™€ hashCode ๋ฉ”์„œ๋“œ๋ฅผ AutoValue๋กœ ์ƒ์„ฑํ–ˆ๋‹ค๋ฉด ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ๋‹ค.

ยท ํŒŒ์ƒ ํ•„๋“œ๋Š” ํ•ด์‹œ ์ฝ”๋“œ ๊ณ„์‚ฐ์—์„œ ์ œ์™ธํ•ด๋„ ๋œ๋‹ค.

- ํŒŒ์ƒ ํ•„๋“œ: ๋‹ค๋ฅธ ํ•„๋“œ๋กœ๋ถ€ํ„ฐ ๊ณ„์‚ฐํ•ด ๋‚ผ ์ˆ˜ ์žˆ๋Š” ํ•„๋“œ

ยท equals ๋น„๊ต์— ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ํ•„๋“œ๋Š” ๋ฐ˜๋“œ์‹œ ์ œ์™ธํ•œ๋‹ค.

- ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด hashCode ๊ทœ์•ฝ ๋‘ ๋ฒˆ์งธ๋ฅผ ์–ด๊ธฐ๊ฒŒ ๋  ์ˆ˜ ์žˆ๋‹ค.

ยท ํ•ด์‹œ ์ถฉ๋Œ์ด ๋” ์ ์€ ๋ฐฉ๋ฒ•์„ ์“ฐ๊ณ  ์‹ถ๋‹ค๋ฉด ๊ตฌ์•„๋ฐ”์˜ com.google.common.hash.Hashing์„ ์ฐธ๊ณ ํ•˜์ž.

ยท Objects ํด๋ž˜์Šค๋Š” ์ž„์˜์˜ ๊ฐœ์ˆ˜๋งŒํผ ๊ฐ์ฒด๋ฅผ ๋ฐ›์•„ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๊ณ„์‚ฐํ•ด์ฃผ๋Š” ์ •์  ๋ฉ”์„œ๋“œ hash๋ฅผ ์ œ๊ณตํ•˜์—ฌ hashCode ํ•จ์ˆ˜๋ฅผ ๋‹จ ํ•œ ์ค„๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

@Override public int hashCode() {
    return Objects.hash(a, b, c);
}

- ์†๋„๊ฐ€ ๋Š๋ฆฌ๋ฏ€๋กœ ์„ฑ๋Šฅ์— ๋ฏผ๊ฐํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๋งŒ ์‚ฌ์šฉํ•˜์ž.

(์ž…๋ ฅ ์ธ์ˆ˜๋ฅผ ๋‹ด๊ธฐ ์œ„ํ•œ ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ณ , ๊ธฐ๋ณธ ํƒ€์ž…์˜ ๋ฐ•์‹ฑ ์–ธ๋ฐ•์‹ฑ์„ ๊ฑฐ์ณ์•ผ ํ•ด์„œ ๋Š๋ฆฌ๋‹ค)

ยท ํด๋ž˜์Šค๊ฐ€ ๋ถˆ๋ณ€์ด๊ณ  ํ•ด์‹œ์ฝ”๋“œ ๊ณ„์‚ฐ ๋น„์šฉ์ด ํฌ๋‹ค๋ฉด, ๋งค๋ฒˆ ์ƒˆ๋กœ ๊ณ„์‚ฐํ•˜์ง€ ๋ง๊ณ  ์บ์‹ฑ์„ ๊ณ ๋ คํ•˜์ž.

- ํ•ด๋‹น ํƒ€์ž…์˜ ๊ฐ์ฒด๊ฐ€ ์ฃผ๋กœ ํ•ด์‹œ ํ‚ค๋กœ ์‚ฌ์šฉ๋  ๊ฒƒ ๊ฐ™๋‹ค๋ฉด, ์ธ์Šคํ„ด์Šค๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ๋•Œ ๋ฏธ๋ฆฌ ํ•ด์‹œ์ฝ”๋“œ๋กœ ๊ณ„์‚ฐํ•ด๋‘”๋‹ค.

- ํ•ด์‹œ์˜ ํ‚ค๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด hashCode๊ฐ€ ์ฒ˜์Œ ๋ถˆ๋ฆด ๋•Œ ์ง€์—ฐ ์ดˆ๊ธฐํ™” ์ „๋žต์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

- ์ด ๊ฒฝ์šฐ ํด๋ž˜์Šค๋ฅผ ์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค.

ยท ์„ฑ๋Šฅ์„ ๋†’์ธ๋‹ต์‹œ๊ณ  ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ ํ•ต์‹ฌ ํ•„๋“œ๋ฅผ ์ƒ๋žตํ•˜๋ฉด ์•ˆ ๋œ๋‹ค.

- ํ•ด์‹œ ํ’ˆ์งˆ์ด ๋‚˜๋น ์ ธ ํ•ด์‹œํ…Œ์ด๋ธ”์˜ ์„ฑ๋Šฅ์ด ์‹ฌ๊ฐํ•˜๊ฒŒ ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

- ํŠน์ • ์˜์—ญ์— ๋ชฐ๋ฆฐ ์ธ์Šคํ„ด์Šค๋“ค์˜ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋„“์€ ๋ฒ”์œ„๋กœ ๊ณ ๋ฅด๊ฒŒ ํผ๋œจ๋ฆฌ๋Š” ํšจ๊ณผ๋ฅผ ๊ฐ€์ง€๋Š” ํ•„๋“œ์ผ ์ˆ˜๋„ ์žˆ๋‹ค.

ยท hashCode๊ฐ€ ๋ฐœํ™˜ํ•˜๋Š” ๊ฐ’์˜ ์ƒ์„ฑ ๊ทœ์น™์„ API ์‚ฌ์šฉ์ž์—๊ฒŒ ์ž์„ธํžˆ ๊ณตํ‘œํ•˜์ง€ ๋ง์ž.

- ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด ๊ฐ’์— ์˜์ง€ํ•˜์ง€ ์•Š๊ฒŒ ๋˜๊ณ , (ํ•ด์‹œ ๊ธฐ๋Šฅ์˜ ๊ฒฐํ•จ ๋ฐœ๊ฒฌ ๋“ฑ์˜ ์ด์œ ๋กœ )์ถ”ํ›„ ๊ณ„์‚ฐ ๋ฐฉ์‹์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

- String, Integer ๋“ฑ ์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” hashCode ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์„ ์ •ํ™•ํ•˜๊ฒŒ ์•Œ๋ ค์ฃผ๋Š” ๋ถ€์ž‘์šฉ์ด ์žˆ๋‹ค.

์•„์ดํ…œ 12. toString์„ ํ•ญ์ƒ ์žฌ์ •์˜ํ•˜๋ผ


ยท Object์˜ ๊ธฐ๋ณธ toString ๋ฉ”์„œ๋“œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ํด๋ž˜์Šค์— ์ ํ•ฉํ•œ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๊ฑฐ์˜ ์—†๋‹ค.

- 'ํด๋ž˜์Šค์ด๋ฆ„@16์ง„์ˆ˜๋กœํ‘œ์‹œ๋œํ•ด์‹œ์ฝ”๋“œ'๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋ฟ์ด๋‹ค.

ยท toString ์ผ๋ฐ˜ ๊ทœ์•ฝ์— ๋”ฐ๋ฅด๋ฉด '๊ฐ„๊ฒฐํ•˜๋ฉด์„œ ์‚ฌ๋žŒ์ด ์ฝ๊ธฐ ์‰ฌ์šด ํ˜•ํƒœ์˜ ์œ ์ตํ•œ ์ •๋ณด'๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๊ณ , '๋ชจ๋“  ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •'ํ•ด์•ผ ํ•œ๋‹ค.

ยท toString์„ ์ž˜ ๊ตฌํ˜„ํ•˜๋ฉด, ๊ทธ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ ์‹œ์Šคํ…œ์„ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์‰ฝ๋‹ค.

- toString ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด๋ฅผ println, printf, ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ ์—ฐ์‚ฐ์ž(+), assert ๊ตฌ๋ฌธ์— ๋„˜๊ธธ ๋•Œ, ๋””๋ฒ„๊ฑฐ๊ฐ€ ๊ฐ์ฒด๋ฅผ ์ถœ๋ ฅํ•  ๋•Œ ์ž๋™์œผ๋กœ ๋ถˆ๋ฆฐ๋‹ค.

- toString์„ ์ œ๋Œ€๋กœ ์žฌ์ •์˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์“ธ๋ชจ์—†๋Š” ๋ฉ”์‹œ์ง€๋งŒ ๋กœ๊ทธ์— ๋‚จ๋Š”๋‹ค.

ยท ์ข‹์€ toString์€ ์ปฌ๋ ‰์…˜์ฒ˜๋Ÿผ ์ด ์ธ์Šคํ„ด์Šค๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฐ์ฒด์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ธ๋‹ค.

ex) {Jenny=PhoneNumber@abbd}๋ณด๋‹ค๋Š” {Jenney=707-867-5309}๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ํ›จ์”ฌ ๋ฐ˜๊ฐ€์šธ ๊ฒƒ์ด๋‹ค.

ยท ์‹ค์ „์—์„œ toString์€ ๊ทธ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง„ ์ฃผ์š” ์ •๋ณด ๋ชจ๋‘๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค.

- ๋‹จ, ๊ฐ์ฒด๊ฐ€ ๊ฑฐ๋Œ€ํ•˜๊ฑฐ๋‚˜ ๊ฐ์ฒด์˜ ์ƒํƒœ๊ฐ€ ๋ฌธ์ž์—ด๋กœ ํ‘œํ˜„ํ•˜๊ธฐ์— ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค๋ฉด ์˜ˆ์™ธ๋‹ค. ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ๋Š” ์š”์•ฝ ์ •๋ณด๋ฅผ ๋‹ด๋„๋ก ํ•˜์ž.

- ์ด์ƒ์ ์œผ๋กœ๋Š” ์Šค์Šค๋กœ๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๋Š” ๋ฌธ์ž์—ด์ด์–ด์•ผ ํ•œ๋‹ค.

- toString์— ์ฃผ์š”ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ธฐ์ง€ ์•Š์•˜์„ ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ:

Assertion failure: expected {abc, 123}, but was {abc, 123}.

ยท toString์„ ๊ตฌํ˜„ํ•  ๋•Œ๋ฉด ๋ฐ˜ํ™˜๊ฐ’์˜ ํฌ๋งท์„ ๋ฌธ์„œํ™”ํ•  ์ง€ ์ •ํ•ด์•ผ ํ•œ๋‹ค.

- ์žฅ์ : ํฌ๋งท์„ ๋ช…์‹œํ•˜๋ฉด ๊ทธ ๊ฐ์ฒด๋Š” ํ‘œ์ค€์ ์ด๊ณ  ๋ช…ํ™•ํ•˜๊ณ , ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

- ๊ทธ ๊ฐ’ ๊ทธ๋Œ€๋กœ ์ž…์ถœ๋ ฅ์— ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ CSV ํŒŒ์ผ์ฒ˜๋Ÿผ ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๊ฐ์ฒด๋กœ ์ €์žฅํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

- ๋ช…์‹œํ•œ ํฌ๋งท์— ๋งž๋Š” ๋ฌธ์ž์—ด๊ณผ ๊ฐ์ฒด๋ฅผ ์ƒํ˜ธ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ •์  ํŒฉํ„ฐ๋ฆฌ๋‚˜ ์ƒˆ์„ฑ์ž๋ฅผ ํ•จ๊ป˜ ์ œ๊ณตํ•ด์ฃผ๋ฉด ์ข‹๋‹ค.

์ž๋ฐ” ํ”Œ๋žซํผ์— ๋งŽ์€ ๊ฐ’ ํด๋ž˜์Šค๊ฐ€ ๋”ฐ๋ฅด๋Š” ๋ฐฉ์‹์ด๋‹ค. ex) BigInteger, BigDecimal

/**
 * PhoneNumber ๊ฐ์ฒด(์ „ํ™”๋ฒˆํ˜ธ)์˜ ๋ฌธ์ž์—ด ํ‘œํ˜„์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
 * ๋ฌธ์ž์—ด์€ 14์ž์ด๋ฉฐ ํ˜•์‹์€ "(XXX) YYY-ZZZZ"์ด๋‹ค.
 * ์—ฌ๊ธฐ์„œ XXX๋Š” ์ง€์—ญ๋ฒˆํ˜ธ์ด๊ณ , YYY๋Š” ๊ตญ๋ฒˆ, ZZZZ๋Š” ์„ ๋ฒˆํ˜ธ์ด๋‹ค.
 * ๊ฐ, ์˜๋ฌธ ๋Œ€๋ฌธ์ž๋Š” ํ•œ ์ž๋ฆฌ์˜ ์‹ญ์ง„์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
 * ์ง€์ •๋œ ์ž๋ฆฌ์ˆ˜๊ฐ€ ๋‹ค ์ฑ„์›Œ์ง€์ง€ ์•Š์€ ๊ฒฝ์šฐ๋Š” ์„ธ ๋ถ€๋ถ„ ๋ชจ๋‘ 0์„ ์•ž์— ๋ถ™ํžŒ๋‹ค.
 * ์˜ˆ๋ฅผ ๋“ค์–ด, ์„ ๋ฒˆํ˜ธ์˜ ๊ฐ’์ด 123์ด๋ฉด, ๋ฌธ์ž์—ด ํ‘œํ˜„ ์‹œ "0123"์ด ๋œ๋‹ค.
 * ์ง€์—ญ๋ฒˆํ˜ธ์˜ ์šฐ ๊ด„ํ˜ธ ๋‹ค์Œ์—๋Š” ์ŠคํŽ˜์ด์Šค๋ฅผ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ•œ๋‹ค.
*/
@Override
public String toString() {
    return String.format("(%03d) %03d-%04d", areaCode, prefix, lineNumber);
}

- ๋‹จ์ : ํฌ๋งท์„ ํ•œ ๋ฒˆ ๋ช…์‹œํ•˜๋ฉด ํ‰์ƒ ๊ทธ ํฌ๋งท์— ์–ฝ๋งค์ด๊ฒŒ ๋œ๋‹ค.

ํฌ๋งท์„ ๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด, ํ–ฅํ›„ ๋ฆด๋ฆฌ์Šค์—์„œ ์ •๋ณด๋ฅผ ๋” ๋„ฃ๊ฑฐ๋‚˜ ํฌ๋งท์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐ์„ฑ์„ ์–ป๊ฒŒ ๋œ๋‹ค.

/**
 * ์ด ๋ถ€๋ถ„์˜ ๊ฐ„๋žตํ•œ ํ‘œํ˜„์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
 * ๋ฐ˜ํ™˜ ๋ฌธ์ž์—ด์˜ ํ˜•์‹์€ ์ •ํ•ด์ง€์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค.
 * ์ผ๋ฐ˜์ ์ธ ํ˜•ํƒœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค :
 *
* "[Potion #9: type=love, smell=turpentine, look=india ink]" */
@Override
public String toString() { ... }

ยท ์ •์  ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค(์•„์ดํ…œ 4)๋Š” toString์„ ์ œ๊ณตํ•  ์ด์œ ๊ฐ€ ์—†๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์—ด๊ฑฐ ํƒ€์ž…๋„ ๊ทธ๋ ‡๋‹ค.

- ๋Œ€๋ถ€๋ถ„์˜ ์—ด๊ฑฐ ํƒ€์ž…์€ ์ž๋ฐ”์—์„œ ์ด๋ฏธ ์™„๋ฒฝํ•œ toString์„ ์ œ๊ณตํ•œ๋‹ค.

ยท ํ•˜์œ„ ํด๋ž˜์Šค๋“ค์ด ๊ณต์œ ํ•ด์•ผ ํ•  ๋ฌธ์ž์—ด ํ‘œํ˜„์ด ์žˆ๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๋ผ๋ฉด toString์„ ์žฌ์ •์˜ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

ex) ๋‹ค์ˆ˜์˜ ์ปฌ๋ ‰์…˜ ๊ตฌํ˜„์ฒด๋Š” ์ถ”์ƒ ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค๋“ค์˜ toString ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์†ํ•ด ์“ด๋‹ค.

TODO: ์•„์ดํ…œ 13. clone ์žฌ์ •์˜๋Š” ์ฃผ์˜ํ•ด์„œ ์ง„ํ–‰ํ•˜๋ผ


ยท Cloneable์€ ๋ณต์ œํ•ด๋„ ๋˜๋Š” ํด๋ž˜์Šค์ž„์„ ๋ช…์‹œํ•˜๋Š” ์šฉ๋„์˜ ๋ฏน์Šค์ธ ์ธํ„ฐํŽ˜์ด์Šค(์•„์ดํ…œ 20)์ง€๋งŒ, ์˜๋„ํ•œ ๋ชฉ์ ์„ ์ œ๋Œ€๋กœ ์ด๋ฃจ์ง€ ๋ชปํ–ˆ๋‹ค.

- clone ๋ฉ”์„œ๋“œ๊ฐ€ ์„ ์–ธ๋œ ๊ณณ์ด Cloneable์ด ์•„๋‹Œ Object์ด๊ณ , ๊ทธ๋งˆ์ €๋„ protected๋‹ค. ๊ทธ๋ž˜์„œ Cloneable์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์™ธ๋ถ€ ๊ฐ์ฒด์—์„œ clone ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค.

- ๋ฆฌํ”Œ๋ ‰์…˜(์•„์ดํ…œ 65)์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ์ ‘๊ทผ์ด ํ—ˆ์šฉ๋œ clone ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋Š” ๋ณด์žฅ์ด ์—†๋‹ค.

ยท ์—ฌ๋Ÿฌ ๋ฌธ์ œ์ ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  Cloneable ๋ฐฉ์‹์€ ๋„๋ฆฌ ์“ฐ์ด๊ณ  ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ 1. clone ๋ฉ”์„œ๋“œ๋ฅผ ์ž˜ ๋™์ž‘ํ•˜๊ฒŒ๋” ํ•ด์ฃผ๋Š” ๊ตฌํ˜„ ๋ฐฉ๋ฒ•๊ณผ 2. ์–ธ์ œ ๊ทธ๋ ‡๊ฒŒ ํ•ด์•ผํ•˜๋Š”์ง€ ์ž˜์•Œ์•„์•ผํ•œ๋‹ค.

ยท Cloneable ์ธํ„ฐํŽ˜์ด์Šค๋Š” Object์˜ protected ๋ฉ”์„œ๋“œ์ธ clone์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•œ๋‹ค.

- Cloneable์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์—์„œ clone์„ ํ˜ธ์ถœํ•˜๋ฉด ๊ทธ ๊ฐ์ฒด์˜ ํ•„๋“œ๋“ค์„ ํ•˜๋‚˜ํ•˜๋‚˜ ๋ณต์‚ฌํ•œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์—์„œ ํ˜ธ์ถœํ•˜๋ฉด CloneNotSupportedException์„ ๋˜์ง„๋‹ค.

TODO: ์•„์ดํ…œ 14. Comparable์„ ๊ตฌํ˜„ํ• ์ง€ ๊ณ ๋ คํ•˜๋ผ


ยท Comparacle ์ธํ„ฐํŽ˜์ด์Šค๋Š” compareTo ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ–๋Š”๋‹ค.

ยท compareTo๋Š” ๋‘ ๊ฐ€์ง€๋งŒ ๋นผ๋ฉด, Object์˜ equals์™€ ๊ฐ™๋‹ค.

- compareTo๋Š” ๋‹จ์ˆœ ๋™์น˜์„ฑ ๋น„๊ต์— ๋”ํ•ด 1. ์ˆœ์„œ๊นŒ์ง€ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, 2. ์ œ๋„ค๋ฆญํ•˜๋‹ค.

- Comparable์„ ๊ตฌํ˜„ํ–ˆ๋‹ค๋Š” ๊ฒƒ์€ ๊ทธ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋“ค์—๋Š” ์ž์—ฐ์ ์ธ ์ˆœ์„œ(natural order)๊ฐ€ ์žˆ์Œ์„ ๋œปํ•œ๋‹ค.

public interface Comparable<T> {
    int compareTo(T t);
}

ยท Comparable์„ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด๋“ค์˜ ๋ฐฐ์—ด์„ ์†์‰ฝ๊ฒŒ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๋‹ค. Ex) Arrays.sort(a);

- ๊ฒ€์ƒ‰, ๊ทน๋‹จ๊ฐ’ ๊ณ„์‚ฐ, ์ž๋™ ์ •๋ ฌ๋˜๋Š” ์ปฌ๋ ‰์…˜ ๊ด€๋ฆฌ๋„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

// ๋ช…๋ น์ค„ ์ธ์ˆ˜๋“ค์„ (์ค‘๋ณต ์ œ๊ฑฐ ํ›„) ์•ŒํŒŒ๋ฒณ์ˆœ์œผ๋กœ ์ถœ๋ ฅํ•œ๋‹ค.
// String์ด Comparable์„ ๊ตฌํ˜„ํ•œ ๋•๋ถ„์— ๊ฐ€๋Šฅํ•˜๋‹ค.
public class WordList
{
    putlic static void main(String[] args)
    {
        Set<String> s = new TreeSet<>();
            Collections.addAll(s, args);
            System.out.println(s);
            }

ยท Comparable์„ ๊ตฌํ˜„ํ•˜๋ฉด, ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•˜๋Š” ์ˆ˜๋งŽ์€ ์ œ๋„ค๋ฆญ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์ปฌ๋ ‰์…˜์˜ ํž˜์„ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ๋‹ค.

- ์ž๋ฐ” ํ”Œ๋žซํผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ฑฐ์˜ ๋ชจ๋“  ๊ฐ’ ํด๋ž˜์Šค์™€ ์—ด๊ฒจ ํƒ€์ž…์€ Comparable์„ ๊ตฌํ˜„ํ•œ๋‹ค.

- ์•ŒํŒŒ๋ฒณ, ์ˆซ์ž, ์—ฐ๋Œ€ ๊ฐ™์ด ์ˆœ์„œ๊ฐ€ ๋ช…ํ™•ํ•œ ๊ฐ’ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ Comparable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์ž.

ยท compareTo ๋ฉ”์„œ๋“œ์˜ ์ผ๋ฐ˜ ๊ทœ์•ฝ์€ equals์˜ ๊ทœ์•ฝ๊ณผ ๋น„์Šทํ•˜๋‹ค.

์ด ๊ฐ์ฒด์™€ ์ฃผ์–ด์ง„ ๊ฐ์ฒด์˜ ์ˆœ์„œ๋ฅผ ๋น„๊ตํ•œ๋‹ค. ์ด ๊ฐ์ฒด๊ฐ€ ์ฃผ์–ด์ง„ ๊ฐ์ฒด๋ณด๋‹ค ์ž‘์œผ๋ฉด ์Œ์˜ ์ •์ˆ˜๋ฅผ, ๊ฐ™์œผ๋ฉด 0์„, ํฌ๋ฉด ์–‘์˜ ์ •์ˆ˜๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด ๊ฐ์ฒด์™€ ๋น„๊ตํ•  ์ˆ˜ ์—†๋Š” ํƒ€์ž…์˜ ๊ฐ์ฒด๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ClassCastException์„ ๋˜์ง„๋‹ค. ๋‹ค์Œ ์„ค๋ช…์—์„œ sgn(ํ‘œํ˜„์‹) ํ‘œ๊ธฐ๋Š” ์ˆ˜ํ•™์—์„œ ๋งํ•˜๋Š” ๋ถ€ํ˜ธ ํ•จ์ˆ˜(signum function)๋ฅผ ๋œปํ•˜๋ฉฐ, ํ‘œํ˜„์‹์˜ ๊ฐ’์ด ์Œ์ˆ˜, 0, ์–‘์ˆ˜์ผ ๋•Œ -1, 0, 1์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ •์˜ํ–ˆ๋‹ค.

  • Comparable์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋Š” ๋ชจ๋“  x, y์— ๋Œ€ํ•ด sgn(x.compartTo(y)) == -sgn.(y.compareTo(x))์—ฌ์•ผ ํ•œ๋‹ค(๋”ฐ๋ผ์„œ x.compareTo(y)๋Š” y.compareTo(x)๊ฐ€ ์˜ˆ์™ธ๋ฅผ ๋˜์งˆ๋•Œ์— ํ•œํ•ด ์˜ˆ์™ธ๋ฅผ ๋˜์ ธ์•ผ ํ•œ๋‹ค).

  • Comparable์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋Š” ์ถ”์ด์„ฑ์„ ๋ณด์žฅํ•ด์•ผ ํ•œ๋‹ค. ์ฆ‰, (x.compareTo(y) > 0 && y.compareTo(z) > 0)์ด๋ฉด x.compareTo(z) > 0์ด๋‹ค.

  • Comparable์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋Š” ๋ชจ๋“  z์— ๋Œ€ํ•ด x.compareTo(y) == 0์ด๋ฉด sgn(x.compareTo(z)) == sgn(y.compareTo(z))๋‹ค.

  • ์ด๋ฒˆ ๊ถŒ๊ณ ๊ฐ€ ํ•„์ˆ˜๋Š” ์•„๋‹ˆ์ง€๋งŒ ๊ผญ ์ง€ํ‚ค๋Š” ๊ฒŒ ์ข‹๋‹ค. (x.compareTo(y) == 0) == (x.equals(y))์—ฌ์•ผ ํ•œ๋‹ค. Comparable์„ ๊ตฌํ˜„ํ•˜๊ณ  ์ด ๊ถŒ๊ณ ๋ฅผ ์ง€ํ‚ค์ง€ ์•Š๋Š” ๋ชจ๋“  ํด๋ž˜์Šค๋Š” ๊ทธ ์‚ฌ์‹ค์„ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ช…์‹œํ•˜๋ฉด ์ ๋‹นํ•  ๊ฒƒ์ด๋‹ค.

"์ฃผ์˜ : ์ด ํด๋ž˜์Šค์˜ ์ˆœ์„œ๋Š” equals ๋ฉ”์„œ๋“œ์™€ ์ผ๊ด€๋˜์ง€ ์•Š๋‹ค."

ยท compareTo ๋ฉ”์„œ๋“œ์—์„œ ํ•„๋“œ์™€ ๊ฐ’์„ ๋น„๊ตํ•  ๋•Œ <, > ์—ฐ์‚ฐ์ž๋Š” ์“ฐ์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค.

- ๊ด€๊ณ„ ์—ฐ์‚ฐ์ž <, >๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์€ ์˜ค๋ฅ˜๋ฅผ ์œ ๋ฐœํ•œ๋‹ค. (๋ถ€๋™ ์†Œ์ˆ˜์  ๋น„๊ต๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž)

- ๋Œ€์‹  ๊ธฐ๋ณธ ํƒ€์ž… ํด๋ž˜์Šค๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ •์  compare ๋ฉ”์„œ๋“œ๋‚˜ Comparator ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋น„๊ต์ž ์ƒ์„ฑ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ž.

Last updated