Study/Effective Java

[Effective Java 3/E] 4์žฅ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค

youn12 2023. 5. 23. 21:12
๐Ÿ“‹ ๋ชฉ์ฐจ.

4. ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค
    .์•„์ดํ…œ 15 - ํด๋ž˜์Šค์™€ ๋ฉค๋ฒ„์˜ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ตœ์†Œํ™”ํ•˜๋ผ.
    .์•„์ดํ…œ 16 - public ํด๋ž˜์Šค์—์„œ๋Š” public ํ•„๋“œ๊ฐ€ ์•„๋‹Œ ์ ‘๊ทผ์ž ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ

    .์•„์ดํ…œ 17 - ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์„ ์ตœ์†Œํ™”ํ•˜๋ผ
    .์•„์ดํ…œ 17 - ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์„ ์ตœ์†Œํ™”ํ•˜๋ผ
    .์•„์ดํ…œ 18 - ์ƒ์†๋ณด๋‹ค๋Š” ์ปดํฌ์ง€์…˜์„ ์‚ฌ์šฉํ•˜๋ผ
    .์•„์ดํ…œ 19 - ์ƒ์†์„ ๊ณ ๋ คํ•ด ์„ค๊ณ„ํ•˜๊ณ  ๋ฌธ์„œํ™”ํ•˜๋ผ. ๊ทธ๋Ÿฌ์ง€ ์•Š์•˜๋‹ค๋ฉด ์ƒ์†์„ ๊ธˆ์ง€ํ•˜๋ผ
    .์•„์ดํ…œ 20 - ์ถ”์ƒ ํด๋ž˜์Šค๋ณด๋‹ค๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์šฐ์„ ํ•˜๋ผ
    .์•„์ดํ…œ 21 - ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ตฌํ˜„ํ•˜๋Š” ์ชฝ์„ ์ƒ๊ฐํ•ด ์„ค๊ณ„ํ•˜๋ผ
    .์•„์ดํ…œ 22 - ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํƒ€์ž…์„ ์ •์˜ํ•˜๋Š” ์šฉ๋„๋กœ๋งŒ ์‚ฌ์šฉํ•˜๋ผ
    .์•„์ดํ…œ 23 - ํƒœ๊ทธ ๋‹ฌ๋ฆฐ ํด๋ž˜์Šค๋ณด๋‹ค๋Š” ํด๋ž˜์Šค ๊ณ„์ธต๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•˜๋ผ
    .์•„์ดํ…œ 24 - ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋Š” ๋˜๋„๋ก static์œผ๋กœ ๋งŒ๋“ค๋ผ
    .์•„์ดํ…œ 25 - ํ†ฑ๋ ˆ๋ฒจ ํด๋ž˜์Šค๋Š” ํ•œ ํŒŒ์ผ์— ํ•˜๋‚˜๋งŒ ๋‹ด์œผ๋ผ.


โœ”๏ธ ๋‚ด์šฉ.

 

4. ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค

 

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

.์•„์ดํ…œ 15 - ํด๋ž˜์Šค์™€ ๋ฉค๋ฒ„์˜ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ตœ์†Œํ™”ํ•˜๋ผ.

 

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

์˜ค์ง API๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์™€ ์†Œํ†ตํ•˜๋ฉฐ ์„œ๋กœ์˜ ๋‚ด๋ถ€ ๋™์ž‘ ๋ฐฉ์‹์—๋Š” ์ „ํ˜€ ๊ฐœ์˜์น˜ ์•Š๋Š”๋‹ค. ์ •๋ณด ์€๋‹‰, ํ˜น์€ ์บก์Šํ™”๋ผ๊ณ  ํ•˜๋Š” ์ด ๊ฐœ๋…์€ ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„์˜ ๊ทผ๊ฐ„์ด ๋˜๋Š” ์›๋ฆฌ๋‹ค.

 

 ์ •๋ณด ์€๋‹‰์˜ ์žฅ์ 

 - ์‹œ์Šคํ…œ ๊ฐœ๋ฐœ ์†๋„ ํ–ฅ์ƒ. 
์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณ‘๋ ฌ๋กœ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ

 - ์‹œ์Šคํ…œ ๊ด€๋ฆฌ ๋น„์šฉ์„ ๋‚ฎ์ถค
๊ฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋” ๋นจ๋ฆฌ ํŒŒ์•…ํ•˜์—ฌ ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ต์ฒดํ•˜๋Š” ๋ถ€๋‹ด๋„ ์ ๊ธฐ ๋•Œ๋ฌธ

 - ์ •๋ณด ์€๋‹‰ ์ž์ฒด๊ฐ€ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒํ•ด ์ฃผ์ง€๋Š” ์•Š์ง€๋งŒ, ์ตœ์ ํ™”์—๋Š” ๋„์›€์„ ์ค€๋‹ค.
 ์™„์„ฑ๋œ ์‹œ์Šคํ…œ์„ ํ”„๋กœํŒŒ์ผ๋งํ•ด ์ตœ์ ํ™”ํ•  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ •ํ•œ ๋‹ค์Œ(์•„์ดํ…œ 67), ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•ˆํ˜น ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋งŒ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ

 - ์†Œํ”„ํŠธ์›จ์–ด ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ธ๋‹ค.
์™ธ๋ถ€์— ์˜์กดํ•˜์ง€ ์•ˆํ˜ธ ๋…์ž์ ์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋ผ๋ฉด ๊ทธ ์ปดํฌ๋„ŒํŠธ์™€ ํ•จ๊ป˜ ๊ฐœ๋ฐœ๋˜์ง€ ์•Š์€ ๋‚ฏ์„  ํ™˜๊ฒฝ์—์„œ๋„ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๋‹ค.

 - ํฐ ์‹œ์Šคํ…œ์„ ์ œ์ž‘ํ•˜๋Š” ๋‚œ์ด๋„๋ฅผ ๋‚ฎ์ถฐ์ค€๋‹ค.
์‹œ์Šคํ…œ ์ „์ฒด๊ฐ€ ์•„์ง ์™„์„ฑ๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ๋„ ๊ฐœ๋ณ„ ์ปดํฌ๋„ŒํŠธ์˜ ๋™์ž‘์„ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 ์ž๋ฐ”๋Š” ์ •๋ณด ์€๋‹‰์„ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ์žฅ์น˜๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๊ทธ์ค‘ ์ ‘๊ทผ ์ œ์–ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค, ๋ฉค๋ฒ„์˜ ์ ‘๊ทผ์„ฑ์„ ๋ช…์‹œํ•œ๋‹ค.

 

 ๊ธฐ๋ณธ ์›์น™์€ ๊ฐ„๋‹จํ•˜๋‹ค. ๋ชจ๋“  ํด๋ž˜์Šค์™€ ๋ฉค๋ฒ„์˜ ์ ‘๊ทผ์„ฑ์„ ๊ฐ€๋Šฅํ•œ ํ•œ ์ขํ˜€์•ผ ํ•œ๋‹ค. ์ฆ‰, ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์˜ฌ๋ฐ”๋กœ ๋™์ž‘ํ•˜๋Š” ํ•œ ํ•ญ์ƒ ๊ฐ€์žฅ ๋‚ฎ์€ ์ ‘๊ทผ ์ˆ˜์ค€์„ ๋ถ€์—ฌํ•ด์•ผ ํ•œ๋‹ค.

 

 Top ๋ ˆ๋ฒจ(๊ฐ€์žฅ ๋ฐ”๊นฅ) ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์— ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋Š” ์ ‘๊ทผ ์ˆ˜์ค€์€ package-private์™€ public ๋‘ ๊ฐ€์ง€์ด๋‹ค. ์™ธ๋ถ€์—์„œ ์“ธ์ด์œ ๊ฐ€ ์—†๋‹ค๋ฉด package-private์œผ๋กœ ์„ ์–ธํ•˜์ž. ๊ทธ๋Ÿฌ๋ฉด ์ด๋“ค์€ API๊ฐ€ ์•„๋‹Œ ๋‚ด๋ถ€ ๊ตฌํ˜„์ด ๋˜์–ด ์–ธ์ œ๋“  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ํด๋ผ์ด์–ธํŠธ์— ์•„๋ฌด๋Ÿฐ ํ”ผํ•ด ์—†์ด ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์—์„œ ์ˆ˜์ •, ๊ต์ฒด, ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋ฉด, public์œผ๋กœ ์„ ์–ธํ•œ๋‹ค๋ฉด API๊ฐ€ ๋˜๋ฏ€๋กœ ํ•˜์œ„ ํ˜ธํ™˜์„ ์œ„ํ•ด ์˜์›ํžˆ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

 

