๊ด€๋ฆฌ ๋ฉ”๋‰ด

Unfazedโ—๏ธ๐ŸŽฏ

[Java] ์ฐธ์กฐ๋ณ€์ˆ˜, ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ, hash code, identity hash code ๋ณธ๋ฌธ

Java

[Java] ์ฐธ์กฐ๋ณ€์ˆ˜, ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ, hash code, identity hash code

9taetae9 2025. 3. 10. 01:17
728x90

Java์—์„œ ์ฐธ์กฐ๋ณ€์ˆ˜๋Š” ๋‹จ์ˆœํžˆ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ์ฐธ์กฐ๋ณ€์ˆ˜๋ฅผ ์ถœ๋ ฅํ•ด๋ณด์•˜์„ ๋•Œ๋Š” ํด๋ž˜์Šค๋ช…@16์ง„์ˆ˜ ํ•ด์‹œ์ฝ”๋“œ๋กœ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ  ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ฐธ์กฐ๋ณ€์ˆ˜๊ฐ€ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ธ์ง€ ๊ถ๊ธˆํ•ด์กŒ๋‹ค.

ํ•ด๋‹น ๊ธ€์—์„œ๋Š” ์ฐธ์กฐ ๋ณ€์ˆ˜๊ฐ€ ๊ฐ์ฒด๋ฅผ ์–ด๋–ป๊ฒŒ ์ฐธ์กฐํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์ฐธ์กฐ ๋ณ€์ˆ˜ ์ถœ๋ ฅ ์‹œ ๋‚˜ํƒ€๋‚˜๋Š” ํ•ด์‹œ์ฝ”๋“œ์™€ ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์˜ ๊ด€๊ณ„์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋ ค๊ณ ํ•œ๋‹ค.

Java์˜ ์ฐธ์กฐ ๋ณ€์ˆ˜

์ฐธ์กฐ๋ณ€์ˆ˜๋Š” ํž™(Heap) ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜์ง€๋งŒ, ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ง์ ‘ ์ฃผ์†Œ๊ฐ’์„ ๋…ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•œ๋‹ค. ๋Œ€์‹  toString() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํด๋ž˜์Šค๋ช…@ํ•ด์‹œ์ฝ”๋“œ ํ˜•์‹์˜ ๋ฌธ์ž์—ด์ด ๋ฐ˜ํ™˜๋œ๋‹ค.

 

ํ•ด์‹œ์ฝ”๋“œ vs ์‹ค์ œ ์ฃผ์†Œ

  • Product@1302068a์™€ ๊ฐ™์€ ํ•ด์‹œ์ฝ”๋“œ๋Š” ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์˜๋ฏธํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • JVM์€ ๊ฐ์ฒด ์‹๋ณ„์„ ์œ„ํ•ด ์ด๋Ÿฌํ•œ identity hash code๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ, ์ด ์‹๋ณ„์ž๋Š” ๊ฐ์ฒด์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๋™์•ˆ ์œ ์ง€๋˜๋Š” ๊ณ ์œ ๊ฐ’์ด๋‹ค.
  • ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋Š” jvm์˜ ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”์˜ ์ด์œ ๋กœ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(GC)์— ์˜ํ•ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ์—ฌ์ „ํžˆ ๋™์ผํ•œ identity hash code๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์‹๋ณ„ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

Product prod = new Product();

System.out.println(prod);
System.out.println(System.identityHashCode(prod));
System.out.println(Long.parseLong("5305068a", 16));

์•„๋ž˜๋Š” ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ์ถœ๋ ฅํ–ˆ์„๋•Œ์˜ ๊ฒฐ๊ณผ์™€ identityHashCode ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ ๊ฒฐ๊ณผ์ด๋‹ค.

5305068a์™€ 1392838282 ๋กœ ๊ฐ’์ด ๋‹ฌ๋ผ๋ณด์—ฌ ๋‹ค๋ฅธ ์˜๋ฏธ๋ฅผ ์ง€๋‹ˆ๊ณ  ์žˆ๋Š” ์ค„ ์•Œ์•˜์ง€๋งŒ,

5305068a(16์ง„์ˆ˜) 1392838282(10์ง„์ˆ˜)๋กœ ๋™์ผํ•œ identity hash code์ธ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ฆ‰, hashCode ๋ฉ”์„œ๋“œ๋ฅผ ๋ณ„๋„๋กœ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜์—ฌ ๋กœ์ง์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋‘๊ฒฝ์šฐ ๋ชจ๋‘ identity hash code๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

 

