Gradle ์ด๋ž€?

์ž๋ฐ”๋ฅผ ์ด์šฉํ•ด์„œ ์ฝ”๋”ฉ์„ ํ•˜๋‹ค๋ณด๋ฉด Gradle ์„ ์‚ฌ์šฉํ•ด์„œ ๋นŒ๋“œํ•˜๋Š” ๊ฒฝํ—˜์„ ๋งŽ์ด ํ•œ๋‹ค.

๊ทผ๋ฐ ์ด Gradle ์€ ์ •ํ™•ํžˆ ์–ด๋–ค ์—ญํ• ์„ ํ• ๊นŒ?

๊ณต์‹๋ฌธ์„œ๋ฅผ ๋จผ์ € ์ฐพ์•„๋ณด๋ฉด,

Gradle is an open-source build automation tool flexible enough to build almost any type of software.

 

Gradle ์€ ์Šค์Šค๋กœ ๋นŒ๋“œ ์ž๋™ํ™”(build automation) ํˆด์ด๋ผ๊ณ  ์†Œ๊ฐœํ•˜๊ณ  ์žˆ๋‹ค.

 

๐Ÿง ๋นŒ๋“œ๋ž€ ๋ฌด์—‡์ผ๊นŒ?

์ž๋ฐ”์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผ ๊ณผ์ •์„ ๊ฑฐ์ณ์„œ ์ปดํ“จํ„ฐ๊ฐ€ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ๋กœ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๊ณผ์ •์„ ๋งํ•œ๋‹ค.

 

 

๊ทธ๋ ‡๋‹ค๋ฉด ์ผ๋‹จ Gradle์ด ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ๊ด€๋ฆฌํ•ด์คŒ์œผ๋กœ์จ ๊ฐœ๋ฐœ์ž์˜ ์‚ถ์„ ์ข€ ๋” ์œคํƒํ•˜๊ฒŒ ํ•ด์ค€๋‹ค๋Š” ๊ฒƒ์€ ์•Œ๊ฑฐ๊ฐ™๋‹ค.

๊ตฌ์ฒด์ ์œผ๋กœ Gradle์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ์„ ํ•œ๋‹ค. (์Šคํ”„๋ง ๊ธฐ์ค€)

 

Compile

- ์ž๋ฐ” ํŒŒ์ผ์„ ์ปดํ“จํ„ฐ๊ฐ€ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•ด์ค€๋‹ค.

 

Test

- ํ”„๋กœ๊ทธ๋žจ์ด ์ œ๋Œ€๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ง€์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง€์›ํ•ด์ค€๋‹ค.

 

Pakaging

- ์ปดํŒŒ์ผ ๋œ ์ฝ”๋“œ๋กœ ์‹คํ–‰ ํŒŒ์ผ์„ ๋งŒ๋“ ๋‹ค.

 

Deploy & Run

- ์‹ค์ œ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰์‹œํ‚จ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ์Šคํ”„๋ง ์„œ๋ฒ„๋ฅผ ๋Œ๋ฆฌ๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.

 

ํ•˜์ง€๋งŒ Gradle์ด ๋‹ค๋ฅธ ํˆด๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ ์–ด๋–ค ์žฅ์ ์ด ์žˆ์–ด์„œ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฑธ๊นŒ?

 

Gradle, ์™œ ์“ฐ๋Š” ๊ฑธ๊นŒ?

 

๋‹ค๋ฅธ ํˆด๋“ค๊ณผ ๋น„๊ตํ•ด๋ดค์„ ๋•Œ Gradle์ด ๊ฐ€์ง€๋Š” ์žฅ์ ์ด ๋ช‡๊ฐ€์ง€ ์žˆ๋‹ค.

๊ทธ ์žฅ์ ๋“ค์— ๋Œ€ํ•ด์„œ ํ•˜๋‚˜์”ฉ ์•Œ์•„๋ณด์ž

 

๊ฐ„๊ฒฐํ•œ ์Šคํฌ๋ฆฝํŠธ

 

Gradle์˜ ์žฅ์ ์€ ๋จผ์ € ์Šคํฌ๋ฆฝํŠธ๋งŒ ๋ด๋„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๋จผ์ € ๊ฒฝ์Ÿ์ž์ธ Maven์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ณด์ž !

 

Maven์˜ ๊ฒฝ์šฐ์—๋Š” XML ํ˜•์‹์˜ ์Šคํฌ๋ฆฝํŠธ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด์„œ ๊ฐ€๋…์„ฑ๋„ ๋–จ์–ด์ง€๊ณ  ์ž‘์„ฑํ•˜๊ธฐ๋„ ์–ด๋ ต๋‹ค.

ํ•˜์ง€๋งŒ Gradle ๊ฐ™์€ ๊ฒฝ์šฐ ์„ค์ • ์ฃผ์ž… ๋ฐฉ์‹์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•ด์คŒ์œผ๋กœ์จ ๊ฐ€๋…์„ฑ๋„ ์ข‹์•„์ง€๊ณ  ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๋ฉ€ํ‹ฐ ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ

ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋‹ค ๋ณด๋ฉด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ชจ๋“ˆ๋กœ ๊ตฌ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

ํ•˜์ง€๋งŒ ์ด ๋•Œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ชจ๋“ˆ์„ ๋”ฐ๋กœ ๋นŒ๋“œํ•˜๊ฒŒ ๋˜๋ฉด ๋ฒˆ๊ฑฐ๋กญ๊ธฐ๋„ ํ•˜๊ณ  ์‹ค์ˆ˜ํ•  ๊ฐ€๋Šฅ์„ฑ๋„ ์ƒ๊ธด๋‹ค.

 

Gradle์€ ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ชจ๋“ˆ๋“ค์„ ๋™์‹œ์— ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ ๋ชจ๋“ˆ๋งˆ๋‹ค ๊ณตํ†ต๋œ ์ฝ”๋“œ , ๋ณ„๋„์˜ ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•ด ์คŒ์œผ๋กœ์จ ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

 

๋น ๋ฅธ ๋นŒ๋“œ ์†๋„

์œ„์—์„œ ๋งํ•œ ๊ฒƒ๋“ค๋งŒ ๋ชจ๋‘ ํ•ด์ค€๋‹ค๊ณ  ํ•ด๋„ ์ถฉ๋ถ„ํžˆ ์“ธ๋งŒํ•œ ํˆด์ด๋‹ค.

๊ทผ๋ฐ ์—ฌ๊ธฐ์— ์†๋„๊นŒ์ง€ ๋น ๋ฅด๋‹ค๋ฉด ? ๊ทธ ์–ด๋ ค์šด ๊ฑธ Gradle ์ด ๋‹ค์‹œ ํ•ด๋‚ด๋ฒ„๋ ธ๋‹ค.

 

ํ‘œ๋ฅผ ๋ณด๋ฉด Gradle ์€ ๊ฒฝ์Ÿ์‚ฌ ๋Œ€๋น„ ์›”๋“ฑํžˆ ๋น ๋ฅธ ์†๋„๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ๋‹ค.

ํŽธ๋ฆฌํ•˜๊ณ  ๋น ๋ฅธ Gradle .. ์•ˆ ์“ธ ์ด์œ ๊ฐ€ ์—†์ง€ ์•Š์„๊นŒ?

์ž ๊น Gradle ์€ ๋Œ€์ฒด ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์—ˆ๊ธธ๋ž˜ ๋น ๋ฅธ๊ฑธ๊นŒ?

 

Gradle, ์™œ ๋น ๋ฅธ ๊ฑธ๊นŒ?

๋‹ค์‹œ Gradle์˜ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ๋ณด์ž

Gradle avoids unnecessary work by only running tasks that need to do work because inputs or outputs have changed. Gradle uses various caches to reuse outputs from previous builds. With a shared build cache, you can even reuse outputs from other machines.

 

 

์ด ๋ฌธ์žฅ์„ ์š”์•ฝํ•˜๋ฉด Gradle์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ถˆํ•„์š”ํ•œ ์ž‘์—…์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์บ์‹œ๋ฅผ ํ†ตํ•ด ์žฌ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋Œ€ํ‘œ์ ์œผ๋กœ 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

 

์ ์ง„์  ๋นŒ๋“œ

๋นŒ๋“œ๋ฅผ ํ•  ๋•Œ ๋ชจ๋“  ํŒŒ์ผ๋“ค์„ ๋‹ค์‹œ ๋นŒ๋“œํ•˜๋Š” ๊ฒŒ ์•„๋‹Œ , ๋ฐ”๋€ ํŒŒ์ผ๋“ค๋งŒ ์ถ”์ ํ•ด์„œ ํ•ด๋‹น ํŒŒ์ผ๋งŒ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด 20๊ฐœ์˜ ํŒŒ์ผ์„ ๋นŒ๋“œํ•  ๋•Œ 15๊ฐœ์˜ ํŒŒ์ผ์ด ๊ทธ๋Œ€๋กœ๋ฉด ๋‚˜๋จธ์ง€ 5๊ฐœ์˜ ํŒŒ์ผ๋งŒ ๋นŒ๋“œํ•˜๋Š” ํ˜•์‹์ด๋‹ค.

 

๋นŒ๋“œ ์บ์‹œ

์—ฌ๋Ÿฌ ๋ฒˆ์˜ ๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ Gradle์€ ์ด๋ฏธ ๋นŒ๋“œ๊ฐ€ ๋œ ๊ฒฐ๊ณผ๋ฌผ๋“ค์„ ๋นŒ๋“œ ์บ์‹œ์— ๋‹ด์•„๋†“๋Š”๋‹ค.

์ถ”ํ›„์— ํ•ด๋‹น ํŒŒ์ผ์— ๋Œ€ํ•ด ๋‹ค์‹œ ๋นŒ๋“œ๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด, ๋‹ค์‹œ ๋นŒ๋“œํ•  ํ•„์š”์„ฑ์„ ์ค„์—ฌ์คŒ์œผ๋กœ์จ ๋นŒ๋“œ๋ฅผ ๋”์šฑ ๋นจ๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ํ˜น์€ ๋นŒ๋“œ ์บ์‹œ๋ฅผ ๋กœ์ปฌ์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ , ํŒ€์›๋“ค๋ผ๋ฆฌ ๋นŒ๋“œ ์บ์‹œ๋ฅผ ๊ณต์œ ํ•ด์„œ ๋นŒ๋“œ ๊ฒฐ๊ณผ๋“ค์„ ์บ์‹œ์— ๋‹ด์•„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๋ฐ๋ชฌ ํ”„๋กœ์„ธ์Šค

 

๋ฐ๋ชฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์•Œ์•„๋ณด๊ธฐ ์ „์— ๋ฐ๋ชฌ์€ ๋ฌด์—‡์ผ๊นŒ?