ํ•œ ํด๋ž˜์Šค์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” package-private Top๋ ˆ๋ฒจ ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค ์•ˆ์— private static์œผ๋กœ ์ค‘์ฒฉ์‹œ์ผœ๋ณด์ž(์•„์ดํ…œ 24), Top ๋ ˆ๋ฒจ๋กœ ๋‘๋ฉด ๊ฐ™์€ ํŒจํ‚ค์ง€์˜ ๋ชจ๋“  ํด๋ž˜์Šค๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, private static์œผ๋กœ ์ค‘์ฒฉ์‹œํ‚ค๋ฉด ๋ฐ”๊นฅ ํด๋ž˜์Šค ํ•˜๋‚˜์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 ํด๋ž˜์Šค์˜ ๊ณต๊ฐœ APi๋ฅผ ์„ธ์‹ฌํžˆ ์„ค๊ณ„ํ•œ ํ›„, ๊ทธ ์™ธ์˜ ๋ชจ๋“  ๋ฉค๋ฒ„๋Š” private๋กœ ๋งŒ๋“ค์ž. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์˜ค์ง ๊ฐ™์€ ํŒจํ‚ค์ง€์˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค๊ฐ€ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š” ๋ฉค๋ฒ„์— ํ•œํ•ด package-private์œผ๋กœ ํ’€์–ด์ฃผ์ž. ๊ถŒํ•œ์„ ํ’€์–ด์ฃผ๋Š” ์ผ์„ ์ž์ฃผ ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์—ฌ๋Ÿฌ๋ถ„ ์‹œ์Šคํ…œ์—์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋” ๋ถ„ํ•ดํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹Œ์ง€ ๋‹ค์‹œ ๊ณ ๋ฏผํ•ด ๋ณด์ž. prviate์™€ package-private ๋ฉค๋ฒ„๋Š” ๋ชจ๋‘ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๊ตฌํ˜„์— ํ•ด๋‹นํ•˜๋ฏ€๋กœ ๋ณดํ†ต์€ ๊ณต๊ฐœ APi์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค. ๋‹จ, Serializable์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์—์„œ๋Š” private ๊ฐ™์€ ํ•„๋“œ๋“ค๋„ ์˜๋„์น˜ ์•Š๊ฒŒ ๊ณต๊ฐœ API๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๋‹ค.(์•„์ดํ…œ 86,87)

 

 public ํด๋ž˜์Šค์—์„œ๋Š” ๋ฉค๋ฒ„์˜ ์ ‘๊ทผ ์ˆ˜์ค€์„ package-private์—์„œ protected๋กœ ๋ฐ”๊พธ๋Š” ์ˆœ๊ฐ„ ๊ทธ ๋ฉค๋ฒ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€์ƒ ๋ฒ”์œ„๊ฐ€ ์—„์ฒญ ๋„“์–ด์ง„๋‹ค. public ํด๋ž˜์Šค์˜ protected ๋ฉค๋ฒ„๋Š” ๊ณต๊ฐœ API๋กœ ์˜์›ํžˆ ์ง€์›๋ผ์•ผ ํ•œ๋‹ค. ๋˜ํ•œ ๋‚ด๋ถ€ ๋™์ž‘ ๋ฐฉ์‹์„ API ๋ฌธ์„œ์— ์ ์–ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ณต๊ฐœํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.(์•„์ดํ…œ 19) ๋”ฐ๋ผ์„œ protected ๋ฉค๋ฒ„์˜ ์ˆ˜๋Š” ์ ์„์ˆ˜๋ก ์ข‹๋‹ค.

 

 ์ƒ์œ„ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•  ๋•Œ๋Š” ๊ทธ ์ ‘๊ทผ ์ˆ˜์ค€์„ ์ƒ์œ„ ํด๋ž˜์Šค์—์„œ๋ณด๋‹ค ์ข๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์—†๋‹ค. ์ด ์ œ์•ฝ์€ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋Š” ํ•˜์œ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋กœ ๋Œ€์ฒดํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•˜๋‹ค.

 

 ๋‹จ์ง€ ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋ ค๋Š” ๋ชฉ์ ์œผ๋กœ ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค, ๋ฉค๋ฒ„์˜ ์ ‘๊ทผ ๋ฒ”์œ„๋ฅผ ๋„“ํžˆ๋ ค ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค. ์ ๋‹นํ•œ ์ˆ˜์ค€๊นŒ์ง€๋Š” ๋„“ํ˜€๋„ ๊ดœ์ฐฎ๋‹ค. ์˜ˆ๋กœ, public ํด๋ž˜์Šค์˜ private ๋ฉค๋ฒ„๋ฅผ package-private๊นŒ์ง€ ํ’€์–ด์ฃผ๋Š” ๊ฒƒ์€ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ ์ด์ƒ์€ ์•ˆ ๋œ๋‹ค. ์ฆ‰, ํ…Œ์ŠคํŠธ๋งŒ์„ ์œ„ํ•ด ํด๋ž˜์Šค ์ธํ„ฐํŽ˜์ด์Šค, ๋ฉค๋ฒ„๋ฅผ ๊ณต๊ฐœ API๋กœ ๋งŒ๋“ค์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค. ๋‹คํ–‰ํžˆ ์ด๋ ‡๊ฒŒ ํ•ด์•ผ ํ•  ์ด์œ ๋„ ์—†๋‹ค. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธ ๋Œ€์ƒ๊ณผ ๊ฐ™์€ ํŒจํ‚ค์ง€์— ๋‘๋ฉด package-private ์š”์†Œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 public ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ํ•„๋“œ๋Š” ๋˜๋„๋ก public์ด ์•„๋‹ˆ์–ด์•ผ ํ•œ๋‹ค(์•„์ดํ…œ 16) public ๊ฐ€๋ณ€ ํ•„๋“œ๋ฅผ ๊ฐ–๋Š” ํด๋ž˜์Šค๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์Šค๋ ˆ๋“œ ์„ธ์ดํ”„ ํ•˜์ง€ ์•Š๋‹ค.

 

 final์„ ์‚ฌ์šฉํ•œ๋‹ค ํ•˜๋”๋ผ๋„ ๋ฐฐ์—ด ํ•„๋“œ๋ฅผ ๋‘๊ฑฐ๋‚˜ ์ด ํ•„๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ ‘๊ทผ์ž ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค. ์ ‘๊ทผ์ž๋ฅผ ์ œ๊ณตํ•˜๋ฉด ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

public static final Thing[] VALUES = {new Thing(), new Thing()};

 

ํ•ด๊ฒฐ์ฑ…์€ ๋‘ ๊ฐ€์ง€๋‹ค.

 ์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ public๋ฐฐ์—ด์„ private๋กœ ๋งŒ๋“ค๊ณ  public ๋ถˆ๋ณ€ list๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

public static final List<Thing> VALUES_LIST = Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));

 

 ๋‘ ๋ฒˆ์งธ๋Š” ๋ฐฐ์—ด์„ private๋กœ ๋งŒ๋“ค๊ณ  ๋ณต์‚ฌ๋ณธ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” public ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค(๋ฐฉ์–ด์  ๋ณต์‚ฌ)

    public static final Thing[] values(){
        return PRIVATE_VALUES.clone();
    }

 

ํ•ต์‹ฌ ์ •๋ฆฌ

 ํ”„๋กœ๊ทธ๋žจ ์š”์†Œ์˜ ์ ‘๊ทผ์„ฑ์€ ๊ฐ€๋Šฅํ•œ ํ•œ ์ตœ์†Œํ•œ์œผ๋กœ ํ•˜๋ผ. ๊ผญ ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ๊ณจ๋ผ ์ตœ์†Œํ•œ์˜ public API๋ฅผ ์„ค๊ณ„ํ•˜์ž. ๊ทธ ์™ธ์—๋Š” ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค, ๋ฉค๋ฒ„๊ฐ€ ์˜๋„์น˜ ์•Š๊ฒŒ APi๋กœ ๊ณต๊ฐœ๋˜๋Š” ์ผ์ด ์—†๋„๋ก ํ•œ๋‹ค. public ํด๋ž˜์Šค๋Š” ์ƒ์ˆ˜์šฉ public static final ํ•„๋“œ ์™ธ์—๋Š” ์–ด๋– ํ•œ public ํ•„๋“œ๋„ ๊ฐ€์ ธ์„œ๋Š” ์•ˆ ๋œ๋‹ค. public static final ํ•„๋“œ๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ๋ถˆ๋ณ€์ธ์ง€ ํ™•์ธํ•˜๋ผ.

 

.์•„์ดํ…œ 16 - public ํด๋ž˜์Šค์—์„œ๋Š” public ํ•„๋“œ๊ฐ€ ์•„๋‹Œ ์ ‘๊ทผ์ž ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ

 

 ํŒจํ‚ค์ง€ ๋ฐ”๊นฅ์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค๋ผ๋ฉด ์ ‘๊ทผ์ž๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

 

public class Point {

    private double x; // ์ ‘๊ทผ์ž์™€ ๋ณ€๊ฒฝ์ž ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์บก์Šํ™”ํ•œ๋‹ค., public ํด๋ž˜์Šค๋Š” ์ ˆ๋Œ€ ๊ฐ€๋ณ€ ํ•„๋“œ๋ฅผ ์ง์ ‘ ๋…ธ์ถœํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.
    private double y; // public X

    public Point(double x, double y){
        this.x = x;
        this.y = y;
    }

    public double getX(){
        return x;
    }
    public double getY(){
        return y;
    }

    public void setX(double x){
        this.x = x;
    }
    public void setY(double y){
        this.y = y;
    }
}

 

 ํ•˜์ง€๋งŒ package-private ํด๋ž˜์Šค ํ˜น์€ private ์ค‘์ฒฉ ํด๋ž˜์Šค๋ผ๋ฉด ๋ฐ์ดํ„ฐ ํ•„๋“œ๋ฅผ ๋…ธ์ถœํ•ด๋„ ํ•˜๋“ฑ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค. ํด๋ž˜์Šค๊ฐ€ ํ‘œํ˜„ํ•˜๋ ค๋Š” ์ถ”์ƒ ๊ฐœ๋…๋งŒ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ‘œํ˜„ํ•ด ์ฃผ๋ฉด ๋œ๋‹ค.  ์ด ๋ฐฉ์‹์€ ํด๋ž˜์Šค ์„ ์–ธ ๋ฉด์—์„œ๋‚˜ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“ฌ ๋ฉด์—์„œ๋‚˜ ์ ‘๊ทผ์ž ๋ฐฉ์‹๋ณด๋‹ค ํ›จ์”ฌ ๊น”๋”ํ•˜๋‹ค.

 

// package-private class
class PackagePrivateClass {
    // ์ด ํ•„๋“œ๋Š” ๊ฐ™์€ ํŒจํ‚ค์ง€ ๋‚ด์—์„œ ์ง์ ‘ ์ ‘๊ทผ ๊ฐ€๋Šฅ
    public String packagePrivateField;
}

public class MainClass {
    // private nested class
    private static class PrivateNestedClass {
        // ์ด ํ•„๋“œ๋Š” MainClass ๋‚ด์—์„œ ์ง์ ‘ ์ ‘๊ทผ ๊ฐ€๋Šฅ
        public String privateNestedField;
    }

    public static void main(String[] args) {
        PackagePrivateClass obj1 = new PackagePrivateClass();
        obj1.packagePrivateField = "Hello, package-private!";  // ๊ฐ™์€ ํŒจํ‚ค์ง€ ๋‚ด์—์„œ ์ง์ ‘ ์ ‘๊ทผ ๊ฐ€๋Šฅ

        PrivateNestedClass obj2 = new PrivateNestedClass();
        obj2.privateNestedField = "Hello, private nested!";  // MainClass ๋‚ด์—์„œ ์ง์ ‘ ์ ‘๊ทผ ๊ฐ€๋Šฅ

        System.out.println(obj1.packagePrivateField);
        System.out.println(obj2.privateNestedField);
    }
}

 

 public ํด๋ž˜์Šค์˜ ํ•„๋“œ๊ฐ€ ๋ถˆ๋ณ€์ด๋ผ๋ฉด ์ง์ ‘ ๋…ธ์ถœํ•  ๋•Œ์˜ ๋‹จ์ ์ด ์กฐ๊ธˆ์€ ์ค„์–ด๋“ค์ง€๋งŒ, ๊ฒฐ์ฝ” ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹ˆ๋‹ค. API๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋Š” ํ‘œํ˜„ ๋ฐฉ์‹์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๊ณ , ํ•„๋“œ๋ฅผ ์ฝ์„ ๋•Œ ๋ถ€์ˆ˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋‹จ์ ์€ ์—ฌ์ „ํ•˜๋‹ค. ๋‹จ, ๋ถˆ๋ณ€์‹์€ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๋‹ค์Œ Time ํด๋ž˜์Šค๋Š” ๊ฐ ์ธ์Šคํ„ด์Šค๊ฐ€ ์œ ํšจํ•œ ์‹œ๊ฐ„์„ ํ‘œํ˜„ํ•จ์„ ๋ณด์žฅํ•œ๋‹ค.

 

public class Time {
    
    private static final int HOURS_PER_DAY = 24;
    private static final int MINUTES_PER_HOUR = 60;

    public final int hour;
    public final int minute;