์ถ”๊ฐ€์ ์œผ๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ Java์—์„œ ํด๋ž˜์Šค๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ์ง€์ผœ์•ผ ํ•˜๋Š” ๊ณ„์•ฝ(contract)์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•ด๋ณด๊ฒ ๋‹ค.

  • ๋‘ ๊ฐ์ฒด๊ฐ€ equals()์— ์˜ํ•ด ๋™๋“ฑํ•˜๋‹ค๋ฉด, ๋‘ ๊ฐ์ฒด์˜ hashCode() ๋ฐ˜ํ™˜๊ฐ’์€ ๋ฐ˜๋“œ์‹œ ๊ฐ™์•„์•ผ ํ•œ๋‹ค.
  • ๋‘ ๊ฐ์ฒด์˜ hashCode()๊ฐ€ ๊ฐ™๋‹ค๊ณ  ํ•ด์„œ equals()์— ์˜ํ•ด ๋™๋“ฑํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค(ํ•ด์‹œ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ).

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

์ด๊ฒƒ์€ Java๊ฐ€ ์ž๋™์œผ๋กœ ๊ณ ๋ คํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—, ํด๋ž˜์Šค์˜ equals()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•  ๋•Œ๋Š” ํ•ญ์ƒ hashCode()๋„ ํ•จ๊ป˜ override ํ•ด์ฃผ์ž.

 

ํ•ด์‹œ ์ฝ”๋“œ ์ƒ์„ฑ ๋ฐฉ์‹

์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” 64bit JVM์—์„œ๋Š” 8byte ์ฃผ์†Œ๊ฐ’์œผ๋กœ 4byte ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ํ•ด์‹œ์ฝ”๋“œ๊ฐ€ ์ค‘๋ณต๋  ์—ฌ์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜ ๊ฐ’์œผ๋กœ ๊ฐ์ฒด๊ฐ€ ๋™์ผํ•œ์ง€ ํŒ๋‹จํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด equals ๋ฉ”์„œ๋“œ์™€ hashCode ๋ฉ”์„œ๋“œ๋„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.

 

์‹ค์ œ HotSpot JVM์—์„œ๋Š” ๋‹จ์ˆœํžˆ ์ฃผ์†Œ์˜ ์ผ๋ถ€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ดˆ๊ธฐ ํ˜ธ์ถœ ์‹œ ์Šค๋ ˆ๋“œ ๋กœ์ปฌ PRNG๋‚˜ ๊ธฐํƒ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜(Marsaglia์˜ XOR-Shift ๋“ฑ)์„ ์‚ฌ์šฉํ•ด identity hash code๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ด๋ฅผ ๊ฐ์ฒด ํ—ค๋”์— ์ €์žฅํ•œ๋‹ค. ๋”ฐ๋ผ์„œ “๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์—์„œ ํŒŒ์ƒ๋œ๋‹ค”๊ณ  ํ‘œํ˜„ํ–ˆ์ง€๋งŒ, ๊ตฌํ˜„์— ๋”ฐ๋ผ์„œ๋Š” ์™„์ „ํžˆ ๋‚œ์ˆ˜์— ๊ธฐ๋ฐ˜ํ•œ ๋ฐฉ์‹์ผ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

 

๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ vs ๊ฐ์ฒด ์ฐธ์กฐ

C/C++์˜ ํฌ์ธํ„ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ฌผ๋ฆฌ์  ์ฃผ์†Œ๋ฅผ ์ง์ ‘ ์ €์žฅํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ

Java์—์„œ ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ง์ ‘ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ์›์น™์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋Š” JVM์ด ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์ถ”์ƒํ™”ํ•˜๊ณ  ๋ฌผ๋ฆฌ์  ์ฃผ์†Œ ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํŠน์ˆ˜ํ•œ ๋ฐฉ๋ฒ•(ex: sun.misc.Unsafe ํด๋ž˜์Šค)์œผ๋กœ ์ ‘๊ทผ ์‹œ๋„๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ •๋ณด๋„ ์žˆ์—ˆ์ง€๋งŒ ๊ถŒ์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ ํ•œ๋‹ค.

