์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- til
- ์ฝ๋ฉํ ์คํธ์ค๋น
- xv6
- ์ฐ๋ถํฌdb
- git merge
- ํ๋ ์ ๊ตฌ์กฐ
- reducible
- ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ
- 99ํด๋ฝ
- ์ค๋ฅ๊ฒ์ถ
- ํ ํฐ ๋ฒ์ค
- tcp ํ๋กํ ์ฝ
- ๊ฐ๋ฐ์์ทจ์
- ๋ฐ์ดํฐ ์ ์ก
- tcp ์ธ๊ทธ๋จผํธ
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- IEEE 802
- ์ฃผ๊ธฐ์ ํธ
- ์ค๋ ๋
- ์๋น์ค ํ๋ฆฌ๋ฏธํฐ๋ธ
- mariadb
- ํ๋ก์ด๋์์
- well known ํฌํธ
- ์ค๋ธ์
- ๋น์ฃผ๊ธฐ์ ํธ
- ์ค๋ฅ์ ์ด
- ํญํด99
- leetcode
- i-type
- ์์๋ฒํธ
- Today
- Total
Unfazedโ๏ธ๐ฏ
[Java] ์ฐธ์กฐ๋ณ์, ๋ฉ๋ชจ๋ฆฌ ์ฃผ์, hash code, identity hash code ๋ณธ๋ฌธ
[Java] ์ฐธ์กฐ๋ณ์, ๋ฉ๋ชจ๋ฆฌ ์ฃผ์, hash code, identity hash code
9taetae9 2025. 3. 10. 01:17Java์์ ์ฐธ์กฐ๋ณ์๋ ๋จ์ํ ๊ฐ์ฒด์ ์ฃผ์๊ฐ์ ์ ์ฅํ๊ณ ์๋ค๊ณ ์๊ฐํ๊ณ ์์๋๋ฐ, ์ฐธ์กฐ๋ณ์๋ฅผ ์ถ๋ ฅํด๋ณด์์ ๋๋ ํด๋์ค๋ช @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์ ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๋ฅผ ์ํํ๋ค.
- ๊ฐ์ฒด๋ฅผ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ์์น๋ก ๋ณต์ฌ
- ์ ์์น์ ๊ธฐ๋ฐํ์ฌ 32๋นํธ ์ฐธ์กฐ๊ฐ์ ๋ค์ ๊ณ์ฐ
- ๋ชจ๋ ๊ด๋ จ ์ฐธ์กฐ๊ฐ์ ์ ์์น๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ์ ๋ฐ์ดํธ(๋ชจ๋ ์ฐธ์กฐ๋ฅผ ์ ์ฐธ์กฐ๊ฐ์ผ๋ก ๊ฐฑ์ )
- ์ด์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํด์
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 ๊ฐ๋ฐ์์๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ณด๋ค ๊ฐ์ฒด์ ๋ ผ๋ฆฌ์ ์ํ์ ๊ด๊ณ์ ์ง์คํ๋ ๊ฒ์ด ์ค์ํ๋ค.
์ฐธ๊ณ ์๋ฃ:
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
'Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] String Pool (0) | 2025.04.09 |
---|---|
[Java] ์ฌ๋ฐ๋ฅธ Optional ์ฌ์ฉ์ผ๋ก API ์ค๊ณํ๊ธฐ (0) | 2025.02.26 |
[Java] null ์ฐธ์กฐ๋ก ์ธํด ๋ฐ์ํ๋ ๋ฌธ์ (0) | 2025.02.14 |
[Java] ์ค๋ ๋ ์์ฑ ๋ฉ์ปค๋์ฆ๊ณผ JVM์ ์ค๋ ๋ ๊ด๋ฆฌ ๋ฐฉ์์ผ๋ก ์ดํดํ๋ ์ค๋ ๋ start(), run() ๋ฉ์๋์ ์ฐจ์ด (0) | 2025.02.07 |
[Java] ์ค๋ ๋ ์ข ๋ฃ & Daemon ์ค๋ ๋ (0) | 2025.02.06 |