    public Time(int hour, int minute){
        if(hour < 0 || hour >= HOURS_PER_DAY)
            throw new IllegalArgumentException("์‹œ๊ฐ„: " + hour);
        if(minute < 0 || minute >= MINUTES_PER_HOUR)
            throw new IllegalArgumentException("๋ถ„: " + minute);
        this.hour = hour;
        this.minute = minute;
    }
}

 

ํ•ต์‹ฌ ์ •๋ฆฌ

 public ํด๋ž˜์Šค๋Š” ์ ˆ๋Œ€ ๊ฐ€๋ณ€ ํ•„๋“œ๋ฅผ ์ง์ ‘ ๋…ธ์ถœํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค. ๋ถˆ๋ณ€ ํ•„๋“œ๋ผ๋ฉด ๋…ธ์ถœํ•ด๋„ ๋œ ์œ„ํ—˜ํ•˜์ง€๋งŒ ์™„์ „ํžˆ ์•ˆ์‹ฌํ•  ์ˆ˜๋Š” ์—†๋‹ค. ํ•˜์ง€๋งŒ package-private ํด๋ž˜์Šค๋‚˜ prviate ์ค‘์ฒฉ ํด๋ž˜์Šค์—์„œ๋Š” ์ข…์ข… ํ•„๋“œ๋ฅผ ๋…ธ์ถœํ•˜๋Š” ํŽธ์ด ๋‚˜์„ ๋•Œ๋„ ์žˆ๋‹ค.

 


 

.์•„์ดํ…œ 17 - ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์„ ์ตœ์†Œํ™”ํ•˜๋ผ

 

 ๋ถˆ๋ณ€ ํด๋ž˜์Šค๋ž€ ๊ฐ„๋‹จํžˆ ๋งํ•ด ๊ทธ ์ธ์Šคํ„ด์Šค์˜ ๋‚ด๋ถ€ ๊ฐ’์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋Š” ํด๋ž˜์Šค๋กœ ์˜ˆ๋กœ BigInteger, BigDecimal ๋“ฑ์ด ์žˆ๋‹ค.

ํด๋ž˜์Šค๋ฅผ ๋ถˆ๋ณ€์œผ๋กœ ๋งŒ๋“ค๋ ค๋ฉด ๋‹ค์Œ ๋‹ค์„ฏ ๊ฐ€์ง€ ๊ทœ์น™์„ ๋”ฐ๋ฅด๋ฉด ๋œ๋‹ค.

 

1. ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฉ”์„œ๋“œ(๋ณ€๊ฒฝ์ž)๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

2. ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์—†๋„๋ก ํ•œ๋‹ค.

 

 - ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ๋ถ€์ฃผ์˜ํ•˜๊ฒŒ ํ˜น์€ ๋‚˜์œ ์˜๋„๋กœ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋ณ€ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์‚ฌํƒœ๋ฅผ ๋ง‰์•„์ค€๋‹ค. ์ƒ์†์„ ๋ง‰๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์€ ํด๋ž˜์Šค๋ฅผ final๋กœ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ, ๊ทธ ์™ธ ๋ฐฉ๋ฒ•๋„ ๊ณง ๋‚˜์˜จ๋‹ค.

 

3. ๋ชจ๋“  ํ•„๋“œ๋ฅผ final๋กœ ์„ ์–ธํ•œ๋‹ค. 

 

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

 

4. ๋ชจ๋“  ํ•„๋“œ๋ฅผ private์œผ๋กœ ์„ ์–ธํ•œ๋‹ค. 

 

 - ํ•„๋“œ๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๊ฐ€๋ณ€ ๊ฐ์ฒด๋ฅผ ํด๋ผ์ด์–ธํŠธ์—์„œ ์ง์ ‘ ์ „๊ทผํ•ด ์ˆ˜์ •ํ•˜๋Š” ์ผ์„ ๋ง‰์•„์ค€๋‹ค. ๊ธฐ์ˆ ์ ์œผ๋กœ๋Š” ๊ธฐ๋ณธ ํƒ€์ž… ํ•„๋“œ๋‚˜ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํ•„๋“œ๋ฅผ public final๋กœ๋งŒ ์„ ์–ธํ•ด๋„ ๋ถˆ๋ณ€ ๊ฐ์ฒด๊ฐ€ ๋˜์ง€๋งŒ, ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์—์„œ ๋‚ด๋ถ€ ํ‘œํ˜„์„ ๋ฐ”๊พธ์ง€ ๋ชปํ•˜๋ฏ€๋กœ ๊ถŒํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค. 

 

5. ์ž์‹  ์™ธ์—๋Š” ๋‚ด๋ถ€์˜ ๊ฐ€๋ณ€ ์ปดํฌ๋„ŒํŠธ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋„๋ก ํ•œ๋‹ค.

 

 - ํด๋ž˜์Šค์—์„œ ๊ฐ€๋ณ€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํ•„๋“œ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์žˆ๋‹ค๋ฉด ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ทธ ๊ฐ์ฒด์˜ ์ฐธ์กฐ๋ฅผ ์–ป์„ ์ˆ˜ ์—†๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค. ์ƒ์„ฑ์ž, ์ ‘๊ทผ์ž, readObject ๋ฉ”์„œ๋“œ(์•„์ดํ…œ 88) ๋ชจ๋‘์—์„œ ๋ฐฉ์–ด์  ๋ณต์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ผ.

 

public final class Complex {
    
    private final double re;
    private final double im;
    
    public Complex(double re, double im){
        this.re = re;
        this.im = im;
    }
    
    public double realPart(){
        return re;
    }
    
    public double imaginaryPart(){
        return im;
    }
    
    public Complex plus(Complex c){
        return new Complex(re + c.re, im + c.im);
    }
    
    public Complex minus(Complex c){
        return new Complex(re - c.re, im - c.im);
    }
    
    public Complex times(Complex c){
        return new Complex(re * c.re - im * c.im, re * c.im + im * c.re);
    }
    
    public Complex dividedBy(Complex c){
        double tmp = c.re * c.re + c.im * c.im;
        return new Complex((re * c.re + im * c.im) / tmp, (im * c.re - re * c.im) / tmp);
    }
    
    @Override
    public boolean equals(Object o){
        if(o == this)
            return true;
        if(!(o instanceof Complex))
            return false;
        Complex c = (Complex) o;
        
        return Double.compare(re, c.re) == 0 && Double.compare(im, c.im) == 0;
    }
    
    @Override
    public int hashCode(){
        int result = 17 + hashDouble(re);
        result = 31 * result + hashDouble(im);
        return result;
    }
    
    private int hashDouble(double val){
        long longBits = Double.doubleToLongBits(re);
        return (int) (longBits ^ (longBits >>> 32));
    }    
}

 

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

 

 ๋˜ํ•œ ๋ถˆ๋ณ€๊ฐ์ฒด๋Š” ๊ทผ๋ณธ์ ์œผ๋กœ ์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•˜์—ฌ ๋”ฐ๋กœ ๋™๊ธฐํ™”ํ•  ํ•„์š” ์—†๋‹ค. ์ฆ‰, ๋ถˆ๋ณ€ ๊ฐ์ฒด๋Š” ์•ˆ์‹ฌํ•˜๊ณ  ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ถ”๊ฐ€๋กœ ๋ถˆ๋ณ€ ํด๋ž˜์Šค์˜ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ •์  ํŒฉํ„ฐ๋ฆฌ(์•„์ดํ…œ 1)๋ฅผ ์ œ๊ณตํ•˜๊ฒŒ ๋˜๋ฉด ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณต์œ ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๊ณผ GC ๋น„์šฉ์ด ์ค„์–ด๋“ ๋‹ค. ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ public ์ƒ์„ฑ์ž ๋Œ€์‹  ์ •์  ํŒฉํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด๋‘๋ฉด, ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ํ•„์š”์— ๋”ฐ๋ผ ์บ์‹œ ๊ธฐ๋Šฅ์„ ๋‚˜์ค‘์— ๋ง ๋ถ™์ผ ์ˆ˜ ์žˆ๋‹ค.

 

 ๋ถˆ๋ณ€ ๊ฐ์ฒด๋Š” ๊ทธ ์ž์ฒด๋กœ ์‹คํŒจ ์›์ž์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค(์•„์ดํ…œ 76).  ์ƒํƒœ๊ฐ€ ์ ˆ๋Œ€ ๋ณ€ํ•˜์ง€ ์•Š์œผ๋‹ˆ ์ž ๊น์ด๋ผ๋„ ๋ถˆ์ผ์น˜ ์ƒํƒœ์— ๋น ์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ์—†๋‹ค.

 

 ๋ถˆ๋ณ€ ๊ฐ์ฒด๋Š” ์ž์œ ๋กญ๊ฒŒ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Œ์€ ๋ฌผ๋ก , ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ผ๋ฆฌ๋Š” ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋กœ BigInteger ํด๋ž˜์Šค๋Š” ๋‚ด๋ถ€ ๊ฐ’์˜ ๋ถ€ํ˜ธ(sign)์™€ ํฌ๊ธฐ(magnitude)๋ฅผ ๋”ฐ๋กœ ํ‘œํ˜„ํ•œ๋‹ค. ๋ถ€ํ˜ธ๋ฅผ int ๋ณ€์ˆ˜, ํฌ๊ธฐ(์ ˆ๋Œ“๊ฐ’)๋Š” int ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•œ๋‹ค. ํ•œํŽธ negate ๋ฉ”์„œ๋“œ๋Š” ํฌ๊ธฐ๊ฐ€ ๊ฐ™๊ณ  ๋ถ€ํ˜ธ๋งŒ ๋ฐ˜๋Œ€์ธ ์ƒˆ๋กœ์šด BigInteger๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ, ์ด๋•Œ ๋ฐฐ์—ด์€ ๋น„๋ก ๊ฐ€๋ณ€์ด์ง€๋งŒ ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ณ  ์›๋ณธ ์ธ์Šคํ„ด์Šค์™€ ๊ณต์œ ํ•ด๋„ ๋œ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ์ƒˆ๋กœ ๋งŒ๋“  BigInteger ์ธ์Šคํ„ด์Šค๋„ ์›๋ณธ ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋‚ด๋ถ€ ๋ฐฐ์—ด์„ ๊ทธ๋Œ€๋กœ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

 

public class BigInteger extends Number implements Comparable<BigInteger> {
    final int signum;
    final int[] mag;
    ...
}

negate()

    public BigInteger negate() {
        return new BigInteger(this.mag, -this.signum);
    }

 

 ๋ถˆ๋ณ€ ํด๋ž˜์Šค์—๋„ ๋‹จ์ ์ด ์žˆ๋‹ค. ๊ฐ’์ด ๋‹ค๋ฅด๋ฉด ๋ฐ˜๋“œ์‹œ ๋…๋ฆฝ๋œ ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ฐ’์˜ ๊ฐ€์ง“์ˆ˜๊ฐ€ ๋งŽ๋‹ค๋ฉด ์ด๋“ค์„ ๋ชจ๋‘ ๋งŒ๋“œ๋Š” ๋ฐ ํฐ ๋น„์šฉ์„ ์น˜๋Ÿฌ์•ผ ํ•œ๋‹ค.

 ์˜ˆ๋กœ ๋ฐฑ๋งŒ ๋น„ํŠธ์งœ๋ฆฌ BigIntger์—์„œ ๋น„ํŠธ ํ•˜๋‚˜๋ฅผ ๋ฐ”๊ฟ”์•ผ ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด. 