Gradle์—์„œ ๋˜ ์นœ์ ˆํ•˜๊ฒŒ ๋ฐ๋ชฌ์˜ ์ •์˜๋ฅผ ๋งํ•ด์ฃผ๊ณ  ์žˆ๋‹ค.

A daemon is a computer program that runs as a background process, rather than being under the direct control of an interactive user.

 

 

ํ•ด์„ํ•˜์ž๋ฉด , ๋ฐ๋ชฌ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ œ์–ดํ•˜์ง€ ์•Š๊ณ  ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํ”„๋กœ์„ธ์Šค๋กœ ๋Œ์•„๊ฐ€๋Š” ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค.

 

์ด๊ฒƒ์„ ๋นŒ๋“œ์— ์–ด๋–ป๊ฒŒ ๋„์ž…ํ–ˆ์„๊นŒ?

Gradle์€ JVM์ด๋ผ๋Š” ๊ฐ€์ƒ ์žฅ์น˜ ์œ„์—์„œ ์‹คํ–‰๋˜๋ฉฐ ์ด JVM์€ ์—ฌ๋Ÿฌ ์ดˆ๊ธฐํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ด ๊ณผ์ •์€ ๊ฝค ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

๋•Œ๋ฌธ์— ๋งค๋ฒˆ ์ƒˆ๋กœ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋™์ผํ•œ ๋นŒ๋“œ๋Š” ์ด๋ฏธ ์‹คํ–‰์ค‘์ธ ๋ฐ๋ชฌ์„ ์ด์šฉํ•˜์—ฌ์„œ ๋นŒ๋“œ ์‹œ๊ฐ„์„ ์ค„์—ฌ์ค€๋‹ค.

 

 

 

์˜ˆ๋ฅผ ๋“ค์–ด์„œ ๋…ธํŠธ๋ถ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ ์•„์˜ˆ ๋„๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‹ค์Œ ์‚ฌ์šฉ์„ ์œ„ํ•ด ์Šฌ๋ฆฝ ๋ชจ๋“œ๋กœ ๋‘๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.

 

Gradle, ์–ด๋–ป๊ฒŒ ์“ฐ๋Š” ๊ฑธ๊นŒ?

์ด๋ ‡๊ฒŒ ์ข‹์€ Gradle , ์–ด๋–ป๊ฒŒ ์“ฐ๋Š” ์ง€ ์ •๋„๋Š” ์•Œ์•„๋ณด์ž !

์˜ค๋Š˜์€ ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์˜์กด์„ฑ์„ ์„ค์ •ํ•˜๋Š” ๋ถ€๋ถ„์„ ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค.

์˜์กด์„ฑ ์„ค์ •์„ ์œ„ํ•ด์„  build.gradle์˜ dependencies ๋ถ€๋ถ„์„ ๋ด์•ผํ•œ๋‹ค.

 

 

Gradle์—์„  ์˜ˆ์‹œ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๊ฐ„ํŽธํ•˜๊ฒŒ ์˜์กด์„ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทผ๋ฐ ์•ž์— ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋ชจ๋‘ ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

์ด ์ฝ”๋“œ๋“ค์€ ์™œ ์žˆ๊ณ  ์–ด๋–ค ๊ธฐ๋Šฅ๋“ค์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ง€ ์•Œ์•„๋ณด์ž!

 

compileOnly

์ปดํŒŒ์ผ ์‹œ์—๋งŒ ์˜์กด์„ฑ์„ ์ •์˜ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋กฌ๋ณต๊ฐ™์€ ๊ฒฝ์šฐ , ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ณด๊ณ  getter , setter๋ฅผ ์ปดํŒŒ์ผ ํ•ด์ฃผ๊ณ  ๋Ÿฐํƒ€์ž„์—๋Š” ๋„ฃ์ง€ ์•Š๋Š”๋‹ค.

runtimeOnly

๋Ÿฐํƒ€์ž„ ์‹œ์—๋งŒ ์˜์กด์„ฑ์„ ์ •์˜ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด DB๊ด€๋ จ ํ˜น์€ ๋กœ๊ทธ ์˜์กด์„ฑ ์ฃผ์ž… ์‹œ์— ์‚ฌ์šฉํ•œ๋‹ค.

test

์•ž์— test๊ฐ€ ๋ถ™์–ด์žˆ์œผ๋ฉด ํ•ด๋‹น ์˜์กด์„ฑ์„ ํ…Œ์ŠคํŠธ ์‹œ์—๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

 

์˜์กด์„ฑ์ด๋ž€?

๋ชจ๋“ˆ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์˜ˆ๋กœ ๋“ค๋ฉด, A ๋ชจ๋“ˆ์ด B ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

์ด๊ฒƒ์„ A ๋ชจ๋“ˆ์ด B ๋ชจ๋“ˆ์— ์˜์กดํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋งํ•œ๋‹ค.

์ฆ‰ ์˜์กด์„ฑ์ด๋ž€ ๋ชจ๋“ˆ ๊ฐ„ ์„œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ด€๊ณ„์ด๋‹ค.

 

 

Api vs Implementation

dependencies๋ฅผ ๋ณด๋ฉด api ๋„ ์žˆ๊ณ  implementation๋„ ์žˆ๋‹ค.

๋‘˜์€ ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ์„๊นŒ?

๋จผ์ € ์ „์ด ์˜์กด์„ฑ์ด๋ž€ ๊ฐœ๋…์„ ์งš๊ณ  ๋„˜์–ด๊ฐˆ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

 

 

๋งŒ์•ฝ ์„œ๋กœ ์˜์กดํ•˜๊ณ  ์žˆ๋Š” ๋ชจ๋“ˆ 3๊ฐœ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž

์—ฌ๊ธฐ์„œ A ๋ชจ๋“ˆ์ด ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด ๋‚˜๋จธ์ง€ ๋ชจ๋“ˆ๋“ค์€ ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

 

๋งŒ์•ฝ ์—ฌ๊ธฐ์„œ ์˜์กดํ•˜๊ณ  ์žˆ๋Š” ๋ชจ๋“ˆ๋“ค์ด ๋ชจ๋‘ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค๋ฉด ์ „์ด ์˜์กด์„ฑ์ด ํ—ˆ์šฉ๋œ ๊ฒฝ์šฐ์ด๋‹ค.

์—ฌ๊ธฐ์„œ ๋งํ•œ ์ „์ด ์˜์กด์„ฑ์˜ ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ง€๊ฐ€ ์ฐจ์ด๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

 

๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•ด๋ณด์ž

api ๋˜๋Š” compile(์ง€์› ์ค‘๋‹จ๋จ) ๋Œ€์‹  ์ด ์ข…์† ํ•ญ๋ชฉ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋นŒ๋“œ ์‹œ์Šคํ…œ์—์„œ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•ด์•ผ ํ•˜๋Š” ๋ชจ๋“ˆ ์ˆ˜๊ฐ€ ์ค„์–ด๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๋นŒ๋“œ ์‹œ๊ฐ„์ด ํฌ๊ฒŒ ๊ฐœ์„ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

์˜ˆ๋ฅผ ๋“ค์–ด implementation ์ข…์† ํ•ญ๋ชฉ์ด API๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด Gradle์€ ์ด ์ข…์† ํ•ญ๋ชฉ๊ณผ ์ด์— ์ง์ ‘์ ์œผ๋กœ ์ข…์†๋œ ๋ชจ๋“ˆ๋งŒ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์•ฑ๊ณผ ํ…Œ์ŠคํŠธ ๋ชจ๋“ˆ์€ ์ด ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

implementation์„ ์‚ฌ์šฉํ•˜๋ฉด, ์ข…์† ํ•ญ๋ชฉ๊ณผ ์ง์ ‘์ ์œผ๋กœ ์ข…์†๋œ ๋ชจ๋“ˆ๋งŒ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•œ๋‹ค๊ณ  ๋‚˜์™€์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋ชจ๋“ˆ ํ•˜๋‚˜๊ฐ€ ๋ณ€๊ฒฝ ๋œ๋‹ค๊ณ  ํ•ด์„œ ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋“ค๊นŒ์ง€ ๋ชจ๋‘ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.

์ฆ‰ ์ „์ด ์˜์กด์„ฑ์„ ๊ฐ€์ง€์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ฐ˜๋Œ€๋กœ api๋Š” ์ „์ด ์˜์กด์„ฑ์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— ์˜์กดํ•˜๊ณ  ์žˆ๋Š” ๋ชจ๋“  ๋ชจ๋“ˆ๋“ค์ด ์˜ํ–ฅ์„ ๋ฐ›๊ณ  ์ด๊ฒƒ์€ ๊ณง ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์˜ํ–ฅ์„ ์ค€๋‹ค.

 

์™œ api๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋“ค๊นŒ์ง€ ์˜ํ–ฅ์„ ๋ฐ›์„๊นŒ?

API๋Š” ์ปดํŒŒ์ผ class-path ์—๋„ ๋…ธ์ถœ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ ์‹œ์— ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋“ค์ด ์˜ํ–ฅ์„ ๋ฐ›๊ฒŒ ๋œ๋‹ค.

ํ•˜์ง€๋งŒ implementation์€ ๋Ÿฐํƒ€์ž„ class-path ์—๋งŒ ๋…ธ์ถœ์ด ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์‹œ ์ปดํŒŒ์ผ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

 

๐Ÿง ๋‘ ๊ฐ€์ง€ class-path ์˜ ์ฐจ์ด๋ฅผ ์•Œ์•„๋ณด์ž

์ปดํŒŒ์ผ class-path : Java ์ฝ”๋“œ๋ฅผ class ํŒŒ์ผ๋กœ ์ปดํŒŒ์ผ ํ•  ๋•Œ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒฝ๋กœ

๋Ÿฐํƒ€์ž„ class-path : ์ปดํŒŒ์ผ ๋œ ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ JVM์ด ์‹คํ–‰ํ•  ๋•Œ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒฝ๋กœ

 

์ •๋ฆฌํ•˜์ž๋ฉด,

api ๋Š” ์ปดํŒŒ์ผ class-path , ๋Ÿฐํƒ€์ž„ class-path ์— ๋…ธ์ถœ๋œ๋‹ค.

implementation์€ ๋Ÿฐํƒ€์ž„ class-path์—๋งŒ ๋…ธ์ถœ๋œ๋‹ค.

 

implementation์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฝค ๋งŽ์€ ์žฅ์ ๋“ค์ด ์žˆ๋‹ค.

  1. ์ปดํŒŒ์ผ , ๋Ÿฐํƒ€์ž„ class-path๋ฅผ ๋ถ„๋ฅ˜ํ•จ์œผ๋กœ์จ ๋” ๋น ๋ฅธ ์ปดํŒŒ์ผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  2. ์ปดํŒŒ์ผ ์‹œ์— ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์›์น˜์•Š๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊นŒ์ง€ ์˜์กดํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