JVM์€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(GC)์„ ํ†ตํ•ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ์ž๋™์œผ๋กœ ์ •๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ฑฐ๋‚˜ ํ•ด์ œํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

์ถ”์ƒํ™”๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณต์žกํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ณ ๋„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

๋”ฐ๋ผ์„œ Java ๊ฐœ๋ฐœ์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ณด๋‹ค ๊ฐ์ฒด์˜ ๋…ผ๋ฆฌ์  ์ƒํƒœ์™€ ๊ด€๊ณ„ ๊ด€๋ฆฌ์— ์ง‘์ค‘ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค.

 

 

 ์ผ๋ฐ˜์ ์œผ๋กœ “์ฐธ์กฐ ๋ณ€์ˆ˜๋Š” ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค”๋ผ๋Š” ์„ค๋ช…์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋‹จ์ˆœํ™”ํ•œ ํ‘œํ˜„์ด๋‹ค. ์‹ค์ œ๋กœ๋Š” JVM ๋‚ด๋ถ€์—์„œ ์ฐธ์กฐ ๋ณ€์ˆ˜๋Š” ๊ฐ์ฒด๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•œ “ํ•ธ๋“ค(handle)” ํ˜น์€ “ํฌ์ธํ„ฐ” ์—ญํ• ์„ ํ•˜๋ฉฐ, ๋ฌผ๋ฆฌ์  ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์™€๋Š” ์ถ”์ƒํ™”๋œ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง„๋‹ค. ํŠนํžˆ, GC๊ฐ€ ๊ฐ์ฒด๋ฅผ ์ด๋™์‹œํ‚ฌ ๋•Œ ์ฐธ์กฐ ๋ณ€์ˆ˜๋Š” ์ž๋™์œผ๋กœ ์ƒˆ ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ์—…๋ฐ์ดํŠธ๋˜๋ฏ€๋กœ, ์‹ค์ œ ๋ฌผ๋ฆฌ์  ์ฃผ์†Œ๋Š” ๋ณ€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐ์ฒด์˜ identity๋Š” ์œ ์ง€๋œ๋‹ค. ์ด๋ฅผ ๊ฐ„๋žตํ•œ ํ”„๋กœ์„ธ์Šค๋กœ ์ •๋ฆฌํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

๊ฐ์ฒด ์ด๋™๊ณผ ์ฐธ์กฐ๊ฐ’ ๊ฐฑ์‹  ํ”„๋กœ์„ธ์Šค

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์ค‘ ๊ฐ์ฒด๊ฐ€ ์ด๋™๋  ๋•Œ, JVM์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  1. ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜๋กœ ๋ณต์‚ฌ
  2. ์ƒˆ ์œ„์น˜์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ 32๋น„ํŠธ ์ฐธ์กฐ๊ฐ’์„ ๋‹ค์‹œ ๊ณ„์‚ฐ
  3. ๋ชจ๋“  ๊ด€๋ จ ์ฐธ์กฐ๊ฐ’์„ ์ƒˆ ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ์—…๋ฐ์ดํŠธ(๋ชจ๋“  ์ฐธ์กฐ๋ฅผ ์ƒˆ ์ฐธ์กฐ๊ฐ’์œผ๋กœ ๊ฐฑ์‹ )
  4. ์ด์ „ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ•ด์ œ

JVM์€ ์œ„์™€ ๊ฐ™์€ ๊ณผ์ •์„ ํ†ตํ•ด ์ฐธ์กฐ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ํšจ์œจ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ๋„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์˜๋ฏธ๋ก ์  ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•œ๋‹ค.

 

== ์—ฐ์‚ฐ์ž

๋“ฑ๊ฐ€ ์—ฐ์‚ฐ์ž(==)๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ ๋‚ด์—์„œ ๋น„๊ต ๋Œ€์ƒ์ด ์–ด๋””(Heap, Stack)์— ์œ„์น˜ํ•˜๊ณ  ์žˆ๋Š”์ง€, ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ €์žฅ๋˜์–ด ์žˆ๋Š”์ง€์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.

๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ ํƒ€์ž…์—์„œ์˜ ๋“ฑ๊ฐ€ ์—ฐ์‚ฐ์ž(==)

๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ ํƒ€์ž…(Primitive Type)์— ๋Œ€ํ•ด ๋“ฑ๊ฐ€ ์—ฐ์‚ฐ์ž(==)๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, JVM์€ ํ•ด๋‹น ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ์‹ค์ œ ๊ฐ’์„ ์ง์ ‘ ๋น„๊ตํ•œ๋‹ค. ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ Stack ์˜์—ญ์— ์ง์ ‘ ๊ฐ’์ด ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋“ฑ๊ฐ€ ์—ฐ์‚ฐ์ž๋Š” ์ด Stack์— ์žˆ๋Š” ๊ฐ’๋“ค์„ ๋น„๊ตํ•˜๊ฒŒ ๋œ๋‹ค.

 

์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ ํƒ€์ž…์—์„œ์˜ ๋“ฑ๊ฐ€ ์—ฐ์‚ฐ์ž(==)

์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ ํƒ€์ž…(Reference Type)์— ๋Œ€ํ•ด ๋“ฑ๊ฐ€ ์—ฐ์‚ฐ์ž(==)๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, JVM์€ ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ(์ฐธ์กฐ๊ฐ’)๋ฅผ ๋น„๊ตํ•œ๋‹ค. ์ฐธ์กฐ ๋ณ€์ˆ˜๋Š” Stack ์˜์—ญ์— ์ €์žฅ๋˜์ง€๋งŒ, ์‹ค์ œ ๊ฐ์ฒด๋Š” Heap ์˜์—ญ์— ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— Stack์— ์ €์žฅ๋œ ์ฐธ์กฐ๊ฐ’(32๋น„ํŠธ ๋˜๋Š” 64๋น„ํŠธ ์ •์ˆ˜ ํ˜•ํƒœ)์ด ๊ฐ™์€์ง€๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

"==" ์—ฐ์‚ฐ์ž๊ฐ€ ๋น„๊ตํ•˜๋Š” ๊ฐ’์€ JVM ๋‚ด๋ถ€์—์„œ ๊ฐ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” "์ฐธ์กฐ ๊ฐ’"(๋ฉ”๋ชจ๋ฆฌ์ƒ์˜ ์ฃผ์†Œ ๋˜๋Š” ์••์ถ• ํฌ์ธํ„ฐ)์ด๋‹ค.
OpenJDK 64๋น„ํŠธ JVM์—์„œ๋Š” ํž™์ด ์ž‘์„ ๊ฒฝ์šฐ 'compressed oops'๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด 64๋น„ํŠธ ์ฐธ์กฐ๊ฐ’์ด 32๋น„ํŠธ๋กœ ์••์ถ•(๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ ์ค„์ด๊ธฐ ์œ„ํ•จ)๋˜์–ด ์ €์žฅ๋œ๋‹ค. ์ด ์••์ถ•๋œ ์ฐธ์กฐ ๊ฐ’์ด "==" ์—ฐ์‚ฐ์ž์— ์˜ํ•ด ๋น„๊ต๋œ๋‹ค.
์ฆ‰, ๋‘ ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ์ฐธ์กฐ ๊ฐ’(๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๋˜๋Š” ์••์ถ•๋œ ๊ฐ’)์ด ๊ฐ™๋‹ค๋ฉด "==" ๋น„๊ต ๊ฒฐ๊ณผ๋Š” true๊ฐ€ ๋œ๋‹ค.

 

 

JVM์—์„œ ์••์ถ• ํฌ์ธํ„ฐ(compressed oops)๋Š” 64๋น„ํŠธ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ผ์ • ๊ธฐ์ค€(๋ฒ ์ด์Šค์™€ ์‹œํ”„ํŠธ ๊ฐ’)์— ๋”ฐ๋ผ 32๋น„ํŠธ ์ •์ˆ˜๋กœ ์••์ถ•ํ•œ ๊ฐ’์ด๋‹ค. ์••์ถ•๊ฒฐ๊ณผ๋กœ ๋‚˜์˜จ ๊ฐ’์€ ์—ฌ์ „ํžˆ ๊ฐ ๊ฐ์ฒด๋ฅผ ์œ ์ผํ•˜๊ฒŒ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ๋‹ค. ์ด ์••์ถ•๊ฐ’์€ ํ•„์š” ์‹œ ๋ณต์›๋˜์–ด ์‹ค์ œ ์ฃผ์†Œ๋กœ ๋ณ€ํ™˜๋˜์ง€๋งŒ, identity hash code์™€๋Š” ๋ณ„๊ฐœ๋กœ ๊ด€๋ฆฌ๋œ๋‹ค. ์ฆ‰, ์••์ถ• ํฌ์ธํ„ฐ ์‚ฌ์šฉ์€ ๊ฐ์ฒด ์‹๋ณ„(identity hash code)๊ณผ๋Š” ์ง์ ‘์ ์ธ ์—ฐ๊ด€์ด ์—†๋‹ค.

 

 