BigIntger moby = ...;
moby = moby.flipBit(0);

 flipBit ๋ฉ”์„œ๋“œ๋Š” ์ƒˆ๋กœ์šด BigIntger ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์›๋ณธ๊ฐ€ ๋‹จ์ง€ ํ•œ ๋น„ํŠธ๋งŒ ๋‹ค๋ฅธ ๋ฐฑ๋งŒ ๋น„ํŠธ์งœ๋ฆฌ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ง์ด๋‹ค.

์ด๋กœ ์ธํ•ด ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ถˆ๊ฑฐ์ง„๋‹ค.

    public BigInteger flipBit(int n) {
        if (n < 0) {
            throw new ArithmeticException("Negative bit address");
        } else {
            int intNum = n >>> 5;
            int[] result = new int[Math.max(this.intLength(), intNum + 2)];

            for(int i = 0; i < result.length; ++i) {
                result[result.length - i - 1] = this.getInt(i);
            }

            result[result.length - intNum - 1] ^= 1 << (n & 31);
            return valueOf(result);
        }
    }

 

 ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ ์ฒซ ๋ฒˆ์งธ๋Š” ๋‹ค๋‹จ๊ณ„ ์—ฐ์‚ฐ(multistep operation)๋“ค์„ ์˜ˆ์ธกํ•˜์—ฌ ๊ธฐ๋ณธ๊ธฐ๋Šฅ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์˜ˆ๋กœ BigInteger๋Š” ๋ชจ๋“ˆ๋Ÿฌ ์ง€์ˆ˜ ๊ฐ™์€ ๋‹ค๋‹จ๊ณ„ ์—ฐ์‚ฐ ์†๋„๋ฅผ ๋†’์—ฌ์ฃผ๋Š” ๊ฐ€๋ณ€ ๋™๋ฐ˜ ํด๋ž˜์Šค(companion class)๋ฅผ package-private์œผ๋กœ ๋‘๊ณ  ์žˆ๋‹ค. 

 ํด๋ผ์ด์–ธํŠธ์˜ ๋ณต์žกํ•œ ์—ฐ์‚ฐ๋“ค์„ ์ •ํ™•ํžˆ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด package-private์˜ ๊ฐ€๋ณ€ ๋™๋ฐ˜ ํด๋ž˜์Šค๋งŒ์œผ๋กœ ์ถฉ๋ถ„ํ•˜๋‹ค.

๋Œ€ํ‘œ์ ์ธ ์˜ˆ String ํด๋ž˜์Šค์˜ ๊ฐ€๋ณ€ ๋™๋ฐ˜ ํด๋ž˜์Šค๋Š” StringBuilder์ด๋‹ค.

 

 

 ์ž์‹ ์„ ์ƒ์†๋ฐ›์ง€ ๋ชปํ•˜๋Š” ๋‹ค์Œ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์ƒ์„ฑ์ž๋ฅผ private ํ˜น์€ package-private์œผ๋กœ ๋‘๊ณ  ๋ชจ๋“  ์ƒ์„ฑ์ž๋ฅผ ์ •์  ํŒฉํ† ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

public final class Complex {

    private final double re;
    private final double im;

    private Complex(double re, double im){
        this.re = re;
        this.im = im;
    }
    public static Complex valueOf(double re, double im){
        return new Complex(re, im);
    }

 

์ง๋ ฌํ™” ์ฃผ์˜์‚ฌํ•ญ

Serializable์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ถˆ๋ณ€ ํด๋ž˜์Šค์˜ ๋‚ด๋ถ€์— ๊ฐ€๋ณ€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํ•„๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด readObject๋‚˜ readResolve ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜, ObjectOutputStream.writeUnshared์™€ ObjectInputStrea.readUnshared ๋ฉ”์„œ๋“ค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ํ”Œ๋žซํผ์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ ์ง๋ ฌํ™” ๋ฐฉ๋ฒ•์ด๋ฉด ์ถฉ๋ถ„ํ•˜๋”๋ผ๋„ ๋ง์ด๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ณต๊ฒฉ์ž๊ฐ€ ์ด ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ๊ฐ€๋ณ€ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.(์•„์ดํ…œ 88)

 

 ํด๋ž˜์Šค๋Š” ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋ถˆ๋ณ€์ด์–ด์•ผ ํ•œ๋‹ค. ๋ถˆ๋ณ€์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์—†๋Š” ํด๋ž˜์Šค๋ผ๋„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์„ ์ตœ์†Œํ•œ์œผ๋กœ ์ค„์ด์ž. ๋‹ค๋ฅธ ํ•ฉ๋‹นํ•œ ์ด์œ ๊ฐ€ ์—†๋‹ค๋ฉด ๋ชจ๋“  ํ•„๋“œ๋Š” private final์ด์–ด์•ผ ํ•œ๋‹ค. ๊ฐ์ฒด๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ์˜ ์ˆ˜๋ฅผ ์ค„์ด๋ฉด ๊ทธ ๊ฐ์ฒด๋ฅผ ์˜ˆ์ธกํ•˜๊ธฐ ์‰ฌ์›Œ์ง€๊ณ  ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ธธ ๊ฐ€๋Šฅ์„ฑ์ด ์ค„์–ด๋“ค๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


 

.์•„์ดํ…œ 18 - ์ƒ์†๋ณด๋‹ค๋Š” ์ปดํฌ์ง€์…˜์„ ์‚ฌ์šฉํ•˜๋ผ

 

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

 

 ์ด์ƒ์˜ ๋ฌธ์ œ๋ฅผ ํ”ผํ•ด ๊ฐ€๊ธฐ ์œ„ํ•ด. ๊ธฐ์กด ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•˜๋Š” ๋Œ€์‹ , ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  private ํ•„๋“œ๋กœ ๊ธฐ์กด ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ํ•˜์ž. ๊ธฐ์กด ํด๋ž˜์Šค๊ฐ€ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค์˜ ๊ตฌ์„ฑ์š”์†Œ๋กœ ์“ฐ์ธ๋‹ค๋Š” ๋œป์—์„œ ์ด๋Ÿฌํ•œ ์„ค๊ณ„๋ฅผ ์ปดํฌ์ง€์…˜์ด๋ผ ํ•œ๋‹ค. 

 

public class InstrumentedSet<E> extends ForwardingSet<E> {

    private int addCount = 0;

    public InstrumentedSet(Set<E> s) {
        super(s);
    }

    @Override
    public boolean add(E e) {
        addCount++;
        return super.add(e);
    }

    @Override
    public boolean addAll(Collection<? extends E> c) {
        addCount += c.size();
        return super.addAll(c);
    }

    public int getAddCount() {
        return addCount;
    }
}
// ์ „๋‹ฌ ํด๋ž˜์Šค
public class ForwardingSet<E> implements Set<E> {

    private final Set<E> set;

    public ForwardingSet(Set<E> set){
        this.set = set;
    }
    
    @Override
    public int size() {
        return set.size();
    }

    @Override
    public boolean isEmpty(){
        return set.isEmpty();
    }
    ...
}

 

 ๋‹ค๋ฅธ Set ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ์‹ธ๊ณ  ์žˆ๋‹ค๋Š” ๋œป์—์„œ InstrumentedSet ๊ฐ™์€ ํด๋ž˜์Šค๋ฅผ ๋ž˜ํผ ํด๋ž˜์Šค๋ผ ํ•˜๋ฉฐ, ๋‹ค๋ฅธ Set์— ๊ณ„์ธก ๊ธฐ๋Šฅ์„ ๋ง์”Œ์šด๋‹ค๋Š” ๋œป์—์„œ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์ปดํฌ์ง€์…˜๊ณผ ์ „๋‹ฌ์˜ ์กฐํ•ฉ์€ ๋„“์€ ์˜๋ฏธ๋กœ ์œ„์ž„์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๋‹จ, ์—„๋ฐ€ํžˆ ๋”ฐ์ง€๋ฉด ๋ž˜ํผ ๊ฐ์ฒด๊ฐ€ ๋‚ด๋ถ€ ๊ฐ์ฒด์— ์ž๊ธฐ ์ž์‹ ์˜ ์ฐธ์กฐ๋ฅผ ๋„˜๊ธฐ๋Š” ๊ฒฝ์šฐ๋งŒ ์œ„์ž„์— ํ•ด๋‹นํ•œ๋‹ค.

 ๋ž˜ํผ ํด๋ž˜์Šค๋Š” ๋‹จ์ ์ด ๊ฑฐ์˜ ์—†๋‹ค. ํ•œ ๊ฐ€์ง€, ๋ž˜ํผ ํด๋ž˜์Šค๊ฐ€ ์ฝœ๋ฐฑ ํ”„๋ ˆ์ž„์›Œํฌ์™€๋Š” ์–ด์šธ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ๋งŒ ์ฃผ์˜ํ•˜๋ฉด ๋œ๋‹ค. ์ฝœ๋ฐฑ ํ”„๋ ˆ์ž„ ์›Œํฌ์—์„œ๋Š” ์ž๊ธฐ ์ž์‹ ์˜ ์ฐธ์กฐ๋ฅผ ๋‹ค๋ฅธ ๊ฐ์ฒด์— ๋„˜๊ฒจ์„œ ๋‹ค์Œ ํ˜ธ์ถœ ๋•Œ ์‚ฌ์šฉํ•˜๋„๋ก ํ•œ๋‹ค. ๋‚ด๋ถ€ ๊ฐ์ฒด๋Š” ์ž์‹ ์„ ๊ฐ์‹ธ๊ณ  ์žˆ๋Š” ๋ž˜ํผ์˜ ์กด์žฌ๋ฅผ ๋ชจ๋ฅด๋‹ˆ ๋Œ€์‹  ์ž์‹ (this)์˜ ์ฐธ์กฐ๋ฅผ ๋„˜๊ธฐ๊ณ  ์ฝœ๋ฐฑ ๋•Œ๋Š” ๋ž˜ํผ๊ฐ€ ์•„๋‹Œ ๋‚ด๋ถ€ ๊ฐ์ฒด๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋ฅผ Self ๋ฌธ์ œ๋ผ๊ณ  ํ•œ๋‹ค.

 