JVM์ด๋ž€?

์ž๋ฐ”๋ฅผ ๊ฐ€์ง€๊ณ  ์ฝ”๋”ฉ์„ ํ•˜๋Š” ์‚ฌ๋žŒ์€ ํ•œ๋ฒˆ ์ฏค JVM ์ด๋ž€ ๋‹จ์–ด๋ฅผ ๋“ค์–ด์™”์„ ๊ฒƒ์ด๋‹ค.

์ด JVM์€ ์ปดํ“จํ„ฐ์™€์˜ ์†Œํ†ต์„ ๋„์™€์ฃผ๋Š”๋ฐ, ์–ด๋–ค ์‹์œผ๋กœ ์†Œํ†ต์„ ๋„์™€์ฃผ๋Š” ์ง€ ๋‹จ๊ณ„๋ณ„๋กœ ์‚ดํŽด๋ณด์ž

 

๋จผ์ € ์šฐ๋ฆฌ๊ฐ€ ์ฝ”๋”ฉ์„ ํ•˜๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ†ตํ•ด์„œ ์ปดํŒŒ์ผํ•˜๋ฉด .class ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค.

 

ํ˜„์žฌ ์ด ํด๋ž˜์Šค ํŒŒ์ผ์€ ๊ธฐ๊ณ„์–ด๊ฐ€ ์•„๋‹Œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋กœ ๋˜์–ด์žˆ๋‹ค.

 

๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ž€ ๋ฌด์—‡์ผ๊นŒ?

JVM์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด๋กœ ๋ณ€ํ™˜๋œ ์ž๋ฐ” ์†Œ์Šค์ฝ”๋“œ์ด๋‹ค.

 

์–ธ์ œ ์–ด๋””์„œ๋“  ์šด์˜์ฒด์ œ์— ๊ด€๊ณ„์—†์ด JVM ์œ„์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜์˜ ์ฝ”๋“œ๋Š”

 

System.out.println("Hello World");

 

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง„๋‹ค.

 

// class version 61.0 (61)
// access flags 0x21
public class Main {

  // compiled from: Main.java

  // access flags 0x1
  public <init>()V
   L0
    LINENUMBER 8 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
    RETURN
   L1
    LOCALVARIABLE this LMain; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 0x9
  public static main([Ljava/lang/String;)V
   L0
    LINENUMBER 10 L0
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    LDC "hello world"
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
   L1
    LINENUMBER 11 L1
    RETURN
   L2
    LOCALVARIABLE args [Ljava/lang/String; L0 L2 0
    MAXSTACK = 2
    MAXLOCALS = 1
}

 

์ด๋ ‡๊ฒŒ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ ๋œ ํด๋ž˜์Šค ํŒŒ์ผ์„ JVM์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.

 

 

JVM์€ ์ด ํ˜•์‹์˜ ํŒŒ์ผ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ฐ€ ํ•„์š”ํ•  ๋•Œ ๊ธฐ๊ณ„์–ด๋กœ ๋ฒˆ์—ญ์„ ํ•ด์„œ ์ œ๊ณตํ•œ๋‹ค.

์ฆ‰ JVM์€ ์ปดํŒŒ์ผ๋Ÿฌ์™€ ์ปดํ“จํ„ฐ ์‚ฌ์ด์— ํ†ต์—ญ๊ฐ€ ๊ฐ™์€ ์—ญํ• ์„ ํ•ด์ค€๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

 

๊ธฐ์กด c,c++ ์ปดํŒŒ์ผ๋Ÿฌ์™€๋Š” ๋ญ๊ฐ€ ๋‹ค๋ฅผ๊นŒ?

๊ทผ๋ฐ ํ•˜๋‚˜ ์˜๋ฌธ์ ์ด ์ƒ๊ฒผ๋‹ค.

๋‹ค๋ฅธ ์–ธ์–ด๋“ค๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฌธ์žฅ์œผ๋กœ ์ฝ”๋”ฉ์„ ํ•˜๋Š”๋ฐ ์™œ ์ž๋ฐ”๋งŒ JVM์ด๋ž€ ๊ฒƒ์„ ์‚ฌ์šฉํ• ๊นŒ?

 

printf("Hello World");

 

๋ถ„๋ช… c์–ธ์–ด๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋”ฉ์„ ํ•˜๋Š”๋ฐ c์–ธ์–ด๋„ JVM ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ• ๊นŒ?

 

๊ฒฐ๋ก ์€ โ€œ์•„๋‹ˆ๋‹คโ€

์ด๋Š” ์–ธ์–ด๊ฐ€ ์ถ”๊ตฌํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์ปดํŒŒ์ผ ๋ฐฉ์‹์˜ ์ฐจ์ด ๋•Œ๋ฌธ์ด๋‹ค.

 

 

c๋‚˜ c++ ๊ฐ™์€ ์–ธ์–ด๋“ค์€ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„๊ฐ€ ๋ฐ”๋กœ ์•Œ์•„๋“ค์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๋กœ ๋ฒˆ์—ญํ•ด์ค€๋‹ค.

์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๊ฐ€ ํ•˜๋‚˜ ์žˆ๋Š”๋ฐ ๋ชจ๋“  ์ปดํ“จํ„ฐ ์šด์˜์ฒด์ œ๋“ค์ด ๊ฐ™์€ ์–ธ์–ด๋ฅผ ์“ฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ž€ ๊ฑฐ๋‹ค.

์ด๋กœ ์ธํ•ด ๋งฅ์—์„œ ์ปดํŒŒ์ผํ•œ ํŒŒ์ผ์ด ์œˆ๋„์šฐ๋‚˜ ๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” ์•ˆ ๋Œ์•„๊ฐ€๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค.

 

์™œ๋ƒํ•˜๋ฉด c๋‚˜ c++์€ ๊ฐ ๋จธ์‹ ์— ๋งž๋Š” ๊ธฐ๊ณ„์–ด๋กœ ๋ฐ”๋กœ ์ปดํŒŒ์ผ์„ ํ•ด์ค€๋‹ค.

์†๋„ ๋ฉด์—์„œ๋Š” ๋น ๋ฅผ ์ง€ ๋ชฐ๋ผ๋„ ๋‹ค๋ฅธ ํ™˜๊ฒฝ๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ๋–จ์–ด์ง„๋‹ค.

ํ•˜์ง€๋งŒ JVM์€ WORA ๋ผ๋Š” ์ฒ ํ•™์— ๊ธฐ๋ฐ˜์„ ๋‘๊ณ  ๋งŒ๋“ค์–ด์กŒ๋‹ค.

 

*WORA

Write Once Run Anywhere

ํ•œ๋ฒˆ ์“ฐ๊ณ  ์–ด๋””๋“  ๋Œ์•„๊ฐ„๋‹ค.

์ด๋Ÿฐ ํŠน์ง• ๋•๋ถ„์— ์ž๋ฐ”๋Š” ์šด์˜์ฒด์ œ ๊ด€๊ณ„์—†์ด ๋™์ผํ•˜๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

JRE , JDK ์™€์˜ ๊ด€๊ณ„

JVM๊ณผ ์ด๋ฆ„์ด ๋น„์Šทํ•œ JRE,JDK๋Š” ์–ด๋–ค ๊ด€๊ณ„์ผ๊นŒ?

๊ฒฐ๋ก  ์ ์œผ๋กœ ๋งํ•˜๋ฉด JVM์ด ์ œ์ผ ์ž‘๊ณ  ์„œ๋กœ ํฌํ•จ๋˜๋Š” ๊ด€๊ณ„์ด๋‹ค.

 

์•„๋ž˜ ๊ทธ๋ฆผ์„ ๋ณด์ž

 

 

JVM์€ ์œ„์—์„œ ์„ค๋ช…ํ•œ๋Œ€๋กœ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.

JRE๋Š” ๋Ÿฐํƒ€์ž„์— ํ•„์š”ํ•œ ์—ฌ๋Ÿฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ , ํŒŒ์ผ๋“ค์„ ํฌํ•จํ•œ๋‹ค.

JDK๋Š” ๊ทธ ์™ธ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ๋””๋ฒ„๊น… , ์ปดํŒŒ์ผ ๊ฐ™์€ ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•œ๋‹ค.

 

JVM ํŠน์ง• ์ •๋ฆฌ

 

  • ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ๊ฐ€์ƒ ๋จธ์‹ ์ด๋‹ค.
  • ์‹ฌ๋ณผ๋ฆญ ๋ ˆํผ๋Ÿฐ์Šค
    • ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒŒ ์•„๋‹Œ, ์ด๋ฆ„์œผ๋กœ ์ฐธ์กฐํ•œ๋‹ค.

 

  • ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜
    • ๋” ์ด์ƒ ํ• ๋‹น๋˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ด์ค€๋‹ค.

 

  • ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•˜์—ฌ ํ”Œ๋žซํผ ๋…๋ฆฝ์„ฑ ๋ณด์žฅ
    • ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•˜์—ฌ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๊ณ  ํ”Œ๋žซํผ ๋…๋ฆฝ์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.

 

  • ๋„คํŠธ์›Œํฌ ๋ฐ”์ดํŠธ ์˜ค๋”
    • ๋น… ์—”๋””์•ˆ ๋ฐ”์ดํŠธ ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ†ต์‹ ์„ ํ•œ๋‹ค.

 

๋น… ์—”๋””์•ˆ ํ‘œ๊ธฐ๋ฒ•์ด๋ž€?

0x12 0x34 0x56 0x78 ๊ณผ ๊ฐ™์ด ๋‚ฎ์€ ์ฃผ์†Œ๋ถ€ํ„ฐ ๋†’์€ ์ฃผ์†Œ ์ˆœ์œผ๋กœ ํ‘œ๊ธฐํ•˜๋Š” ๋ฐฉ์‹

 

JVM ๋ช…์„ธ

JVM ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜์™€์žˆ๋‹ค.

To implement the Java Virtual Machine correctly, you need only be able to

read the class file format and correctly perform the operations specified therein. Implementation details that are not part of the Java Virtual Machine's specification would unnecessarily constrain the creativity of implementors.

 

 

์š”์•ฝ์„ ํ•ด๋ณด๋ฉด , ๊ตฌํ˜„์ž์˜ ์ฐฝ์˜์„ฑ์„ ์ €ํ•ดํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์ธ ๋ช…์„ธ๋ฅผ ์ œ์™ธํ•œ ์„ธ์„ธํ•œ ๋ถ€๋ถ„์€ ์ •ํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

ํ”ํžˆ ํ–‰๋™๋งŒ ์ถ”์ƒํ™” ํ•ด๋‘๊ณ  ๊ตฌํ˜„ ์ฑ…์ž„์€ ๋ฒค๋”์‚ฌ๋“ค์—๊ฒŒ ๋งก๊ธด ๊ฑฐ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ ๊ฒฐ๊ณผ ๋ฌด์ˆ˜ํ•œ JVM ๋ฒค๋”์‚ฌ๋“ค์ด ๊ตฌํ˜„์„ ์‹œ์ž‘ํ•˜์˜€๊ณ  ํ˜„์žฌ๋„ ๋งŽ์€ JVM์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค.

ex) Oracle ์˜ ํ•ซ์ŠคํŒŸ , IBM์˜ Open J9 ๋“ฑ๋“ฑ ..

 

JVM ๋™์ž‘๊ณผ์ •

์•ž์„œ JVM์ด ๋Œ€๋žต ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด์•˜์œผ๋ฉด ์ง€๊ธˆ๋ถ€ํ„ฐ๋Š” ๊ตฌ์ฒด์ ์ธ ๋™์ž‘๊ณผ์ •์„ ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค.

 

JVM ๊ตฌ์กฐ

 

์ „์ฒด์ ์ธ ๋™์ž‘ ๋ฐฉ์‹

JVM์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ์ƒ์„ธํ•œ ๋ฐฉ์‹์€ ์‚ด์ง ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ „๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.