Compressed OOPs๋Š” ์•ฝ 32GB๊นŒ์ง€์˜ ํž™ ํฌ๊ธฐ์—์„œ๋งŒ ํšจ๊ณผ์ ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค. (์‹ค์ œ๋กœ๋Š” ๋„ ํŽ˜์ด์ง€(null page)์™€ ์ •๋ ฌ ์š”๊ตฌ ์‚ฌํ•ญ์œผ๋กœ ์ธํ•ด ์ด ํ•œ๊ณ„๋Š” 32GB๋ณด๋‹ค๋Š” ์•ฝ๊ฐ„ ๋‚ฎ๋‹ค๊ณ  ํ•จ)

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋งค์šฐ ํฐ ํž™(2^32๊ฐœ ์ด์ƒ์˜ ๊ฐ์ฒด๊ฐ€ ๋™์‹œ์— ์กด์žฌํ•  ์ •๋„์˜ ํฌ๊ธฐ)์„ ํ•„์š”๋กœ ํ•œ๋‹ค๋ฉด, JVM์€ ์ž๋™์œผ๋กœ Compressed OOPs๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  ์ „์ฒด 64๋น„ํŠธ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ๋˜๋ฉด 32๋น„ํŠธ๋กœ ์••์ถ•ํ–ˆ๋˜ ์ด์ ์ด ์‚ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์— Compressed OOPs์˜ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ์„ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  ํž™ ํฌ๊ธฐ๋ฅผ 32GB ์ดํ•˜๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค.

 

 

System.identityHashCode()๋Š” ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ๊ธฐ๋ฐ˜ํ•ด ๊ณ„์‚ฐ๋˜๊ณ  ๊ฐ์ฒด์˜ ์ˆ˜๋ช… ๋™์•ˆ ํ•ด๋‹น identityHashCode ๊ฐ’์€ ๋ณ€ํ•˜์ง€ ์•Š๋„๋ก JVM์— ์˜ํ•ด ๊ด€๋ฆฌ๋œ๋‹ค. indentityHashCode๊ฐ’์€ 32๋น„ํŠธ ์ •์ˆ˜๋กœ ๋ฐ˜ํ™˜๋˜๋ฏ€๋กœ ์ด๋ก ์ ์œผ๋กœ ์ถฉ๋Œ(๋™์ผํ•œ ํ•ด์‹œ๊ฐ’)์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ฐ’์€ ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ, ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ํ•ด์‹œ ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๊ฐ’์ด๋‹ค.

๋”ฐ๋ผ์„œ System.identityHashCode()์˜ 32๋น„ํŠธ ์ •์ˆ˜ ํ‘œํ˜„์€ Compressed OOPs์™€ ๊ฐ™์€ ํฌ์ธํ„ฐ ์••์ถ• ๊ธฐ์ˆ ๊ณผ๋Š” ๋ณ„๊ฐœ์˜ ๊ฐœ๋…์ด๋‹ค. 

 

"==" ์—ฐ์‚ฐ์ž๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์ƒ์˜ ์ฃผ์†Œ(์ฐธ์กฐ ๊ฐ’)๋ฅผ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‘ ๊ฐ์ฒด๊ฐ€ ๊ฐ™์€ System.identityHashCode() ๊ฐ’์„ ๊ฐ€์ง„๋‹ค๊ณ  ํ•˜๋”๋ผ๋„, ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ๋‹ค๋ฅด๋ฉด "==" ์—ฐ์‚ฐ์ž๋Š” false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
์ฆ‰, ๊ฐ์ฒด์˜ == ์—ฐ์‚ฐ์€ System.identityHashCode()๊ฐ€ ์•„๋‹ˆ๋ผ, JVM ๋‚ด๋ถ€์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ์ฐธ์กฐ(๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ) ๋น„๊ต๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง„๋‹ค.

 

 

 

 

์ •๋ฆฌ 