 ์ƒ์†์€ ๋ฐ˜๋“œ์‹œ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์ƒ์œ„ ํด๋ž˜์Šค์˜ '์ง„์งœ' ํ•˜์œ„ ํƒ€์ž…์ธ ์ƒํ™ฉ์—์„œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ํด๋ž˜์Šค B๊ฐ€ ํด๋ž˜์Šค A์™€ is-a ๊ด€๊ณ„์ผ ๋•Œ๋งŒ ํด๋ž˜์Šค A๋ฅผ ์ƒ์†ํ•ด์•ผ ํ•œ๋‹ค. ํด๋ž˜์Šค A๋ฅผ ์ƒ์†ํ•˜๋Š” ํด๋ž˜์Šค B๋ฅผ ์ž‘์„ฑํ•˜๋ ค ํ•œ๋‹ค๋ฉด 'B๊ฐ€ ์ •๋ง A์ธ๊ฐ€?'๋ผ๊ณ  ์ž๋ฌธํ•ด ๋ณด์ž. ๋Œ€๋‹ต์ด ์•„๋‹ˆ๋ผ๋ฉด A๋ฅผ private ์ธ์Šคํ„ด์Šค๋กœ ๋‘๊ณ , A์™€๋Š” ๋‹ค๋ฅธ API๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ๋Œ€๋‹ค์ˆ˜๋‹ค.

 

ํ•ต์‹ฌ ์ •๋ฆฌ

 ์ƒ์†์€ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ ์บก์Šํ™”๋ฅผ ํ•ด์นœ๋‹ค. ์ƒ์†์€ ์ƒ์œ„ ํด๋ž˜์Šค์™€ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์ˆœ์ˆ˜ํ•œ is-a ๊ด€๊ณ„์ผ ๋•Œ๋งŒ ์จ์•ผ ํ•œ๋‹ค. is-a๊ด€๊ณ„์ผ ๋•Œ๋„ ์•ˆ์‹ฌํ•  ์ˆ˜๋งŒ์€ ์—†๋Š” ๊ฒŒ, ํ•˜์œ„ ํด๋ž˜์Šค์˜ ํŒจํ‚ค์ง€๊ฐ€ ์ƒ์œ„ ํด๋ž˜์Šค์™€ ๋‹ค๋ฅด๊ณ , ์ƒ์œ„ ํด๋ž˜์Šค๊ฐ€ ํ™•์žฅ์„ ๊ณ ๋ คํ•ด ์„ค๊ณ„๋˜์ง€ ์•Š์•„ ๋‹ค๋ฉด ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ์ƒ์†์˜ ์ทจ์•ฝ์ ์„ ํ”ผํ•˜๋ ค๋ฉด ์ƒ์† ๋Œ€์‹  ์ปดํฌ์ง€์…˜๊ณผ ์ „๋‹ฌ์„ ์‚ฌ์šฉํ•˜์ž. ํŠนํžˆ ๋ž˜ํผ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•  ์ ๋‹นํ•œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด ๋”์šฑ ๊ทธ๋ ‡๋‹ค. ๋ž˜ํผ ํด๋ž˜์Šค๋Š” ํ•˜์œ„ ํด๋ž˜์Šค๋ณด๋‹ค ๊ฒฌ๊ณ ํ•˜๊ณ  ๊ฐ•๋ ฅํ•˜๋‹ค.

 

.์•„์ดํ…œ 19 - ์ƒ์†์„ ๊ณ ๋ คํ•ด ์„ค๊ณ„ํ•˜๊ณ  ๋ฌธ์„œํ™”ํ•˜๋ผ. ๊ทธ๋Ÿฌ์ง€ ์•Š์•˜๋‹ค๋ฉด ์ƒ์†์„ ๊ธˆ์ง€ํ•˜๋ผ

 

 

 ์ƒ์†์šฉ ํด๋ž˜์Šค๋Š” ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋“ค์„ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ด์šฉํ•˜๋Š”์ง€(์ž๊ธฐ ์‚ฌ์šฉ) ๋ฌธ์„œ๋กœ ๋‚จ๊ฒจ์•ผ ํ•œ๋‹ค.  API ์„ค๋ช…, ์–ด๋–ค ์ˆœ์„œ๋กœ ํ˜ธ์ถœํ•˜๋Š”์ง€, ๊ฐ๊ฐ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๊ฐ€ ์ด์–ด์ง€๋Š” ์ฒ˜๋ฆฌ์— ์–ด๋–ค ์˜ํ–ฅ์„ ์ฃผ๋Š”์ง€ ๋‹ด์•„์•ผ ํ•œ๋‹ค.('์žฌ์ •์˜ ๊ฐ€๋Šฅ'์ด๋ž€ public๊ณผ protected ๋ฉ”์„œ๋“œ ์ค‘ final์ด ์•„๋‹Œ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ๋œปํ•œ๋‹ค).  ๋” ๋„“๊ฒŒ ๋งํ•˜๋ฉด, ์žฌ์ •์˜ ๊ฐ€๋Šฅ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ƒํ™ฉ์„ ๋ฌธ์„œ๋กœ ๋‚จ๊ฒจ์•ผ ํ•œ๋‹ค.

 API ๋ฌธ์„œ ์ค‘ ๋ฉ”์„œ๋“œ ์„ค๋ช… ๋์—์„œ ์ข…์ข… "Implementation Requirements"๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ ˆ์€ ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€ ๋™์ž‘ ๋ฐฉ์‹์„ ์„ค๋ช…ํ•˜๋Š” ๊ณณ์ด๋‹ค.

 ํšจ์œจ ์ ์ธ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ํฐ ์–ด๋ ค์›€ ์—†์ด ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ ค๋ฉด ํด๋ž˜์Šค์˜ ๋‚ด๋ถ€ ๋™์ž‘ ๊ณผ์ • ์ค‘๊ฐ„์— ๋ผ์–ด๋“ค ์ˆ˜ ์žˆ๋Š” ํ›…(hook)์„ ์ž˜ ์„ ๋ณ„ํ•˜์—ฌ protected ๋ฉ”์„œ๋“œ ํ˜•ํƒœ๋กœ ๊ณต๊ฐœํ•ด์•ผ ํ•  ์ˆ˜ ๋„ ์žˆ๋‹ค.

 

 ์ƒ์†์šฉ ํด๋ž˜์Šค๋ฅผ ์‹œํ—˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ง์ ‘ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋Š” ๊ฒƒ์ด ์œ ์ผํ•˜๋ฉฐ ๋ฐ˜๋“œ์‹œ ๋งŒ๋“ค์–ด์„œ ๊ฒ€์ฆํ•ด๋ด์•ผ ํ•œ๋‹ค.

์ƒ์†์šฉ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋Š” ์ง์ ‘์ ์ด๋“  ๊ฐ„์ ‘์ ์ด๋“  ์žฌ์ •์˜ ๊ฐ€๋Šฅ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค. ์ƒ์œ„ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๊ฐ€ ํ•˜์œ„ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋˜๋ฏ€๋กœ ์žฌ์ •์˜ ํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ํ•˜์œ„ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ณด๋‹ค ๋จผ์ € ํ˜ธ์ถœ๋œ๋‹ค. ์ด๋•Œ ์žฌ์ •์˜ํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ํ•˜์œ„ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์—์„œ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฐ’์— ์˜์กดํ•œ๋‹ค๋ฉด ์˜๋„๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.

 

public class Super {

    // ์ž˜๋ชป๋œ ์˜ˆ - ์ƒ์„ฑ์ž๊ฐ€ ์žฌ์ •์˜ ๊ฐ€๋Šฅ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
    public Super() {
        overrideMe();
    }

    public void overrideMe() {
    }
}
public class Sub extends Super {

    // ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ final ํ•„๋“œ. ์ƒ์„ฑ์ž์—์„œ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
    private final Instant instant;

    public Sub() {
        instant = Instant.now();
    }

    // ์žฌ์ •์˜ ๊ฐ€๋Šฅ ๋ฉ”์„œ๋“œ. ์ƒ์œ„ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๊ฐ€ ํ˜ธ์ถœํ•œ๋‹ค.
    @Override
    public void overrideMe() {
        System.out.println("instant = " + instant);
    }

    public static void main(String[] args) {
        Sub sub = new Sub();
        // ์ƒ์œ„ ํด๋ž˜์Šค ์ƒ์„ฑ์ด ๋จผ์ € ์ง„ํ–‰ ๋˜๊ธฐ ๋•Œ๋ฌธ์— instant๋Š” null์ด๋‹ค.
        sub.overrideMe();
    }
}
// ์‹ค์ œ ์ถœ๋ ฅ ๊ฐ’

instant = null
instant = 2023-05-16T12:20:54.766884300Z

 

 Cloneable๊ณผ Serializable ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ƒ์†์šฉ ์„ค๊ณ„์˜ ์–ด๋ ค์›€์„ ํ•œ์ธต ๋”ํ•ด์ค€๋‹ค. clone๊ณผ readObject ๋ชจ๋‘ ์ง์ ‘์ ์ด๋“  ๊ฐ„์ ‘์ ์œผ๋กœ๋“  ์žฌ์ •์˜ ๊ฐ€๋Šฅ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.. readObject์˜ ๊ฒฝ์šฐ ํ•˜์œ„ ํด๋ž˜์Šค์˜ ์ƒํƒœ๊ฐ€ ๋ฏธ์ฒ˜ ๋‹ค ์—ญ์ง๋ ฌํ™”๋˜๊ธฐ ์ „์— ์žฌ์ •์˜ํ•œ ๋ฉ”์„œ๋“œ๋ถ€ํ„ฐ ํ˜ธ์ถœํ•˜๊ฒŒ ๋œ๋‹ค. clone์˜ ๊ฒฝ์šฐ ํ•˜์œ„ ํด๋ž˜์Šค์˜ clone ๋ฉ”์„œ๋“œ๊ฐ€ ๋ณต์ œ๋ณธ์˜ ์ƒํƒœ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์ „์— ์žฌ์ •์˜ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์–ด๋Š ์ชฝ์ด๋“  ํ”„๋กœ๊ทธ๋žจ ์˜ค์ž‘๋™์œผ๋กœ ์ด์–ด์งˆ ๊ฒƒ์ด๋‹ค.

 

 ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์ƒ์†์šฉ์œผ๋กœ ์„ค๊ณ„ํ•˜์ง€ ์•Š์€ ํด๋ž˜์Šค๋Š” ์ƒ์†์„ ๊ธˆ์ง€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ธˆ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‘ ๊ฐ€์ง€์ด๋‹ค. ์‰ฌ์šด ๋ฐฉ๋ฒ• ํ•œ ๊ฐ€์ง€๋Š” ํด๋ž˜์Šค๋ฅผ final๋กœ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๋‘ ๋ฒˆ์งธ๋Š” ๋ชจ๋“  ์ƒ์„ฑ์ž๋ฅผ private์ด๋‚˜. package-private์œผ๋กœ ์„ ์–ธํ•˜๊ณ  public ์ •์  ํŒฉํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

ํ•ต์‹ฌ ์ •๋ฆฌ