  1. ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผํ•œ๋‹ค.
  2. ์ปดํŒŒ์ผ ๋œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ํด๋ž˜์Šค ๋กœ๋”์— ์ „๋‹ฌํ•œ๋‹ค.
  3. ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•  ๋•Œ ํด๋ž˜์Šค ๋กœ๋”๊ฐ€ ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ์— ์ „๋‹ฌํ•œ๋‹ค.
  4. ์‹คํ–‰ ์—”์ง„์ด ํ•ด๋‹น ํด๋ž˜์Šค ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ ์‹œํ‚จ๋‹ค.

ํด๋ž˜์Šค ๋กœ๋”

ํด๋ž˜์Šค ๋กœ๋”์˜ ๊ตฌ์กฐ

  • ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํด๋ž˜์Šค ๋กœ๋”
    • JVM์„ ๊ตฌ๋™์‹œํ‚ค๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ํƒ‘์žฌํ•˜๊ณ  ์žˆ๋‹ค.
    • ๊ฐ€์žฅ ์ดˆ๊ธฐ์— ์‹คํ–‰๋˜๋ฉฐ , ์šด์˜์ฒด์ œ์— ๋งž๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ์“ฐ์—ฌ์žˆ๋‹ค.

 

  • ์ต์Šคํ…์…˜ ํด๋ž˜์Šค ๋กœ๋”
    • ์ž๋ฐ” ํด๋ž˜์Šค์˜ ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ํƒ‘์žฌํ•œ๋‹ค.

 

  • ์‹œ์Šคํ…œ ํด๋ž˜์Šค ๋กœ๋”(Application ClassLoader)
    • ๊ฐœ๋ฐœ์ž๋“ค์ด ์ž‘์„ฑํ•œ ํด๋ž˜์Šค ํŒŒ์ผ๋“ค์„ ํƒ‘์žฌํ•œ๋‹ค.
    • ์ด๊ฒƒ์„ ์ƒ์†ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜ ํด๋ž˜์Šค ๋กœ๋”๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

์š”์ฒญ์ด ๋“ค์–ด์™”์„ ๋•Œ ๋ชจ๋“  ํด๋ž˜์Šค ๋กœ๋”์— ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ์—†์„ ์‹œ ,

ClassNotFoundException ์˜ˆ์™ธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

ํด๋ž˜์Šค๋ฅผ ๋กœ๋“œํ•˜๋Š” ๊ณผ์ •

 

 

ํด๋ž˜์Šค ์–ด๋–ป๊ฒŒ ์–ด๋–ป๊ฒŒ ํด๋ž˜์Šค๋ฅผ ๋กœ๋“œํ•˜๋Š” ์ง€ ๊ฐ„๋‹จํ•˜๊ฒŒ ์•Œ์•„๋ณด์ž

  • ๋กœ๋“œ
    • ํด๋ž˜์Šค๋ฅผ ํŒŒ์ผ์—์„œ ๊ฐ€์ ธ์™€์„œ JVM ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹นํ•œ๋‹ค.

 

  • ๋งํฌ
    • ๊ฒ€์ฆ(Verifying)
      • ํด๋ž˜์Šค ํŒŒ์ผ์ด ์œ ํšจํ•œ์ง€๋ฅผ ๊ฒ€์ฆํ•œ๋‹ค.
      • ์ž๋ฐ” ๋ช…์„ธ , JVM ๋ช…์„ธ๋ฅผ ์ž˜ ์ง€์ผฐ๋Š” ์ง€ ํ™•์ธํ•˜๋ฉฐ ๋งŒ์•ฝ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผ ๋ชปํ•˜์˜€์„ ์‹œ์— VerifyError๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
    • ์ค€๋น„(Preparing)
      • ํด๋ž˜์Šค ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค์— ํ•„์š”ํ•œ static field์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ  ์ด๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค.
    • ๋ถ„์„(Resolving):
      • constant pool ๋‚ด์— ์žˆ๋Š” ๋ชจ๋“  **์‹ฌ๋ณผ๋ฆญ ์ฐธ์กฐ ๊ฐ’๋“ค์„ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ(๋‹ค์ด๋ ‰ํŠธ)**๋กœ ๋ณ€ํ™˜์‹œํ‚จ๋‹ค.

 

  • ์ดˆ๊ธฐํ™”
    • ์ค€๋น„๊ณผ์ •์—์„œ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™” ์‹œ์ผœ์คฌ๋˜ static filed๋“ค์„ ์ฝ”๋“œ์— ์ž‘์„ฑํ•ด์คฌ๋˜ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค.

์ด ๊ณผ์ •๊นŒ์ง€ ๋งˆ์ณค์œผ๋ฉด JVM์—์„œ ํด๋ž˜์Šค ํŒŒ์ผ์„ ๊ตฌ๋™์‹œํ‚ฌ ์ค€๋น„๊ฐ€ ๋๋‚˜๊ฒŒ ๋œ๋‹ค.

 

ํด๋ž˜์Šค ๋กœ๋”์˜ ํŠน์ง•

  • ์œ„์ž„ ๋ชจ๋ธ
    • ํด๋ž˜์Šค ๋กœ๋”๋Š” ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํด๋ž˜์Šค ๋กœ๋”๋ผ๋ฆฌ ๋กœ๋“œ๋ฅผ ์œ„์ž„ํ•˜๋Š” ๊ตฌ์กฐ๋กœ ๋™์ž‘ํ•œ๋‹ค.
    • ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์ƒ์œ„ ํด๋ž˜์Šค๋กœ ์š”์ฒญ์„ ์œ„์ž„ํ•ด๊ฐ€๋ฉด์„œ ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์ฐพ๋Š”๋ฐ, ๋ชจ๋“  ํด๋ž˜์Šค ๋กœ๋”์— ์—†์œผ๋ฉด ํด๋ž˜์Šค ํŒจ์Šค์—์„œ ์ฐพ์•„๋ณด๊ณ  ๊ฑฐ๊ธฐ์—๋„ ์—†์œผ๋ฉด ์˜ˆ์™ธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • ํด๋ž˜์Šค ๋กœ๋”๋ผ๋ฆฌ ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๋ฅผ ์ด๋ฃจ์–ด ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ์ƒ์„ฑ๋˜๋ฉฐ ์ตœ์ƒ์œ„ ํด๋ž˜์Šค ๋กœ๋”๋Š” ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํด๋ž˜์Šค ๋กœ๋”์ด๋‹ค.

 

  • ๊ฐ€์‹œ์„ฑ(visibility) ์ œํ•œ
    • ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํด๋ž˜์Šค ๋กœ๋”๋Š” ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ๋กœ๋”์˜ ํด๋ž˜์Šค๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ , ๊ทธ ๋ฐ˜๋Œ€๋Š” ์•ˆ๋œ๋‹ค. (๊ณ„์ธต ๊ตฌ์กฐ)
    • ํ•˜์œ„ ํด๋ž˜์Šค ๋กœ๋”๋Š” ์ƒ์œ„ ํด๋ž˜์Šค ๋กœ๋”์˜ ํด๋ž˜์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ƒ์œ„ ํด๋ž˜์Šค ๋กœ๋”๋Š” ํ•˜์œ„ ํด๋ž˜์Šค ๋กœ๋”์˜ ํด๋ž˜์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค.

 

  • ์–ธ๋กœ๋“œ ๋ถˆ๊ฐ€
    • ํด๋ž˜์Šค ๋กœ๋”๋Š” ํด๋ž˜์Šค๋ฅผ ๋กœ๋“œํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์–ธ๋กœ๋“œํ•  ์ˆ˜๋Š” ์—†๋‹ค. ์–ธ๋กœ๋“œ ๋Œ€์‹ , ํ˜„์žฌ ํด๋ž˜์Šค ๋กœ๋”๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์•„์˜ˆ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค ๋กœ๋”๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

  • ์œ ์ผ์„ฑ
    • ํ•˜์œ„ ํด๋ž˜์Šค ๋กœ๋”๋Š” ์ƒ์œ„ ํด๋ž˜์Šค ๋กœ๋”๊ฐ€ ๋กœ๋”ฉํ•œ ํด๋ž˜์Šค๋ฅผ ๋‹ค์‹œ ๋กœ๋”ฉํ•˜์ง€ ์•Š์Œ์œผ๋กœ์จ ํšจ์œจ์ ์œผ๋กœ ๋กœ๋”ฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค

 

๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ

 

 

๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ์€ JVM์ด OS ํ• ๋‹น ๋ฐ›๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด๋‹ค.

ํฌ๊ฒŒ 6๊ฐ€์ง€์˜ ์˜์—ญ์ด ์žˆ๋Š”๋ฐ , ๊ณตํ†ต์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅ ํ•œ๊ฒƒ๊ณผ ๊ณต์œ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๊ตฌ๋ถ„ ์ง€์–ด ์•Œ์•„๋ณด์ž

 

๊ณต์œ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ

 

์“ฐ๋ ˆ๋“œ ๋‚ด์— ์žˆ๋Š” ๊ฒƒ๋“ค์€ ์„œ๋กœ ์ ‘๊ทผ ํ•  ์ˆ˜ ์—†๋‹ค.