Java์˜ ์ฐธ์กฐ ๋ณ€์ˆ˜๋Š” ๋ฌผ๋ฆฌ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ์•„๋‹Œ . ์ฐธ์กฐ ๋ณ€์ˆ˜๋ฅผ ์ถœ๋ ฅํ–ˆ์„ ๋•Œ ๋‚˜ํƒ€๋‚˜๋Š” ํ•ด์‹œ์ฝ”๋“œ๋Š” ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ์•„๋‹Œ ๊ฐ์ฒด์˜ ๊ณ ์œ  ์‹๋ณ„์ž๋กœ, JVM์˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๊ณผ์ •์—์„œ ๊ฐ์ฒด๊ฐ€ ์ด๋™ํ•˜๋”๋ผ๋„ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

64๋น„ํŠธ JVM์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ์„ ์œ„ํ•ด ์ฐธ์กฐ๊ฐ’์„ 32๋น„ํŠธ๋กœ ์••์ถ•ํ•˜๋Š” ๊ธฐ์ˆ (Compressed OOPs)์ด ์‚ฌ์šฉ๋˜๋ฉฐ, == ์—ฐ์‚ฐ์ž๋Š” ์ด๋Ÿฌํ•œ ๋‚ด๋ถ€ ์ฐธ์กฐ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค.

System.identityHashCode()๋Š” ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์—์„œ ํŒŒ์ƒ๋œ ๊ฐ’(๋‹จ์ˆœํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๋ฉด)์ด์ง€๋งŒ ์ง์ ‘์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋Š” ์•„๋‹ˆ๋‹ค.

Java์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณต์žกํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์„ธ๋ถ€์‚ฌํ•ญ์— ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ณ ๋„ ์•ˆ์ „ํ•˜๊ฒŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— Java ๊ฐœ๋ฐœ์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ณด๋‹ค ๊ฐ์ฒด์˜ ๋…ผ๋ฆฌ์  ์ƒํƒœ์™€ ๊ด€๊ณ„์— ์ง‘์ค‘ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

 

 

์ฐธ๊ณ  ์ž๋ฃŒ:

https://codingdog.tistory.com/entry/java-hashCode-vs-identityHashcode-%EC%9D%B4-%EB%91%98%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%B4-%EB%8B%A4%EB%A5%BC%EA%B9%8C%EC%9A%94

 

java hashCode vs identityHashcode : ์ด ๋‘˜์€ ๋ฌด์—‡์ด ๋‹ค๋ฅผ๊นŒ์š”?

Java hashCode๋ž‘ identityHashCode์˜ ์ฐจ์ด์ ์ด ๋ฌด์—‡์ผ๊นŒ์š”? ๊ทธ์— ๋Œ€ํ•ด์„œ ๋‹ต์„ ํ•˜๊ธฐ ์ „์—, ๊ฐ„๋‹จํ•œ ์‹คํ—˜์„ ํ•˜๊ณ  ๋„˜์–ด๊ฐ‘์‹œ๋‹ค. identityHashCode๋Š” ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅด๋ฉด, ๋ฌด์กฐ๊ฑด ๋‹ค๋ฅธ ๊ฐ’์„ ๋ฆฌํ„ดํ• ๊นŒ์š”? ์ฆ‰, ์ด ๋ฉ”์„œ๋“œ์˜

codingdog.tistory.com

https://stackoverflow.com/questions/1382026/how-is-the-operator-implemented-in-java

 

How is the == operator implemented in Java?

Specifically, in the case of object reference equality, what does the == operator do? Does the comparison return true if the references evaluate to the same object address at the time of compariso...

stackoverflow.com

https://wiki.openjdk.org/display/lilliput/Compact+Identity+Hashcode

 

Compact Identity Hashcode - Compact Identity Hashcode - OpenJDK Wiki

 

wiki.openjdk.org

https://users.elis.ugent.be/~leeckhou/papers/ecoop07.pdf

https://alidg.me/blog/2020/7/15/hash-code

 

On Generating Identity Hash Codes

This simple piece of code probably prints one of the most misunderstood outputs in Java: System.out.println(new Object()); And that output would be: java.lang.Object@69663380 What does that part after @ represent? Is this the memory address of the object?

alidg.me

https://www.baeldung.com/java-equals-hashcode-contracts

 

 

728x90