 ์ƒ์†์šฉ ํด๋ž˜์Šค๋ฅผ ์„ค๊ณ„ํ•˜๊ธฐ๋ž€ ๊ฒฐ์ฝ” ๋งŒ๋งŒ์น˜ ์•Š๋‹ค. ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ์Šค์Šค๋กœ๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€(์ž๊ธฐ ์‚ฌ์šฉ ํŒจํ„ด) ๋ชจ๋‘ ๋ฌธ์„œ๋กœ ๋‚จ๊ฒจ์•ผ ํ•˜๋ฉฐ, ์ผ๋‹จ ๋ฌธ์„œํ™”ํ•œ ๊ฒƒ์€ ๊ทธ ํด๋ž˜์Šค๊ฐ€ ์“ฐ์ด๋Š” ํ•œ ๋ฐ˜๋“œ์‹œ ์ง€์ผœ์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ์ง€ ์•Š์œผ๋ฉด ๊ทธ ๋‚ด๋ถ€ ๊ตฌํ˜„ ๋ฐฉ์‹์„ ๋ฏฟ๊ณ  ํ™œ์šฉํ•˜๋˜ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ์˜ค๋™์ž‘ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋ฅธ ์ด๊ฐ€ ํšจ์œจ ์ข‹์€ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ์ผ๋ถ€ ๋ฉ”์„œ๋“œ๋ฅผ protected๋กœ ์ œ๊ณตํ•ด์•ผ ํ•  ์ˆ˜ ๋„ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•ด์•ผ ํ•  ๋ช…ํ™•ํ•œ ์ด์œ ๊ฐ€ ๋– ์˜ค๋ฅด์ง€ ์•Š์œผ๋ฉด ์ƒ์†์„ ๊ธˆ์ง€ํ•˜๋Š” ํŽธ์ด ๋‚˜์„ ๊ฒƒ์ด๋‹ค. ์ƒ์†์„ ๊ธˆ์ง€ํ•˜๋ ค๋ฉด ํด๋ž˜์Šค๋ฅผ final๋กœ ์„ ์–ธํ•˜๊ฑฐ๋‚˜ ์ƒ์„ฑ์ž ๋ชจ๋‘๋ฅผ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋„๋ก ๋งŒ๋“ค๋ฉด ๋œ๋‹ค.

.์•„์ดํ…œ 20 - ์ถ”์ƒ ํด๋ž˜์Šค๋ณด๋‹ค๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์šฐ์„ ํ•˜๋ผ

 

 ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ฏน์Šค์ธ(mixin) ์ •์˜์— ์•ˆ์„ฑ๋งž์ถค์ด๋‹ค. ๋ฏน์Šค์ธ์ด๋ž‘ ํด๋ž˜์Šค๊ฐ€ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์œผ๋กœ, ๋ฏน์Šค์ธ์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์— ์›๋ž˜์˜ '์ฃผ๋œ ํƒ€์ž…' ์™ธ์—๋„ ํŠน์ • ์„ ํƒ์  ํ–‰์œ„๋ฅผ ์ œ๊ณตํ•œ๋‹ค๊ณ  ์„ ์–ธํ•˜๋Š” ํšจ๊ณผ๋ฅผ ์ค€๋‹ค. ์˜ˆ๋กœ Comparable์€ ์ž์‹ ์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋“ค๋ผ๋ฆฌ๋Š” ์ˆœ์„œ๋ฅผ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์„ ์–ธํ•˜๋Š” ๋ฏน์Šค์ธ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. ์ถ”์ƒ ํด๋ž˜์Šค๋กœ๋Š” ๋ฏน์Šค์ธ์„ ์ •์˜ํ•  ์ˆ˜ ์—†๋‹ค. ๊ธฐ์กด ํด๋ž˜์Šค์— ๋ง์”Œ์šธ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํด๋ž˜์Šค๋Š” ๋‘ ๋ถ€๋ชจ๋ฅผ ์„ฌ๊ธธ ์ˆ˜ ์—†๊ณ , ํด๋ž˜์Šค ๊ณ„์ธต๊ตฌ์กฐ์—๋Š” ๋ฏน์Šค์ธ์„ ์‚ฝ์ž…ํ•˜๊ธฐ์— ํ•ฉ๋ฆฌ์ ์ธ ์œ„์น˜๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ธฐ๋Šฅ์„ ํ–ฅ์ƒํ•˜๋Š” ์•ˆ์ „ํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ์ˆ˜๋‹จ์ด ๋œ๋‹ค.

 

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

 ๊ด€๋ก€๋กœ ์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฆ„์ด interface๋ผ๋ฉด ๊ทธ ๊ณจ๊ฒฉ ๊ตฌํ˜„ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์€ AbstractInterface๋กœ ์ง“๋Š”๋‹ค. ์˜ˆ๋กœ ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์˜ AbstradctCollection, AbstractSet ๋“ฑ์ด ํ•ต์‹ฌ ์ปฌ๋ ‰์…˜ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ณจ๊ฒฉ ๊ตฌํ˜„์ด๋‹ค.

public abstract class AbstractMap<K, V> implements Map<K, V> {
    transient Set<K> keySet;
    transient Collection<V> values;

    protected AbstractMap() {
    }
    ...

 ๋‹จ์ˆœ ๊ตฌํ˜„์€ ๊ณจ๊ฒฉ ๊ตฌํ˜„์˜ ์ž‘์€ ๋ณ€์ข…์œผ๋กœ AbstractMap.SimpleEntiry๊ฐ€ ์ข‹์€ ์˜ˆ๋”ฐ. ๋‹จ์ˆœ ๊ตฌํ˜„๋„ ๊ณจ๊ฒฉ ๊ตฌํ˜„๊ณผ ๊ฐ™์ด ์ƒ์†์„ ์œ„ํ•ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ด์ง€๋งŒ, ์ถ”์ƒ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋ž€ ์ ์ด ๋‹ค๋ฅด๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•ด ๋™์ž‘ํ•˜๋Š” ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๊ตฌํ˜„์ด๋‹ค. ํ•„์š”์— ๋”ฐ๋ผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๊ณ  ํ™•์žฅ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

public static class SimpleEntry<K, V> implements Map.Entry<K, V>, Serializable {
        private static final long serialVersionUID = -8499721149061103585L;
        private final K key;
        private V value;
        ...

 

ํ•ต์‹ฌ ์ •๋ฆฌ

 ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์ค‘ ๊ตฌํ˜„์šฉ ํƒ€์ž…์œผ๋กœ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ฐ€์žฅ ์ ํ•ฉํ•˜๋‹ค. ๋ณต์žกํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ผ๋ฉด ๊ตฌํ˜„ํ•˜๋Š” ์ˆ˜๊ณ ๋ฅผ ๋œ์–ด์ฃผ๋Š” ๊ณจ๊ฒฉ ๊ตฌํ˜„์„ ํ•จ๊ป˜ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ผญ ๊ณ ๋ คํ•ด ๋ณด์ž. ๊ณจ๊ฒฉ ๊ตฌํ˜„์€ '๊ฐ€๋Šฅํ•œ ํ•œ' ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋กœ ์ œ๊ณตํ•˜์—ฌ ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๋ชจ๋“  ๊ณณ์—์„œ ํ™œ์šฉํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. '๊ฐ€๋Šฅํ•œ ํ•œ'์ด๋ผ ํ•œ ์ด์œ ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ๊ฑธ๋ ค์žˆ๋Š” ๊ตฌํ˜„์ƒ์˜ ์ œ์•ฝ ๋•Œ๋ฌธ์— ๊ณจ๊ฒฉ ๊ตฌํ˜„์„ ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋” ํ”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

.์•„์ดํ…œ 21 - ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ตฌํ˜„ํ•˜๋Š” ์ชฝ์„ ์ƒ๊ฐํ•ด ์„ค๊ณ„ํ•˜๋ผ

 

 ์ž๋ฐ” 8 ์ด์ „์—๋Š” ๊ธฐ์กด ๊ตฌํ˜„์ฒด๋ฅผ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š๊ณ  ์ธํ„ฐํŽ˜์ด์Šค์— ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋ฐฉ๋ฒ•์ด ์—†์—ˆ์ง€๋งŒ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋กœ ์ธํ•ด ์ถ”๊ฐ€๊ฐ€ ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐ์กด ๊ตฌํ˜„์ฒด๋“ค๊ณผ ๋งค๋„๋Ÿฝ๊ฒŒ ์—ฐ๋™๋˜๋ฆฌ๋ผ๋Š” ๋ณด์žฅ์€ ์—†๋‹ค. ์ž๋ฐ” 7 ๊นŒ์ง€๋Š” ๋ชจ๋“  ํด๋ž˜์Šค๊ฐ€ 'ํ˜„์žฌ์˜ ์ธํ„ฐํŽ˜์ด์Šค์— ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ๊ฐ€ ์ถ”๊ฐ€๋  ์ผ์€ ์˜์›ํžˆ ์—†๋‹ค'๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์ž‘์„ฑ๋๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 ์ž๋ฐ” 8 ํ•ต์‹ฌ ์ปฌ๋ ‰์…˜ ์ธํ„ฐํŽ˜์ด์Šค๋“ค์— ๋‹ค์ˆ˜์˜ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋Š”๋ฐ. ์ฃผ๋กœ ๋žŒ๋‹ค(7์žฅ)๋ฅผ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋‹ค. ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋Š” ์ฝ”๋“œ ํ’ˆ์งˆ์ด ๋†’๊ณ  ๋ฒ”์šฉ์ ์ด๋ผ ๋Œ€๋ถ€๋ถ„ ์ƒํ™ฉ์—์„œ ์ž˜ ์ž‘๋™ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ƒํ™ฉ์—์„œ ๋ถˆ๋ณ€์‹์„ ํ•ด์น˜์ง€ ์•Š๋Š” ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๋Š” ์–ด๋ ต๋‹ค.

 

 - ์ž๋ฐ” 8์—์„œ ์ถ”๊ฐ€๋œ Collection ์ธํ„ฐํŽ˜์ด์Šค์˜ removeIf ๋””ํดํŠธ ๋ฉ”์„œ๋“œ

    default boolean removeIf(Predicate<? super E> filter) {
        Objects.requireNonNull(filter);
        boolean removed = false;
        Iterator<E> each = this.iterator();

        while(each.hasNext()) {
            if (filter.test(each.next())) {
                each.remove();
                removed = true;
            }
        }

        return removed;
    }

 

 ์œ„์™€ ๊ฐ™์€ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ชจ๋‘ ์–ด์šธ๋ ค์ง€๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค ์˜ˆ๋กœ SynchronizedCollection์œผ๋กœ ๋™๊ธฐํ™” ๊ณผ์ •์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ๊ฐ€๋Šฅํ•˜๋‹ค. ์œ„์˜ removeIf๋Š” ๋™๊ธฐํ™”์˜ lock๊ณผ ๊ด€๋ จ๋œ ์‚ฌํ•ญ์€ ์ผ์ฒด ๋ชจ๋ฅด๋ฏ€๋กœ ์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