  1. JVM ์Šคํƒ
    • ๋ฉ”์„œ๋“œ๊ฐ€ ํ•˜๋‚˜์”ฉ ์ˆ˜ํ–‰๋  ๋•Œ๋งˆ๋‹ค ์Šคํƒ ํ”„๋ ˆ์ž„์ด ํ•˜๋‚˜์”ฉ ์Œ“์ด๊ฒŒ ๋œ๋‹ค.
    • ์Šคํƒ ํ”„๋ ˆ์ž„์—๋Š” ์ง€์—ญ ๋ณ€์ˆ˜ ๋ฐฐ์—ด์ด๋‚˜ ํ”ผ์—ฐ์‚ฐ์ž ์Šคํƒ ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
    ์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด์„œ ์ง€์—ญ ๋ณ€์ˆ˜ ๋ฐฐ์—ด๊ณผ ์Šคํƒ ๊ธฐ๋ฐ˜ ์—ฐ์‚ฐ์ด ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์ง€๋Š” ์ง€ ์•Œ์•„๋ณด์ž
int num = 1; // ์Šคํƒ ํ”„๋ ˆ์ž„์— ์Œ“์ž„ 
int sum = num + 5; // ์Šคํƒ ํ”„๋ ˆ์ž„์— ์Œ“์ž„

 

์ด๋Ÿฐ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ JVM ์Šคํƒ ๋‚ด์—์„œ๋Š” ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚ ๊นŒ?

์ผ๋‹จ ์œ„์—์„œ ๋งํ•œ ๋Œ€๋กœ ์Šคํƒ ํ”„๋ ˆ์ž„์— ๋ฉ”์†Œ๋“œ๊ฐ€ ์Œ“์ด๊ฒŒ ๋  ๊ฒƒ ์ด๋‹ค.

 

๊ทธ ๋‹ค์Œ ์ง€์—ญ ๋ณ€์ˆ˜ ๋ฐฐ์—ด์— ํŒŒ๋ผ๋ฏธํ„ฐ , ๋ณ€์ˆ˜๋“ค์ด ์ €์žฅ์ด ๋˜๋Š” ๋ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ €์žฅ๋œ๋‹ค.

๋‹ค์‹œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๋ณด์ž

L0
    LINENUMBER 15 L0
    ICONST_1 // ์Šคํƒ์— ์ •์ˆ˜๊ฐ’ 1์„ ์˜ฌ๋ฆฐ๋‹ค.
    ISTORE 1 // ์Šคํƒ์— ์žˆ๋Š” ์ •์ˆ˜๊ฐ’์„ ๊บผ๋‚ด์„œ 1๋ฒˆ ์ธ๋ฑ์Šค์— ์ €์žฅ
   L1
    LINENUMBER 16 L1
    ILOAD 1 // 1๋ฒˆ ์ธ๋ฑ์Šค์˜ ๊ฐ’์„ ์Šคํƒ์— ์˜ฌ๋ ค๋ผ
    ICONST_5 // ์Šคํƒ์— ์ •์ˆ˜๊ฐ’ 5๋ฅผ ์˜ฌ๋ฆฐ๋‹ค.
    IADD // ์Šคํƒ ์ƒ๋‹จ ๋‘ ๊ฐœ์˜ ๊ฐ’์„ ๋”ํ•œ๋‹ค.
    ISTORE 2 // 2๋ฒˆ ์ธ๋ฑ์Šค์— ์ €์žฅํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•ด์„œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์—ฐ์‚ฐ์„ ๋งˆ์น˜๊ฒŒ ๋œ๋‹ค.

 

 

2.PC ๋ ˆ์ง€์Šคํ„ฐ

  • ํ˜„์žฌ JVM ๋ช…๋ น์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๋Š” ์“ฐ๋ ˆ๋“œ ๊ณต์œ ์˜ ๋ ˆ์ง€์Šคํ„ฐ์ด๋‹ค.
  • ์“ฐ๋ ˆ๋“œ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์ƒ์„ฑ๋œ๋‹ค.

3.๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ์Šคํƒ

  • JNI ๋ผ๋Š” ๊ฒƒ์€ ํ†ตํ•ด ์ž๋ฐ”๊ฐ€ ์•„๋‹Œ c๋‚˜ c++์„ ํ†ตํ•ด ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜์˜€์„ ์‹œ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์Šคํƒ์ด๋‹ค.

๊ณต์œ ํ•˜๋Š” ๊ฒƒ

  1. ํž™
    • ์ธ์Šคํ„ด์Šค ํ˜น์€ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•œ๋‹ค.
    • ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์˜ ์ž‘์—…์ด ์ฃผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.
  2. ๋ฉ”์„œ๋“œ ์˜์—ญ
    • ํด๋ž˜์Šค ๋กœ๋”๋กœ ๋ถ€ํ„ฐ ๋ถˆ๋Ÿฌ์˜จ ํด๋ž˜์Šค์˜ ๋ฐ”์ดํŠธ ์ฝ”๋“œ ์ •๋ณด๋“ค์„ ์ €์žฅํ•œ๋‹ค.

์‹คํ–‰ ์—”์ง„

์‹คํ–‰ ์—”์ง„์—์„œ ๋น„๋กœ์†Œ ๊ธฐ๊ณ„์–ด๋กœ์˜ ๋ฒˆ์—ญ์„ ์‹œ์ž‘ํ•œ๋‹ค.

์ด๋•Œ ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์“ฐ์ด๋Š” ๋ฐ ์ธํ„ฐํ”„๋ฆฌํ„ฐ์™€ JIT ๋ฐฉ์‹์ด๋‹ค.

 

์ธํ„ฐํ”„๋ฆฌํ„ฐ

  • ๋ฐ”์ดํŠธ ์ฝ”๋“œ ๋ช…๋ น์–ด๋ฅผ ํ•˜๋‚˜์”ฉ ์ฝ์–ด์„œ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • ํ•ด์„์€ ๋น ๋ฅด์ง€๋งŒ ์‹คํ–‰์€ ๋Š๋ฆฌ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.
  • ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋กœ ๋™์ž‘ํ•œ๋‹ค.

 

JIT(Just-In-Time)

  • ๋ฐ”์ดํŠธ ์ฝ”๋“œ ์ „์ฒด๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ๋ฒˆ์—ญํ•œ๋‹ค.
  • ์ดํ›„ ์ธํ„ฐํ”„๋ฆฌํŒ…์„ ํ•˜์ง€ ์•Š๊ณ  ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ์ง์ ‘ ์‹คํ–‰ํ•˜๋ฉฐ ํ•œ๋ฒˆ ์ปดํŒŒ์ผ ๋œ ์ฝ”๋“œ๋Š” ์บ์‹œ์— ์ €์žฅ๋œ๋‹ค.
  • ํ•˜์ง€๋งŒ ์ฒ˜์Œ ์ปดํŒŒ์ผ ๊ณผ์ •์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋ฏ€๋กœ ํ•œ๋ฒˆ๋งŒ ์“ฐ๋Š” ๋ฉ”์†Œ๋“œ๋Š” JIT ์‚ฌ์šฉ์ด ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค.

์ฐธ๊ณ ์ž๋ฃŒ

JVM์— ๊ด€ํ•˜์—ฌ - Part 2, ClassLoader

 

JVM์— ๊ด€ํ•˜์—ฌ - Part 2, ClassLoader

Java ๋กœ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋Š” ์–ด๋–ป๊ฒŒ ๋Œ์•„๊ฐ€๋Š” ๊ฑธ๊นŒ? ํ•ด๋‹น ๋ฌผ์Œ์— ๋‹ต์„ ์ฐพ๊ธฐ ์œ„ํ•œ JVM ์‹œ๋ฆฌ์ฆˆ 2ํŽธ, JVM ์˜ ๊ตฌ์„ฑ ์š”์†Œ ์ค‘ ClassLoader ์— ๊ด€ํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ClassLoaderโ€ฆ

tecoble.techcourse.co.kr

JVM. ํด๋ž˜์Šค๋กœ๋” ์„œ๋ธŒ์‹œ์Šคํ…œ(Class Loader Subsystem)

 

JVM. ํด๋ž˜์Šค๋กœ๋” ์„œ๋ธŒ์‹œ์Šคํ…œ(Class Loader Subsystem)

JVM์€ RAM์— ์œ„์น˜ํ•˜๋ฉฐ, ์‹คํ–‰ ์ค‘์— ํด๋ž˜์Šค๋กœ๋” ์„œ๋ธŒ์‹œ์Šคํ…œ์„ ์ด์šฉํ•˜์—ฌ ํด๋ž˜์Šค ํŒŒ์ผ์„ RAM์œผ๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ž๋ฐ”์˜ ๋™์  ํด๋ž˜์Šค ๋กœ๋”ฉ ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ ์ปดํŒŒ์ผ ํƒ€์ž„์ด ์•„๋‹ˆ๋ผ ๋Ÿฐํƒ€

blog.hexabrain.net

https://www.youtube.com/watch?v=6reapO0gLPs&t=399s

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐฑ์—”๋“œ ๋ฐ๋ธŒ์ฝ”์Šค์—์„œ ์ง„ํ–‰ํ•œ Tech Log ํ™œ๋™ ๋ชฉ์ ์œผ๋กœ ์ œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

1. String ํด๋ž˜์Šค์˜ equals & hashcode

์†Œํ”„ํŠธ์›จ์–ด ์„ธ๊ณ„์—์„œ๋Š” ๋ฌธ์ž์—ด๋„ ์ด์ƒํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.

๋ฐ”๋กœ ๋™๋“ฑ์„ฑ์„ ๋ณด์žฅํ•ด์ฃผ๊ธฐ ์œ„ํ•จ์ธ๋ฐ,

์ด๋•Œ ์•ž์—์„œ ๋งํ•œ equals ๋ฉ”์†Œ๋“œ์™€ HashCode ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

 

์ด๋ฅผ ์žฌ์ •์˜ํ•˜์ง€ ์•Š๋Š” ํด๋ž˜์Šค๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋งŒ๋“ค์–ด๊ฐ€๋ฉด์„œ equals ์™€ HashCode ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž

๋ณธ๋ฌธ์—์„œ๋Š” String์„ ๋ชจ๋ฐฉํ•œ String_test ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๋ณผ๊ฒƒ์ด๋ฉฐ , ๊ฐ๊ฐ์˜ ๊ฒฐ๊ณผ๊ฐ’๋“ค์„ ๋งž์ถฐ๋‚˜๊ฐˆ ๊ฒƒ์ด๋‹ค.

equals ๋น„๊ต

๋จผ์ € ๊ฐ์ฒด์˜ ๋™๋“ฑ์„ฑ์„ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด equals์˜ ๊ฐ’์„ ๋น„๊ตํ•ด๋ณด์ž

String string1 = new String("hi");
String string2 = new String("hi");

System.out.println("String ๊ฐ์ฒด hashcode ๋น„๊ต ๊ฒฐ๊ณผ : "+(string1.equals(string2)));

String_test string1_test = new String_test("hi");
String_test string2_test = new String_test("hi");

System.out.println("String ๊ฐ์ฒด hashcode ๋น„๊ต ๊ฒฐ๊ณผ : "+(string1_test.equals(string2_test)));

 

๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง€๋Š”  ํด๋ž˜์Šค๋ผ๋ฆฌ ๋น„๊ตํ•˜์˜€์ง€๋งŒ

String ๊ฐ์ฒด๋Š” equals ์˜ true์ด๊ณ  ,

String_test๋Š” equals ์˜ ๊ฐ’์ด false ๊ฐ€ ๋‚˜์™”๋‹ค.

hashcode ๋น„๊ต

๋‹ค์Œ์€ ๊ฐ์ฒด์˜ hashcode ๊ฐ’์„ ๋น„๊ตํ•ด๋ณด์ž

String string1 = new String("hi");
String string2 = new String("hi");

System.out.println("String ๊ฐ์ฒด hashcode ๋น„๊ต ๊ฒฐ๊ณผ : "+(string1.hashCode() == string2.hashCode()));

String_test string1_test = new String_test("hi");
String_test string2_test = new String_test("hi");

System.out.println("String_test ๊ฐ์ฒด hashcode ๋น„๊ต ๊ฒฐ๊ณผ : "+(string1_test.hashCode() == string2_test.hashCode()));

ํ•ด์‰ฌ์ฝ”๋“œ ๋น„๊ต ๊ฒฐ๊ณผ๊ฐ’๋„ String ๊ฐ์ฒด์™€ ๋‹ค๋ฅด๊ฒŒ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿง ์™œ ์ด๋Ÿฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™”์„๊นŒ?

 

์ •๋‹ต์€ equals ์™€ hashcode ์˜ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์— ์žˆ๋‹ค.

 

์ด ๋‘˜์„ ์žฌ์ •์˜ ํ•˜๊ธฐ ์ „์— ๊ฐ๊ฐ ์›๋ž˜ ๋ฌด์Šจ ์—ญํ• ์„ ํ•˜๋Š” ๋ฉ”์†Œ๋“œ์ธ์ง€ ๋ถ€ํ„ฐ ์•Œ์•„๋ณด์ž

2. equals ๋ž€ ?

equals ๋ฉ”์†Œ๋“œ๋Š” 2๊ฐœ์˜ ๊ฐ์ฒด๊ฐ€ ๋™๋“ฑํ•œ ์ง€ ๊ฒ€์‚ฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด,

String string1 = new String("hi");
String string2 = new String("hi");

System.out.println(string1 == string2); // false
System.out.println(string1.equals(string2)); // true

๋‹ค์Œ๊ณผ ๊ฐ™์ด String ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋น„๊ตํ•˜๋Š” ๊ฒฝ์šฐ "==" ๋Š” ๋™์ผ์„ฑ์„ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์— false ๋ฅผ ์ถœ๋ ฅํ•˜์ง€๋งŒ , equals ๋ฉ”์†Œ๋“œ๋Š” ๋™๋“ฑ์„ฑ์„ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์— true๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

*๋™๋“ฑ์„ฑ๊ณผ ๋™์ผ์„ฑ์˜ ์ฐจ์ด๋Š” ๋ญ˜๊นŒ?

๋™๋“ฑ์„ฑ์€ ๋Œ€์ƒ์˜ ๋Œ€์ƒ์˜ ๋‚ด์šฉ์„ ๋น„๊ตํ•˜๊ณ 

๋™์ผ์„ฑ์€ ์ฃผ์†Œ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ๊ฐ™์€ ๊ฐ์ฒด์ธ ์ง€๋ฅผ ๋น„๊ตํ•œ๋‹ค.

 

Object ํด๋ž˜์Šค์˜ equals ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž

public boolean equals(Object obj) {
			return this == obj;
    }

๊ทผ๋ฐ ์ •์ž‘ Object์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋™๋“ฑ์„ฑ์„ ๋น„๊ตํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค .(์ฃผ์†Œ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค.)

๊ทธ๋Ÿฐ๋ฐ ์™œ String ์—์„œ๋Š” ๋ฌธ์ž์—ด์˜ ๋™๋“ฑ์„ฑ์„ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑธ๊นŒ?

 

์ž๋ฐ” ๊ณต์‹๋ฌธ์„œ์— ๋ณด๋ฉด String์˜ equals ๋ฉ”์†Œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด equals ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ ํ•œ๋‹ค๊ณ  ๋‚˜์™€์žˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ์— ์šฐ๋ฆฌ๋Š” equals ๋ฉ”์†Œ๋“œ๋ฅผ ๋™๋“ฑ์„ฑ ๋น„๊ต์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค !

 

๊ทธ๋Ÿฌ๋ฉด String_test ๋ฉ”์†Œ๋“œ์—๋„ ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ equals๋ฅผ ์žฌ์ •์˜ ํ•˜๋ฉด ๋™๋“ฑ์„ฑ ๋น„๊ต๊ฐ€ ๋˜์ง€ ์•Š์„๊นŒ ?

์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  Spring_test ํด๋ž˜์Šค์—๋„ equals ๋ฅผ ์žฌ์ •์˜ ํ•ด์ฃผ์—ˆ๋‹ค.

 

class String_test {
    String string;

    public String_test(String string) {
        this.string = string;
    }

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

๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ณผ๊ฐ’๋„ ์˜๋„ํ•œ ๋Œ€๋กœ true ๊ฐ€ ๋‚˜์™”๋‹ค !

3. hashCode๋ž€ ?

hashCode ๋ฉ”์†Œ๋“œ๋Š” ๊ฐ์ฒด์˜ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

 

*๊ฐ์ฒด์˜ ํ•ด์‹œ์ฝ”๋“œ๋ž€?

๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์„ ๋ณ€ํ™˜ํ•˜์—ฌ ์ƒ์„ฑํ•œ ๊ณ ์œ ์˜ ํ•ด์‹œ๊ฐ’์ด๋‹ค.

 

ํ•˜์ง€๋งŒ ๊ธฐ์กด ๋ฐฉ์‹์œผ๋กœ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋ฉด ๋‹ค๋ฅธ ๊ฐ์ฒด์— ๋Œ€ํ•ด์„œ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด์ด๋ผ๋„ ๋‹ค๋ฅธ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋ฐ›์„ ๊ฒƒ์ด๋‹ค.

โ†’ ์ด๋ ‡๊ฒŒ ๋œ๋‹ค๋ฉด ๋™๋“ฑ์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†๋‹ค !

 

๋”ฐ๋ผ์„œ String ํด๋ž˜์Šค๋Š” hashCode ์—ญ์‹œ ์žฌ์ •์˜ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

 

์ž๋ฐ” ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ๋ณด๋ฉด ๋ฌธ์ž์—ด์˜ ๋ฌธ์ž๋“ค์„ ํ•œ ๊ธ€์ž์”ฉ ๊ฐ€์ ธ์™€์„œ ๋ณ€ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋ ‡๊ธฐ์— ๋‹ค๋ฅธ ์ฃผ์†Œ๊ฐ’์˜ ๊ฐ์ฒด๋ผ๋„ ๋ฌธ์ž์—ด์ด ๊ฐ™์œผ๋ฉด ๊ฐ™์€ hashcode ๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์ด๋‹ค.

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  Spring_test ํด๋ž˜์Šค๋„ hashCode ๋ฅผ ์žฌ์ •์˜ ํ•ด๋ณด์•˜๋‹ค.

 

class String_test {
    String string;