  ๋”ฐ๋ผ์„œ, ๊ธฐ์กด ์ธํ„ฐํŽ˜์ด์Šค์— ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋กœ ์ƒˆ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ผ์€ ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ํ”ผํ•˜์ž. ํ•˜์ง€๋งŒ ์ƒˆ๋กœ์šด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋Š” ์•„์ฃผ ์œ ์šฉํ•œ ์ˆ˜๋‹จ์ด๋‹ค.


 

.์•„์ดํ…œ 22 - ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํƒ€์ž…์„ ์ •์˜ํ•˜๋Š” ์šฉ๋„๋กœ๋งŒ ์‚ฌ์šฉํ•˜๋ผ

 

  ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ž์‹ ์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž… ์—ญํ• ์„ ํ•œ๋‹ค. ์˜ค์ง ์ด์šฉ๋„๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์ด ์ง€์นจ์— ๋งž์ง€ ์•Š์€ ์˜ˆ๋กœ ์ƒ์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์กด์žฌํ•œ๋‹ค. ์ƒ์ˆ˜๋ฅผ ๋œปํ•˜๋Š” static final ํ•„๋“œ๋กœ๋งŒ ๊ฐ€๋“ ์ฐจ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. 

 

 - ์ƒ์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค ์•ˆํ‹ฐํŒจํ„ด (์ธํ„ฐํŽ˜์ด์Šค์˜ ์ž˜๋ชป ์‚ฌ์šฉํ•œ ์˜ˆ)

public interface PhysicalConstants {

    // ์•„๋ณด๊ฐ€๋“œ๋กœ ์ˆ˜ (1/๋ชฐ)
    static final double AVOGADROS_NUMBER = 6.022_140_857e23;

    // ๋ณผ์ธ ๋งŒ ์ƒ์ˆ˜ (J/K)
    static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23;

    // ์ „์ž ์งˆ๋Ÿ‰ (kg)
    static final double ELECTRON_MASS = 9.109_383_56e-31;
}

- ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ํด๋ž˜์Šค์˜ API ๋…ธ์ถœ -> ์‚ฌ์šฉ์ž์—๊ฒŒ ํ˜ผ๋ž€

- ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๊ฐ€ ๋‚ด๋ถ€ ๊ตฌํ˜„์— ํ•ด๋‹นํ•˜๋Š” ์œ„์˜ ์ƒ์ˆ˜๋“ค์—๊ฒŒ ์ข…์†๋  ์œ„ํ—˜

 

 ์œ„์™€ ๊ฐ™์ด ์ƒ์ˆ˜๋ฅผ ๊ณต๊ฐœํ•  ๋ชฉ์ ์ด๋ผ๋ฉด ์‚ฌ์šฉ ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค ์ž์ฒด์— ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ์—ด๊ฑฐ ํƒ€์ž…์œผ๋กœ ๊ณต๊ฐœํ•˜๊ฑฐ๋‚˜(์•„์ดํ…œ 34) ์ด๋„ ์•„๋‹ˆ๋ผ๋ฉด ์ธ์Šคํ„ด์Šคํ™”ํ•  ์ˆ˜ ์—†๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค(์•„์ดํ…œ 4)์— ๋‹ด์•„ ๊ณต๊ฐœํ•˜์ž.

 

 - ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค ๋ฒ„์ „

public class PhysicalConstantUtils {
    private PhysicalConstantUtils() {} // ์ธ์Šคํ„ด์Šคํ™” ๋ฐฉ์ง€

    // ์•„๋ณด๊ฐ€๋“œ๋กœ ์ˆ˜ (1/๋ชฐ)
    public static final double AVOGADROS_NUMBER = 6.022_140_857e23;

    // ๋ณผ์ธ ๋งŒ ์ƒ์ˆ˜ (J/K)
    public static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23;

    // ์ „์ž ์งˆ๋Ÿ‰ (kg)
    public static final double ELECTRON_MASS = 9.109_383_56e-31;
}

 

ํ•ต์‹ฌ ์ •๋ฆฌ

 ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํƒ€์ž…์„ ์ •์˜ํ•˜๋Š” ์šฉ๋„๋กœ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์ƒ์ˆ˜ ๊ณต๊ฐœ์šฉ ์ˆ˜๋‹จ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋ง์ž.

 

.์•„์ดํ…œ 23 - ํƒœ๊ทธ ๋‹ฌ๋ฆฐ ํด๋ž˜์Šค๋ณด๋‹ค๋Š” ํด๋ž˜์Šค ๊ณ„์ธต๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•˜๋ผ

 

 ๋‘ ๊ฐ€์ง€ ์ด์ƒ์˜ ์˜๋ฏธ๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ์ค‘ ํ˜„์žฌ ํ‘œํ˜„ํ•˜๋Š” ์˜๋ฏธ๋ฅผ ํƒœ๊ทธ ๊ฐ’์œผ๋กœ ์•Œ๋ ค์ฃผ๋Š” ํด๋ž˜์Šค.

 

- ์›๊ณผ ์‚ฌ๊ฐํ˜•์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค

 

// ํƒœ๊ทธ ๋‹ฌ๋ฆฐ ํด๋ž˜์Šค - ํด๋ž˜์Šค ๊ณ„์ธต๊ตฌ์กฐ๋ณด๋‹ค ํ›จ์”ฌ ๋‚˜์˜๋‹ค!
public class Figure {

    enum Shape { RECTANGLE, CIRCLE }

    // ํƒœ๊ทธ ํ•„๋“œ - ํ˜„์žฌ ๋ชจ์–‘์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
    final Shape shape;

    // ๋‹ค์Œ ํ•„๋“œ๋“ค์€ ๋ชจ์–‘์ด ์‚ฌ๊ฐํ˜•(RECTANGLE)์ผ ๋•Œ๋งŒ ์“ฐ์ธ๋‹ค.
    double length;
    double width;

    // ๋‹ค์Œ ํ•„๋“œ๋Š” ๋ชจ์–‘์ด ์›(CIRCLE)์ผ ๋•Œ๋งŒ ์“ฐ์ธ๋‹ค.
    double radius;

    // ์›์šฉ ์ƒ์„ฑ์ž
    Figure(double radius) {
        shape = Shape.CIRCLE;
        this.radius = radius;
    }

    // ์‚ฌ๊ฐํ˜•์šฉ ์ƒ์„ฑ์ž
    Figure(double length, double width) {
        shape = Shape.RECTANGLE;
        this.length = length;
        this.width  = width;
    }

    double area() {
        switch(shape) {
            case RECTANGLE:
                return length * width;
            case CIRCLE:
                return Math.PI * (radius * radius);
            default:
                throw new AssertionError(shape);
        }
    }
}

 

๋‹จ์  

 - ์—ด๊ฑฐ ํƒ€์ž… ์„ ์–ธ, ํƒœ๊ทธ ํ•„๋“œ, switch ๋ฌธ ๋“ฑ ์“ธ๋ฐ์—†๋Š” ์ฝ”๋“œ๊ฐ€ ๋งŽ๋‹ค.

 - ์—ฌ๋Ÿฌ ๊ตฌํ˜„์ด ํ•œ ํด๋ž˜์Šค์— ํ˜ผํ•ฉ๋ผ ์žˆ์–ด์„œ ๊ฐ€๋…์„ฑ์ด ๋‚˜์˜๋‹ค.

 - ๋‹ค๋ฅธ ์˜๋ฏธ๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ๋„ ์–ธ์ œ๋‚˜ ํ•จ๊ป˜ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๋„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

 - ํ•„๋“œ๋“ค์„ final ์„ ์–ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•ด๋‹น ์˜๋ฏธ์— ์“ฐ์ด์ง€ ์•Š๋Š” ํ•„๋“œ๋“ค๊นŒ์ง€ ์ƒ์„ฑ์ž์—์„œ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•œ๋‹ค. - ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ ์ƒ์„ฑ

 - ๋˜ ๋‹ค๋ฅธ ์˜๋ฏธ ์ถ”๊ฐ€๋ฅผ ์œ„ํ•ด ์ฝ”๋“œ๊ฐ€ ์ˆ˜์ •๋˜์–ด์•ผ ํ•œ๋‹ค.

 

์ฆ‰, ํƒœ๊ทธ ๋‹ฌ๋ฆฐ ํด๋ž˜์Šค๋Š” ์žฅํ™ฉํ•˜๊ณ , ์˜ค๋ฅ˜๋ฅผ ๋‚ด๊ธฐ ์‰ฝ๊ณ , ๋น„ํšจ์œจ ์ ์ด๋‹ค. ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์–ด์„คํ”„๊ฒŒ ํ‰๋‚ด ๋ƒˆ์„ ๋ฟ์ด๋‹ค.

 

ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ๋ณ€ํ™˜ ๊ณผ์ •

1. ๊ณ„์ธต ๊ตฌ์กฐ์˜ ๋ฃจํŠธ(root)๊ฐ€ ๋  ์ถ”์ƒ ํด๋ž˜์Šค ์ •์˜

2. ํƒœ๊ทธ ๊ฐ’์— ๋”ฐ๋ผ ๋™์ž‘์ด ๋‹ฌ๋ผ์ง€๋Š” ๋ฉ”์„œ๋“œ๋“ค์„ ๋ฃจํŠธ ํด๋ž˜์Šค์˜ ์ถ”์ƒ๋ฉ”์„œ๋“œ๋กœ ์„ ์–ธ - area() ๋ฉ”์„œ๋“œ

3. ํƒœ๊ทธ ๊ฐ’๊ณผ ์ƒ๊ด€์—†์ด ๋™์ž‘์ด ์ผ์ •ํ•œ ๋ฉ”์„œ๋“œ๋“ค์„ ๋ฃจํŠธ ํด๋ž˜์Šค์˜ ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ๋กœ ์ถ”๊ฐ€

4. ๋ชจ๋“  ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ ํ•„๋“œ๋“ค๋„ ๋ฃจํŠธ ํด๋ž˜์Šค๋กœ ์˜ฌ๋ฆฐ๋‹ค.

5. ๋ฃจํŠธ ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•œ ๊ตฌ์ฒด ํด๋ž˜์Šค๋ฅผ ์˜๋ฏธ๋ณ„๋กœ ํ•˜๋‚˜์”ฉ ์ •์˜ - Figure ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•œ Circle ํด๋ž˜์Šค, Rectangle ํด๋ž˜์Šค

6. ๋ฃจํŠธ ํด๋ž˜์Šค๊ฐ€ ์ •์˜ํ•œ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋“ค์„ ๊ฐ์ž์˜ ์˜๋ฏธ์— ๋งž๊ฒŒ ๊ตฌํ˜„

 

 - ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ๋ณ€ํ™˜๋œ ์ฝ”๋“œ

abstract class Figure {
    abstract double area();
}

class Circle extends Figure {

    final double radius;

    Circle(double radius) {
        this.radius = radius;
    }

    @Override
    double area() {
        return Math.PI * (radius * radius);
    }
}

class Rectangle extends Figure {

    final double length;
    final double width;

    Rectangle(double length, double width) {
        this.length = length;
        this.width = width;
    }

    @Override
    double area() {
        return length * width;
    }
}

 

 ์œ ์—ฐ์„ฑ, ํ™•์žฅ์„ฑ ์ฆ๊ฐ€

 

 - ์ •์‚ฌ๊ฐํ˜• ์ถ”๊ฐ€๋  ๊ฒฝ์šฐ

public class Square extends Rectangle{
    public Square(double side) {
        super(side, side);
    }