    public String_test(String string) {
        this.string = string;
    }

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

String ๊ฐ์ฒด์ฒ˜๋Ÿผ Spring_test ๊ฐ์ฒด๋„ ๊ฐ™์€ ๊ฐ’์ด ๋‚˜์˜ด์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

Hash ์™€ Hash ํ…Œ์ด๋ธ”์˜ ๊ด€๊ณ„

hashCode ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ํ•ด์‹œ์ฝ”๋“œ ๊ฐ’์„ ๋ฐ›๋Š” ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋˜์—ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์–ป๊ฒŒ ๋œ ํ•ด์‹œ์ฝ”๋“œ๋Š” ์–ด๋””์— ์‚ฌ์šฉ๋˜๋Š” ๊ฑธ๊นŒ?

 

hashCode ์™€ equals ์˜ ๊ด€๊ณ„๋ฅผ ์•Œ๊ธฐ ์ „ ์šฐ๋ฆฌ๋Š” ํ•ด์‹œํ…Œ์ด๋ธ”์ด๋ผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค.

 

๐Ÿง ์ž๋ฃŒ๊ตฌ์กฐ? ๊ทธ๊ฒŒ ๋ญ”๊ฐ€์š”?

 

๋„์„œ๊ด€์—๋Š” ์ •๋ง ๋งŽ์€ ์ฑ…๋“ค์ด ์žˆ๋‹ค.

 

๋งŒ์•ฝ ์ž๊ธฐ๊ฐ€ ์‚ฌ์„œ ๊ด€๋ฆฌ๋ฅผ ๋งก์•˜๋Š” ๋ฐ ์ด ๋งŽ์€ ์ฑ…๋“ค ์ค‘์—์„œ ํŠน์ • ์ฑ…์„ ์ฐพ๊ฑฐ๋‚˜ ์ •๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์—ฌ๊ฐ„ ๋ง‰๋ง‰ํ•œ ์ผ์ด ์•„๋‹ ๊ฒƒ์ด๋‹ค.

 

๋‹คํ–‰ํžˆ ์ด๋Ÿฐ ์ผ๋“ค์„ ์šฐ๋ฆฌ๊ฐ€ ์ฒ˜์Œ ๊ฒช์€ ๊ฒŒ ์•„๋‹ˆ๊ณ  ์˜›๋‚ ๋ถ€ํ„ฐ ๋งŽ์€ ๊ธฐ์ˆ ์ž๋“ค์ด ๊ณ ์•ˆํ•œ ๋์— ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ์ฐพ๊ณ  ๊บผ๋‚ด์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ทœ์น™๊ณผ ํ‹€์„ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋‘์—ˆ๋‹ค.

 

์ด๊ฒƒ๋“ค ์ค‘์— ํ•˜๋‚˜๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ์•Œ์•„๋ณผ ํ•ด์‹œ ํ…Œ์ด๋ธ”์ด๋‹ค.

 

ํ•ด์‹œํ…Œ์ด๋ธ”์ด๋ž€?

๋ฐ์ดํ„ฐ๋ฅผ key , value ๋กœ ์ €์žฅํ•˜๋Š” ํ˜•ํƒœ๋ฅผ ๋งํ•œ๋‹ค.

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

์ด๊ฒƒ๋„ ํ˜„์‹ค ์„ธ๊ณ„์—์„œ์˜ key , value ํ˜•ํƒœ๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ์›๋ฆฌ

๋‹ค์‹œ ์†Œํ”„ํŠธ์›จ์–ด๋กœ ๋Œ์•„์™€์„œ ์ด๋Ÿฌํ•œ ํ˜•ํƒœ์˜ ํ•ด์‹œ ํ…Œ์ด๋ธ”์ด ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์ง€๋Š” ์ง€ ์•Œ์•„๋ณด์ž

๋„์„œ๊ด€์˜ ์ฑ…๋“ค์„ key , value ํ˜•ํƒœ๋กœ ์ €์žฅํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

 

์ด๋•Œ key๋Š” ์ฑ… ์ด๋ฆ„ , value๋Š” ๊ฐ€๊ฒฉ์œผ๋กœ ํ•ด์ฃผ์—ˆ๋‹ค.

๊ทธ ๊ฒฐ๊ณผ, ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” Bucket์—๋Š” ํ•ด์‰ฌ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ๋‚˜์˜จ ์ธ๋ฑ์Šค์™€ value(์ฑ… ๊ฐ€๊ฒฉ) ์ด ๋‹ด๊ธด๋‹ค.

 

์ด๋Ÿฐ์‹์œผ๋กœ ์ €์žฅ์„ ํ•˜๊ฒŒ ๋˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ๋•Œ Hash ์—ฐ์‚ฐ์„ ํ•œ๋ฒˆ๋งŒ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋˜๋ฏ€๋กœ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

โ†’ ์ด๋Ÿฐ ๊ฒฝ์šฐ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(1) ์ด ๋œ๋‹ค !

 

๐Ÿง ๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ์„œ๋กœ ๋‹ค๋ฅธ ์ฑ…๋“ค๋ผ๋ฆฌ ๊ฐ™์€ ํ•ด์‰ฌ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™€์„œ ๊ฐ™์€ ์ธ๋ฑ์Šค์— ์ €์žฅ๋œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ ?

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ• ๋‘๊ฐ€์ง€๋ฅผ ์†Œ๊ฐœํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

Separate Chaining ๊ธฐ๋ฒ•

ํ•ด์‰ฌํ…Œ์ด๋ธ”์—์„œ๋Š” ํ•˜๋‚˜์˜ ์ธ๋ฑ์Šค์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฒ„ํ‚ท์„ ์—ฐ๊ฒฐ์‹œํ‚ค๋Š” ๊ฒƒ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์‹œ ๊ทธ๋ฆผ์„ ๋ณด์ž

๋ถ„๋ช… ๋‹ค๋ฅธ ์ฑ…์ธ๋ฐ, ๊ฐ™์€ ์ธ๋ฑ์Šค์— ์ €์žฅ์ด ๋˜์—ˆ๋‹ค.

์ฆ‰ ํ•ด์‹œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋‹ˆ๊นŒ ์ƒˆ๋กœ์šด ๊ฐ’์„ ๊ธฐ์กด ๊ฐ’๊ณผ ์—ฐ๊ฒฐ์‹œํ‚จ ๊ฑฐ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฒ„ํ‚ท์— ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋งŒ ์ €์žฅํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค ํšจ์œจ์ด ์•ˆ์ข‹์•„์ง„๋‹ค.

๊ธฐ์กด์—” ํ•ด์‹œ ํ•จ์ˆ˜ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ํ•ด๋‹น ์ธ๋ฑ์Šค๋งŒ ์ฐพ์•„๊ฐ€๋ฉด ๋์—ˆ๋Š”๋ฐ , ์ด์ œ๋Š” ๊ทธ ์•ˆ์—์„œ ํ•œ๋ฒˆ ๋” ํƒ์ƒ‰์„ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ตœ์•…์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋’ค์ ธ๋ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

โ†’ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ํ‰๊ท ์ ์œผ๋กœ O(n/m) ์ตœ์•…์˜ ๊ฒฝ์šฐ O(n) ์„ ๊ฐ€์ง€๊ฒŒ ๋  ์ˆ˜ ์žˆ๋‹ค.

(ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ์ €์žฅ์†Œ(Bucket)์˜ ๊ธธ์ด๋ฅผ โ€˜mโ€™, ํ‚ค(key)์˜ ์ˆ˜๋ฅผ โ€˜nโ€™)

 

์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ์ž๋ฐ”8 ์ด์ƒ๋ถ€ํ„ฐ๋Š” ํ•˜๋‚˜์˜ ํ•ด์‹œ ๋ฒ„ํ‚ท์— ํ• ๋‹น ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ 8๊ฐœ ์ด์ƒ์ด ๋˜๋ฉด ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ํŠธ๋ฆฌ๋กœ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค.

โ†’ ์ด๋Ÿด ๊ฒฝ์šฐ ํ‰๊ท  ์ ์ธ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(log(n/m)) ์ด ๋œ๋‹ค.

 

Open addressing ๊ธฐ๋ฒ• (๊ฐœ๋ฐฉ ์ฃผ์†Œ๋ฒ•)

๊ฐœ๋ฐฉ ์ฃผ์†Œ๋ฒ•์€ ํ•ด์‹œ๊ฐ’์˜ ์ธ๋ฑ์Šค์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ์‹œ์— ๋‹ค๋ฅธ ์ธ๋ฑ์Šค๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

๊ฐ™์€ ์ธ๋ฑ์Šค์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ๋Š” ์ƒ๋ฐ˜๋œ ๋ฐฉ๋ฒ•์ด๋‹ค !

 

ํ•ด์‹œ ์ถฉ๋Œ์ด ๋ฐœ์ƒ ํ–ˆ์„ ์‹œ์— ์–ด๋Š ์ธ๋ฑ์Šค์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๊ฒƒ์ธ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ด 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

 

์„ ํ˜• ํƒ์ƒ‰ (linear probing)

์ถฉ๋Œ์ด ์ผ์–ด๋‚ฌ์„ ๋•Œ, ํ•œ์นธ ๋˜๋Š” n์นธ์”ฉ ๋‹ค์Œ ์ธ๋ฑ์Šค๊ฐ€ ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณธ๋‹ค.

์ œ๊ณฑ ํƒ์ƒ‰ (quadratic probing)

1์˜ ์ œ๊ณฑ , 2์˜ ์ œ๊ณฑ โ€ฆ ๋งŒํผ ์ธ๋ฑ์Šค๋ฅผ ์ด๋™ํ•ด๊ฐ€๋ฉด์„œ ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณธ๋‹ค.

์ด์ค‘ ํ•ด์‹œ (Double Hash)

์œ„์— ๋‘ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด์„œ ์–ด๋Š ์ •๋„ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•  ์ˆœ ์žˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ํ•ด์‰ฌ๊ฐ’์ด ๊ฐ™์„ ๊ฒฝ์šฐ ๋นˆ ์Šฌ๋กฏ์„ ์ฐพ์•„ ์ ‘๊ทผํ•˜๋Š” ์œ„์น˜๊ฐ€ ๋™์ผํ•˜๋ฏ€๋กœ

์ ‘๊ทผ ์Šฌ๋กฏ์„ ์ค‘์‹ฌ์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•œ ๊ณณ์— ์ง‘์ค‘๋˜์–ด ์žˆ๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ด ์ƒํ™ฉ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ ๋ฐฉ๋ฒ•์ด ์ด์ค‘ ํ•ด์‹œ์ด๋‹ค.

๋ง ๊ทธ๋Œ€๋กœ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ๋‘ ๋ฒˆ ๋Œ๋ฆฐ ๊ฒƒ์ด๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด,

1์ฐจ ํ•ด์‹œ๋Š” ํ‚ค๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ํ•ด์‹œ ์ธ๋ฑ์Šค๋ฅผ ์ •ํ•œ๋‹ค.

2์ฐจ ํ•ด์‹œ๋Š” ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜์˜€์„ ์‹œ์— ๋ช‡ ์นธ ๋’ค๋กœ ์ธ๋ฑ์Šค๋ฅผ ์ด๋™ํ•  ์ง€ ์ •ํ•œ๋‹ค.

์ด์ฒ˜๋Ÿผ ์ด์ค‘ ํ•ด์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด 1์ฐจ ํ•ด์‹œ๊ฐ’์ด ๊ฐ™๋”๋ผ๋„ 2์ฐจ ํ•ด์‹œ๊ฐ’์€ ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ,

๋ฐ์ดํ„ฐ์˜ ๊ตฐ์ง‘ ๋ฌธ์ œ๋ฅผ ์–ด๋Š์ •๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ฐœ๋ฐฉ ์ฃผ์†Œ๋ฒ•์˜ ๊ฒฝ์šฐ์—๋„ ํ•ด๋‹น ์ธ๋ฑ์Šค์— ์ถฉ๋Œ์ด ๋ฐœ์ƒํ–ˆ์—ˆ๋‹ค๋ฉด ๋‹ค์Œ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ์•„๊ฐ€๋ฉด์„œ ํƒ์ƒ‰์„ ํ•ด์•ผํ•˜๋ฏ€๋กœ ์ตœ์•…์˜ ๊ฒฝ์šฐ O(n) ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿง ๊ทผ๋ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์ ์  ๋งŽ์•„์ง„๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ ?

์•„๋งˆ ํ•ด์‰ฌ ์ถฉ๋Œ์€ ๋นˆ๋ฒˆํ•ด์ง€๋ฉฐ ํšจ์œจ์€ ๋”์šฑ ๋‚˜๋น ์งˆ ๊ฒƒ์ด๋‹ค.

(์ฐธ๊ณ ๋กœ ์ž๋ฐ”์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ ๋ฒ„ํ‚ท ์‚ฌ์ด์ฆˆ๋Š” 16์ด๋‹ค)

์ด ์ƒํ™ฉ์— ๋Œ€ํ•ด ๋ฌ˜์‚ฌํ•œ ์žฌ๋ฐŒ๋Š” ์ด๋ก ์ด ์žˆ๋‹ค.

 

๋น„๋‘˜๊ธฐ ์ง‘ ์›๋ฆฌ

๋งŒ์•ฝ 9๊ฐœ์˜ ๋น„๋‘˜๊ธฐ ์ง‘์ด ์žˆ๋Š” ๋ฐ 10๋งˆ๋ฆฌ ์ด์ƒ์˜ ๋น„๋‘˜๊ธฐ๊ฐ€ ๋“ค์–ด๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค๋ฉด?

์–ด์ฉ” ์ˆ˜ ์—†์ด 2๋งˆ๋ฆฌ ์ด์ƒ์˜ ๋น„๋‘˜๊ธฐ๊ฐ€ ํ•จ๊ป˜ ์ง€๋‚ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค.

์ด ์ƒํ™ฉ์€ ๋ฌดํ•œํ•œ(๋น„๋‘˜๊ธฐ) ์ž…๋ ฅ์— ๋Œ€ํ•ด ์œ ํ•œํ•œ(๋น„๋‘˜๊ธฐ ์ง‘) ์ถœ๋ ฅ๋งŒ์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜ํƒ€๋‚œ ํ˜„์ƒ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์†Œํ”„ํŠธ์›จ์–ด์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค.

key๊ฐ’์€ ๋ฌดํ•œํ•˜์ง€๋งŒ ๋ฒ„ํ‚ท ๊ณผ ํ•ด์‰ฌ๊ฐ’ ์€ ์œ ํ•œํ•˜๋‹ค.

์ด ๊ฒฝ์šฐ ํ•ด์‰ฌํ…Œ์ด๋ธ”์€ Dynamic Resizing ์„ ํ†ตํ•ด์„œ ๋ฒ„ํ‚ท์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ๋‘ ๋ฐฐ์”ฉ ๋Š˜๋ ค์ค€๋‹ค.

 

์ด๋•Œ ๋Š˜๋ฆด ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๊ธธ์ด๋Š” 2^30 ์ด๋‹ค !

์ด์ œ HashCode์˜ ์—ญํ• ๊ณผ ํ•ด์‹œ ๊ฐ’์„ ์ด์šฉํ•œ ํ•ด์‹œ ํ…Œ์ด๋ธ”๋„ ์•Œ์•„๋ณด์•˜์œผ๋‹ˆ

์ด์ฏค์—์„œ equals and hashcode์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž

4. equals ์™€ hashcode ์„ ์™œ ๊ฐ™์ด ์žฌ์ •์˜ ํ•ด์ค˜์•ผํ• ๊นŒ ?

์œ„์—์„œ ๋ณด์•˜๋“ฏ์ด ์ผ๋ฐ˜์ ์œผ๋กœ equals ์™€ hashcode ๋Š” ๊ฐ™์ด ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•ด์ฃผ๊ณ  ์žˆ๋‹ค.

๋งŒ์•ฝ equals๋งŒ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•ด์ค€๋‹ค๋ฉด ์—ฌ๋Ÿฌ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ , ๋Œ€ํ‘œ์ ์œผ๋กœ ํ•ด์‰ฌ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์ด๋‹ค.

์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” set๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด๋ณด์ž

๊ฐ™์€ ๊ฐ’์˜ ๊ฐ์ฒด๋ฅผ ๋„ฃ์–ด์ค€๋‹ค๋ฉด ํ•˜๋‚˜๋งŒ ๋“ค์–ด๊ฐ€์•ผ ์ •์ƒ์ผ ๊ฒƒ์ด๋‹ค.

equals๋งŒ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜์˜€์„ ๊ฒฝ์šฐ

class Test {
    String key;

		public Test(String key) {
        this.key = key;
    }
		
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Test test = (Test) o;
        return Objects.equals(key, test.key);
    }    
}
Set<Test> set = new HashSet<>();
        
set.add(new Test("hi"));
set.add(new Test("hi"));

System.out.println(set.size()); // ๊ฒฐ๊ณผ 2

๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด๋ฅผ ๋„ฃ์–ด์คฌ๋Š”๋ฐ ๋‘๊ฐœ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™”๋‹ค.

์ด๋Š” Hash ํ…Œ์ด๋ธ”์—์„œ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง์—๋„ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ์ธ์‹ํ•˜์˜€๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

hashCode ๋งŒ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜์˜€์„ ๊ฒฝ์šฐ

class Test {
    String key;

    public Test(String key) {
        this.key = key;
    }

    @Override
    public int hashCode() {
        return Objects.hash(key);
    }
}
Set<Test> set = new HashSet<>();
        
set.add(new Test("hi"));
set.add(new Test("hi"));

System.out.println(set.size()); // ๊ฒฐ๊ณผ 2

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด๋ฅผ ๋„ฃ์–ด์คฌ๋Š”๋ฐ ๋‘๊ฐœ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™”๋‹ค.

์ด ๊ฒฝ์šฐ๋„ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง์—๋„ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ์ธ์‹ํ•˜์˜€๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

๐Ÿง ์™œ Equals์™€ HashCode ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ์žฌ์ •์˜ ํ•˜์˜€์„ ์‹œ์— ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ๊ฑธ๊นŒ ?

์ด ์ด์œ ๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด ํ•ด์‰ฌ ์ž๋ฃŒ๊ตฌ์กฐ์˜ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์•Œ์•„๋ณด์ž

ํ•ด์‰ฌ ๋งต์˜ ๋™์ž‘ ๊ตฌ์กฐ

ํ•ด์‰ฌ ์ž๋ฃŒ๊ตฌ์กฐ์—์„œ ๊ฐ์ฒด๊ฐ€ ๋™๋“ฑํ•œ ์ง€๋ฅผ ๋น„๊ตํ•  ๋• ๋‹ค์Œ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.

  1. ํ•ด์‰ฌ์ฝ”๋“œ์˜ ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค.
  2. ํ•ด์‰ฌ์ฝ”๋“œ์˜ ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด equals์˜ ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค.
  3. ์œ„ ๋‘๊ฐœ์˜ ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด ๋™๋“ฑ ๊ฐ์ฒด๋ผ๊ณ  ํŒ๋‹จํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ,

equals๋งŒ ์žฌ์ •์˜ ํ•˜์˜€์„ ๊ฒฝ์šฐ ํ•ด์‰ฌ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋‚˜์™”๊ธฐ ๋•Œ๋ฌธ์ด๊ณ 

hashCode ๋งŒ ์žฌ์ •์˜ ํ•˜์˜€์„ ๊ฒฝ์šฐ equals์˜ ๋ฐ˜ํ™˜๊ฐ’์ด false ์˜€๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ๋ณด์•˜๋˜ ๊ฒƒ์ด๋‹ค.

 

์ด์ฒ˜๋Ÿผ ๋‘˜์„ ๋™์‹œ์— ์žฌ์ •์˜ ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด, Hash ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ถˆ์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

 

4. equals & hashCode ๊ทœ์•ฝ

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

5. ๊ฒฐ๋ก 

ํ•ด์‹œ์ฝ”๋“œ์™€ equals์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ  , ์ด ๋‘˜์„ ์™œ ๊ฐ™์ด ์žฌ์ •์˜ ํ•ด์ค˜์•ผํ•˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ๋„ ์•Œ์•„๋ณด์•˜๋‹ค.

๋งŒ์•ฝ ์ด ๋‘˜์„ ๊ฐ™์ด ์žฌ์ •์˜ ํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค๋ฉด ์œ„์ฒ˜๋Ÿผ ํ•ด์‰ฌ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•  ๋•Œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

๋™๋“ฑ์„ฑ์„ ๋ณด์žฅํ•ด์ฃผ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ์ธ์‹์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋”ฐ๋ผ์„œ equals์™€ hashCode ๋ฅผ ๊ฐ™์ด ์žฌ์ •์˜ ํ•˜๋„๋ก ํ•˜์ž !

6.์ฐธ๊ณ  ์ž๋ฃŒ

Java HashMap์€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”๊ฐ€?

equals์™€ hashCode๋Š” ์™œ ๊ฐ™์ด ์žฌ์ •์˜ํ•ด์•ผ ํ• ๊นŒ?

 

equals์™€ hashCode๋Š” ์™œ ๊ฐ™์ด ์žฌ์ •์˜ํ•ด์•ผ ํ• ๊นŒ?

equals์™€ hashCode๋Š” ๊ฐ™์ด ์žฌ์ •์˜ํ•˜๋ผ๋Š” ๋ง์„ ๋‹ค๋“ค ํ•œ ๋ฒˆ์ฏค ๋“ค์–ด๋ดค์„ ๊ฒƒ์ด๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ IDE Generate ๊ธฐ๋Šฅ์—์„œ๋„ equals์™€ hashCode๋ฅผ ๊ฐ™์ด ์žฌ์ •์˜ํ•ด์ฃผ๋ฉฐ lombok์—์„œ๋„ EqualsAndHashCodeโ€ฆ

tecoble.techcourse.co.kr

Hashtable์˜ ์ดํ•ด์™€ ๊ตฌํ˜„ #1

 

Hashtable์˜ ์ดํ•ด์™€ ๊ตฌํ˜„ #1

ํ•ด์‰ฌ ํ…Œ์ด๋ธ”์˜ ์ดํ•ด์™€ ๊ตฌํ˜„ (Hashtable) ์กฐ๋Œ€ํ˜‘ (http://bcho.tistory.com) ๊ธฐ๋ณธ์ ์ธ ํ•ด์‰ฌ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์ดํ•ด ํ•ด์‰ฌ ํ…Œ์ด๋ธ”์€ Key์— Value๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ์ดํƒ€ ๊ตฌ์กฐ๋กœ, value := get(key)์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ์ด ๋งค์šฐ๋งค์šฐ ๋น 

bcho.tistory.com

equals์™€ hashCode๋Š” ์™œ ๊ฐ™์ด ์žฌ์ •์˜ํ•ด์•ผ ํ• ๊นŒ?

 

equals์™€ hashCode๋Š” ์™œ ๊ฐ™์ด ์žฌ์ •์˜ํ•ด์•ผ ํ• ๊นŒ?

equals์™€ hashCode๋Š” ๊ฐ™์ด ์žฌ์ •์˜ํ•˜๋ผ๋Š” ๋ง์„ ๋‹ค๋“ค ํ•œ ๋ฒˆ์ฏค ๋“ค์–ด๋ดค์„ ๊ฒƒ์ด๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ IDE Generate ๊ธฐ๋Šฅ์—์„œ๋„ equals์™€ hashCode๋ฅผ ๊ฐ™์ด ์žฌ์ •์˜ํ•ด์ฃผ๋ฉฐ lombok์—์„œ๋„ EqualsAndHashCodeโ€ฆ

tecoble.techcourse.co.kr

[๋ฐ์ดํ„ฐ ๊ตฌ์กฐ] Hashtable ์ถฉ๋Œ(collisoion)์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค. (open addressing, separate chaining) +์„ค๋ช…์˜์ƒ

 

[๋ฐ์ดํ„ฐ ๊ตฌ์กฐ] Hashtable ์ถฉ๋Œ(collisoion)์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค. (open addressing, se

Hashtable์€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์—์„œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด์‹œํ…Œ์ด๋ธ”์€ ์•„๋ž˜ ์‹œ๊ฐ„๋ณต์žก๋„, ๊ณต๊ฐ„๋ณต์žก๋„๋ฅผ...

blog.naver.com

 

'ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐฑ์—”๋“œ ๋ฐ๋ธŒ์ฝ”์Šค' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Gradle ์ด๋ž€?  (0) 2023.09.03
JVM ๋‚ด๋ถ€๋กœ  (0) 2023.09.03

+ Recent posts