    @Override
    public double area() {
        return super.area();
    }
}

 

ํ•ต์‹ฌ ์ •๋ฆฌ

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

 

.์•„์ดํ…œ 24 - ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋Š” ๋˜๋„๋ก static์œผ๋กœ ๋งŒ๋“ค๋ผ

 

 ์ค‘์ฒฉ ํด๋ž˜์Šค(nested class)๋ž€ ๋‹ค๋ฅธ ํด๋ž˜์Šค ์•ˆ์— ์ •์˜๋œ ํด๋ž˜์Šค๋ฅผ ๋งํ•œ๋‹ค. ์ค‘์ฒฉ ํด๋ž˜์Šจ๋Š ์ž์‹ ์„ ๊ฐ์‹ผ ๋ฐ”๊นฅ ํด๋ž˜์Šค์—์„œ๋งŒ ์“ฐ์—ฌ์•ผ ํ•˜๋ฉฐ, ๊ทธ ์™ธ์˜ ์“ฐ์ž„์ƒˆ๊ฐ€ ์žˆ๋‹ค๋ฉด ํ†ฑ๋ ˆ๋ฒจ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. ์ค‘์ฒฉ ํด๋ž˜์Šค์˜ ์ข…๋ฅ˜๋Š” ์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค, (๋น„ ์ •์ ) ๋ฉค๋ฒ„ ํด๋ž˜์Šค, ์ต๋ช… ํด๋ž˜์Šค, ์ง€์—ญ ํด๋ž˜์Šค, ์ด๋ ‡๊ฒŒ ๋„ค ๊ฐ€์ง€์ด๋‹ค. ์ด ์ค‘ ์ฒซ ๋ฒˆ์งธ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€๋Š” ๋‚ด๋ถ€ ํด๋ž˜์Šค(inner class)์— ํ•ด๋‹นํ•œ๋‹ค. 

 

 1. ์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค

 

 - ๋‹ค๋ฅธ ํด๋ž˜์Šค ์•ˆ์— ์„ ์–ธ๋˜๊ณ , ๋ฐ”๊นฅ ํด๋ž˜์Šค์˜ private ๋ฉค๋ฒ„์—๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ๋งŒ ์ œ์™ธํ•˜๊ณ  ์ผ๋ฐ˜ ํด๋ž˜์Šค์™€ ๋˜‘๊ฐ™๋‹ค. private๋กœ ์„ ์–ธํ•˜๋ฉด ๋ฐ”๊นฅ ํด๋ž˜์Šค์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ

 

public class OuterClass {
    private static int outerData = 0;

    public static class StaticNestedClass {

        public void display() {
            System.out.println("Outer data: " + outerData);
        }

        public static void staticMethod() {
            System.out.println("Static method in StaticNestedClass");
        }
    }
}

 

2. ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค

 

  - ์ •์  ํด๋ž˜์Šค์™€ ๊ตฌ๋ฌธ์ƒ static ์ฐจ์ด์ด์ง€๋งŒ ์˜๋ฏธ์ƒ ์ฐจ์ด๋Š” ํฌ๋Œ€. ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋Š” ๋ฐ”๊นฅ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์™€ ์•”์ฃฝ์ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ๋‹ค. ๊ทธ๋ž˜์Šค ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๋ฉ”์Šค๋“œ์—์„œ ์ •๊ทœํ™”๋œ this๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค ์ฐธ์กฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

public class OuterClass {
    private static int outerData = 0;

    public void outerMethod() {
        System.out.println("Outer method called");
    }

    public class InnerClass {

        public void innerMethod() {
            System.out.println("Inner method called");

            // ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
            outerMethod();

            // ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค์˜ ์ฐธ์กฐ ๊ฐ€์ ธ์˜ค๊ธฐ
            OuterClass.this.outerData = 20;
            System.out.println("Updated outer data: " + OuterClass.this.outerData);
        }
    }
}

    public static void main(String[] args) {
        OuterClass outerObj = new OuterClass();
        OuterClass.InnerClass innerObj = outerObj.new InnerClass();

        innerObj.innerMethod();
    }

  ๊ฐœ๋…์ƒ ์ค‘์ฒฉ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค์™€ ๋…๋ฆฝ์ ์œผ๋กœ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋Š” ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค ์—†์ด๋Š” ์ƒ์„ฑํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 ์ฆ‰, ๋ฉค๋ฒ„ ํด๋ž˜์Šค์—์„œ ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•  ์ผ์ด ์—†๋‹ค๋ฉด ๋ฌด์กฐ๊ฑด static์„ ๋ถ™์—ฌ์„œ ์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์ž.

 

 3. ์ต๋ช… ํด๋ž˜์Šค

 

  - ์‘์šฉ์ œ ์ œ์•ฝ์ด ๋งŽ๊ณ  ์ฝ”๋“œ๊ฐ€ ๊ธธ๊ฒŒ ๋˜๋ฉด ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง„๋‹ค. ๋žŒ๋‹ค์ด์ „์—๋Š” ์ฆ‰์„์—์„œ ์ž‘์€ ํ•จ์ˆ˜ ๊ฐ์ฒด๋‚˜ ์ฒ˜๋ฆฌ ๊ฐ์ฒด(process object)๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ. ๋žŒ๋‹ค๊ฐ€ ๋“ฑ์žฅํ•˜๋ฉฐ ๋žŒ๋‹ค์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค(์•„์ดํ…œ 42). ๋˜ ๋‹ค๋ฅธ ์ฃผ ์“ฐ์ž„์œผ๋กœ ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ๊ตฌํ˜„ํ•  ๋•Œ๋‹ค.

 

public interface Anonymous {
    void anonymousMethod();
}

    public static void main(String[] args) {

        Anonymous anonymous = new Anonymous() {
            @Override
            public void anonymousMethod() {
                System.out.println("Anonymous Method");
            }
        };
    }

 

4. ์ง€์—ญ ํด๋ž˜์Šค

 

 - ๊ฐ€์žฅ ๋“œ๋ฌผ๊ฒŒ ์‚ฌ์šฉ๋˜๋ฉฐ ์ง€์—ญ๋ณ€์ˆ˜์™€ ๋น„์Šทํ•˜๊ฒŒ ์‚ฌ์šฉ. ๊ฐ๋… ์„ฑ์„ ์œ„ํ•ด ์งง๊ฒŒ ์ž‘์„ฑ

 

    public static void main(String[] args) {
        
        class LocalClass {
            public void localMethod() {
                System.out.println("Local Method");
            }
        }
    }

 

ํ•ต์‹ฌ ์ •๋ฆฌ

 ์ค‘์ฒฉ ํด๋ž˜์Šค์—๋Š” ๋„ค ๊ฐ€์ง€๊ฐ€ ์žˆ์œผ๋ฉฐ, ์“ฐ์ž„์ด ๊ฐ๊ฐ ๋‹ค๋ฅด๋‹ค.
๋ฉ”์„œ๋“œ ๋ฐ–์—์„œ๋„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ ๋ฉ”์„œ๋“œ ์•ˆ์— ์ •์˜ํ•˜๊ธฐ์—” ๋„ˆ๋ฌด ๊ธธ๋‹ค๋ฉด ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ ๋‹ค.
๋ฉค๋ฒ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๊ฐ๊ฐ์ด ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•œ๋‹ค๋ฉด ๋น„์ •์ ์œผ๋กœ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ •์ ์œผ๋กœ ๋งŒ๋“ค์ž.

์ค‘์ฒฉ ํด๋ž˜์Šค๊ฐ€ ํ•œ ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ๋งŒ ์“ฐ์ด๋ฉด์„œ ๊ทธ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ง€์ ์ด ๋‹จ ํ•œ ๊ณณ์ด๊ณ  ํ•ด๋‹น ํƒ€์ž…์œผ๋กœ ์“ฐ๊ธฐ์— ์ ํ•ฉํ•œ ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ด๋ฏธ ์žˆ๋‹ค๋ฉด ์ต๋ช…ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ง€์—ญ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค๋‹ค.

 

.์•„์ดํ…œ 25 - ํ†ฑ๋ ˆ๋ฒจ ํด๋ž˜์Šค๋Š” ํ•œ ํŒŒ์ผ์— ํ•˜๋‚˜๋งŒ ๋‹ด์œผ๋ผ.

 

 ์†Œ์Šค ํŒŒ์ผ ํ•˜๋‚˜์— ํ†ฑ๋ ˆ๋ฒจ ํด๋ž˜์Šค๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์„ ์–ธํ•˜๋ฉด ์–ด๋Š ์†Œ์Šค ํŒŒ์ผ์„ ๋จผ์ € ์ปดํŒŒ์ผ ํ•˜๋‚˜์•ผ ๋”ฐ๋ผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ๋‹ฌ๋ผ์ง„๋‹ค.

 

    public static void main(String[] args) {
        System.out.println(Utensil.NAME + " " + Dessert.NAME);
    }
    
// ๋‘ ํด๋ž˜์Šค๊ฐ€ ํ•œํŒŒ์ผ1 - Dessert.java
class Utensil {
    static final String NAME = "pan";
}

class Dessert {
    static final String NAME = "cake";
}

// ๋‘ ํด๋ž˜์Šค๊ฐ€ ํ•œํŒŒ์ผ2 - Utensil.java
class Utensil {
    static final String NAME = "pan";
}

class Dessert {
    static final String NAME = "cake";
}

 

- ์œ„์˜ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์ค‘๋ณต์ •์˜๋กœ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜ ๋ฐœ์ƒ!

 

 ํ•ด๊ฒฐ ์ฑ…์€ ๋‹จ์ˆœํžˆ ํ†ฑ๋ ˆ๋ฒจ ํด๋ž˜์Šค๋“ค์„ ์„œ๋กœ ๋‹ค๋ฅธ ์†Œ์ŠคํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด ๋œ๋‹ค. 

public class Test {
    public static void main(String[] args) {
        System.out.println(Utensil.NAME + " " + Dessert.NAME);
    }

    private static class Utensil {
        static final String NAME = "pan";
    }

    private static class Dessert {
        static final String NAME = "cake";
    }
}

 

ํ•ต์‹ฌ ์ •๋ฆฌ

 ์†Œ์Šค ํŒŒ์ผ ํ•˜๋‚˜์—๋Š” ๋ฐ˜๋“œ์‹œ ํ†ฑ๋ ˆ๋ฒจ ํด๋ž˜์Šค(ํ˜น์€ ํ†ฑ๋ ˆ๋ฒจ ์ธํ„ฐํŽ˜์ด์Šค)๋ฅผ ํ•˜๋‚˜๋งŒ ๋‹ด์ž.

 

๐Ÿ“ ๋Š๋‚€์ .

 ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์— ๊ด€ํ•˜์—ฌ ์—ฌ๋Ÿฟ ์ง€์‹๋“ค์„ ์Šต๋“ํ•˜์˜€๋‹ค. ์ ์žฌ์ ์†Œ์— ์ธํ„ฐํŽ˜์ด์Šค ์ถ”์ƒํ™”, ํด๋ž˜์Šค๋“ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.