15 ~ 25

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

ยท ์ด๋Ÿฐ ์š”์†Œ๋ฅผ ์ ์ ˆํžˆ ํ™œ์šฉํ•˜์—ฌ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์“ฐ๊ธฐ ํŽธํ•˜๊ณ , ๊ฒฌ๊ณ ํ•˜๋ฉฐ, ์œ ์—ฐํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž.

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


ยท ์ž˜ ์„ค๊ณ„๋œ ์ปดํฌ๋„ŒํŠธ๋Š” ํด๋ž˜์Šค ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ ๊ตฌํ˜„ ์ •๋ณด๋ฅผ ์™ธ๋ถ€ ์ปดํฌ๋„ŒํŠธ๋กœ๋ถ€ํ„ฐ ์ž˜ ์ˆจ๊ธด๋‹ค.

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

- ์ •๋ณด ์€๋‹‰ ๋˜๋Š” ์บก์Šํ™”๋ผ๊ณ  ํ•˜๋Š” ์ด ๊ฐœ๋…์€ ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„์˜ ๊ทผ๊ฐ„์ด ๋˜๋Š” ์›๋ฆฌ๋‹ค.

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

1. ์‹œ์Šคํ…œ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋†’์ธ๋‹ค.

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

2. ์‹œ์Šคํ…œ ๊ด€๋ฆฌ ๋น„์šฉ์„ ๋‚ฎ์ถ˜๋‹ค.

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

3. ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ๋„์›€์„ ์ค€๋‹ค.

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

4. ์†Œํ”„ํŠธ์›จ์–ด ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ธ๋‹ค.

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

5. ํฐ ์‹œ์Šคํ…œ์„ ์ œ์ž‘ํ•˜๋Š” ๋‚œ์ด๋„๋ฅผ ๋‚ฎ์ถ˜๋‹ค.

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

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

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

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

ํ†ฑ๋ ˆ๋ฒจ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ ‘๊ทผ ์ˆ˜์ค€

ยท ํ†ฑ๋ ˆ๋ฒจ(๊ฐ€์žฅ ๋ฐ”๊นฅ) ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์— ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋Š” ์ ‘๊ทผ ์ˆ˜์ค€: package-private๊ณผ public

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

- ์ฆ‰, ํด๋ผ์ด์–ธํŠธ์— ์•„๋ฌด๋Ÿฐ ํ”ผํ•ด ์—†์ด ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์—์„œ ์ˆ˜์ •, ๊ต์ฒด, ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค.

- ๋ฐ˜๋ฉด, public์œผ๋กœ ์„ ์–ธํ•˜๋ฉด ๊ณต๊ฐœ API๊ฐ€ ๋˜๋ฏ€๋กœ ํ•˜์œ„ ํ˜ธํ™˜์„ ์œ„ํ•ด ์˜์›ํžˆ ๊ด€๋ฆฌํ•ด์•ผํ•œ๋‹ค.

-

ยท ํ•œ ํด๋ž˜์Šค์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” package-private ํ†ฑ๋ ˆ๋ฒจ ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค ์•ˆ์— private static์œผ๋กœ ์ค‘์ฒฉ์‹œํ‚ค์ž(์•„์ดํ…œ 24).

- ํ†ฑ ๋ ˆ๋ฒจ๋กœ ๋‘๋ฉด ๊ฐ™์€ ํŒจํ‚ค์ง€์˜ ๋ชจ๋“  ํด๋ž˜์Šค๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, private static์œผ๋กœ ์ค‘์ฒฉ์‹œํ‚ค๋ฉด ๋ฐ”๊นฅ ํด๋ž˜์Šค ํ•˜๋‚˜์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

-

๋ฉค๋ฒ„์˜ ์ ‘๊ทผ ์ˆ˜์ค€

ยท ๋ฉค๋ฒ„(ํ•„๋“œ, ๋ฉ”์„œ๋“œ, ์ •์ฒญ ํด๋ž˜์Šค, ์ค‘์ฒฉ ์ธํ„ฐํŽ˜์ด์Šค)์— ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋Š” ์ ‘๊ทผ ์ˆ˜์ค€:

1. private: ๋ฉค๋ฒ„๋ฅผ ์„ ์–ธํ•œ ํ†ฑ๋ ˆ๋ฒจ ํด๋ž˜์Šค์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

2. package-private: ๋ฉค๋ฒ„๊ฐ€ ์†Œ์†๋œ ํŒจํ‚ค์ง€ ์•ˆ์˜ ๋ชจ๋“  ํด๋ž˜์Šค์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

ํด๋ž˜์Šค ๋ฉค๋ฒ„์˜ ์ ‘๊ทผ ์ œํ•œ์ž๋ฅผ ๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด ์ž๋™์œผ๋กœ ์ ์šฉ๋˜๋Š” ์ ‘๊ทผ ์ˆ˜์ค€์ด๋‹ค. ๋‹จ, ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉค๋ฒ„๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ public์ด๋‹ค.

3. protected: package-private์˜ ์ ‘๊ทผ ๋ฒ”์œ„๋ฅผ ํฌํ•จํ•˜๋ฉฐ, ์ถ”๊ฐ€์ ์œผ๋กœ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

4. public: ๋ชจ๋“  ๊ณณ์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

ยท ํด๋ž˜์Šค์˜ ๊ณต๊ฐœ API๋ฅผ ์„ธ์‹ฌํžˆ ์„ค๊ณ„ํ•œ ํ›„, ๊ทธ ์™ธ์˜ ๋ชจ๋“  ๋ฉค๋ฒ„๋Š” private๋กœ ๋งŒ๋“ค์ž. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์˜ค์ง ๊ฐ™์€ ํŒจํ‚ค์ง€์˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค๊ฐ€ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š” ๋ฉค๋ฒ„์— ํ•œํ•˜์—ฌ package-private๋กœ ํ’€์–ด์ฃผ์ž.

- ๊ถŒํ•œ์„ ํ’€์–ด์ฃผ๋Š” ์ผ์ด ์ž์ฃผ ๋ฐœ์ƒํ•˜๋ฉด, ์‹œ์Šคํ…œ์—์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋” ๋ถ„ํ•ดํ•ด์•ผ ํ•˜๋Š”๊ฒŒ ์•„๋‹Œ์ง€ ๊ณ ๋ฏผํ•˜์ž.

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

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

ยท ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•  ๋•Œ ๊ทธ ์ ‘๊ทผ ์ˆ˜์ค€์„ ์ƒ์œ„ ํด๋ž˜์Šค์—์„œ๋ณด๋‹ค ์ข๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์—†๋‹ค.

- ์ด๋Š” ๋ฉค๋ฒ„ ์ ‘๊ทธ์„ฑ์„ ์ขํžˆ์ง€ ๋ชปํ•˜๊ฒŒ ๋ฐฉํ•ดํ•˜๋Š” ์ œ์•ฝ์ด๋‹ค. ์ด ์ œ์•ฝ์€ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋Š” ํ•˜์œ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋กœ ๋Œ€์ฒดํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ทœ์น™(๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™, ์•„์ดํ…œ10)์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•˜๋‹ค. ์ด ๊ทœ์น™์„ ์–ด๊ธฐ๋ฉด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

ex) ํด๋ž˜์Šค๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ• ๋•Œ, ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ •์˜ํ•œ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ public์œผ๋กœ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค.

ยท ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋ ค๋Š” ๋ชฉ์ ์œผ๋กœ ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค, ๋ฉค๋ฒ„์˜ ์ ‘๊ทผ ๋ฒ”์œ„๋ฅผ ๋„“ํžˆ๋Š” ๊ฒฝ์šฐ ์ ๋‹นํ•œ ์ˆ˜์ค€๊นŒ์ง€๋งŒ ํ—ˆ์šฉ๋œ๋‹ค.

- public ํด๋ž˜์Šค์˜ private ๋ฉค๋ฒ„๋ฅผ package-private๊นŒ์ง€ ํ’€์–ด์ฃผ๋Š” ๊ฒƒ์€ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ ์ด์ƒ์€ ์•ˆ๋œ๋‹ค.

- ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธ ๋Œ€์ƒ๊ณผ ๊ฐ™์€ ํŒจํ‚ค์ง€์— ๋‘๋ฉด package-private ์š”์†Œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ยท public ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ํ•„๋“œ๋Š” ๋˜๋„๋ก public์ด ์•„๋‹ˆ์–ด์•ผ ํ•œ๋‹ค(์•„์ดํ…œ16). ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ถ€์ž‘์šฉ์ด ์žˆ๋‹ค.

1. ํ•„๋“œ๊ฐ€ ๊ฐ€๋ณ€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ final์ด ์•„๋‹Œ ์ธ์Šคํ„ด์Šค ํ•„๋“œ๋ฅผ public์œผ๋กœ ์„ ์–ธํ•˜๋ฉด, ๊ทธ ํ•„๋“œ์— ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ์ œํ•œํ•  ํž˜์„ ์ฝ๋Š”๋‹ค. ์ฆ‰, ํ•„๋“œ์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ๊ฒƒ์€ ๋ถˆ๋ณ€์‹์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.

2. ์ผ๋ฐ˜์ ์œผ๋กœ ์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค. ํ•„๋“œ๊ฐ€ ์ˆ˜์ •๋  ๋•Œ (๋ฝ ํš๋“ ๊ฐ™์€) ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.

3. final์ด๋ฉด์„œ ๋ถˆ๋ถ„ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋”๋ผ๋„ ๋ฌธ์ œ๊ฐ€ ๋‚จ๋Š”๋‹ค. ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ๋ฐ”๊พธ๊ณ  ์‹ถ์–ด๋„ ํ•ด๋‹น ํ•„๋“œ๋ฅผ ์—†์• ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฆฌํŒฉํ„ฐ๋งํ•  ์ˆ˜ ์—†๋‹ค.

ยท ์˜ˆ์™ธ์ ์œผ๋กœ, ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ํ‘œํ˜„ํ•˜๋Š” ์ถ”์ƒ ๊ฐœ๋…์„ ์™„์„ฑํ•˜๋Š” ๋ฐ ๊ผญ ํ•„์š”ํ•œ ๊ตฌ์„ฑ์š”์†Œ๋กœ์จ์˜ ์ƒ์ˆ˜๋ผ๋ฉด, public static final ํ•„๋“œ๋กœ ๊ณต๊ฐœํ•ด๋„ ์ข‹๋‹ค.

- ๊ด€๋ก€์ƒ ์ด๋Ÿฐ ์ƒ์ˆ˜ ์ด๋ฆ„์€ ๋Œ€๋ฌธ์ž ์•ŒํŒŒ๋ฒณ์œผ๋กœ ์“ฐ๋ฉฐ, ๊ฐ ๋‹จ์–ด ์‚ฌ์ด์— ๋ฐ‘์ค„(_)์„ ๋„ฃ๋Š”๋‹ค(์•„์ดํ…œ68).

- ์ด๋Ÿฐ ํ•„๋“œ๋Š” ๋ฐ˜๋“œ์‹œ ๊ธฐ๋ณธ ํƒ€์ž… ๊ฐ’์ด๋‚˜ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•ด์•ผ ํ•œ๋‹ค(์•„์ดํ…œ 17). ๊ฐ€๋ณ€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋ฉด final์ด ์•„๋‹Œ ํ•„๋“œ์— ์ ์šฉ๋˜๋Š” ๋ชจ๋“  ๋ถˆ์ด์ต์ด ๊ทธ๋Œ€๋กœ ์ ์šฉ๋œ๋‹ค. ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜์ง€๋Š” ๋ชปํ•˜์ง€๋งŒ, ์ฐธ์กฐ๋œ ๊ฐ์ฒด ์ž์ฒด๋Š” ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

ยท ๊ธธ์ด๊ฐ€ 0์ด ์•„๋‹Œ ๋ฐฐ์—ด์€ ๋ชจ๋‘ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•˜๋‹ˆ ์ฃผ์˜ํ•˜์ž.

- ๋”ฐ๋ผ์„œ ํด๋ž˜์Šค์—์„œ public static final ๋ฐฐ์—ด ํ•„๋“œ๋ฅผ ๋‘๊ฑฐ๋‚˜ ์ด ํ•„๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ ‘๊ทผ์ž ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

- ์ด๋Ÿฐ ํ•„๋“œ๋‚˜ ์ ‘๊ทผ์ž๋ฅผ ์ œ๊ณตํ•˜๋ฉด, ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ทธ ๋ฐฐ์—ด์˜ ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

ex) public static final Thing[] VALUE = {...}; // ๋ณด์•ˆ ํ—ˆ์ ์ด ์ˆจ์–ด ์žˆ๋‹ค.

ยท ์–ด๋–ค IDE๊ฐ€ ์ƒ์„ฑํ•˜๋Š” ์ ‘๊ทผ์ž๋Š” private ๋ฐฐ์—ด ํ•„๋“œ์˜ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์ด ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๋˜‘๊ฐ™์ด ์ผ์œผํ‚ค๋‹ˆ ์ฃผ์˜ํ•˜์ž.

- ํ•ด๊ฒฐ์ฑ… 1: ์•ž ์ฝ”๋“œ์˜ public ๋ฐฐ์—ด์„ private์œผ๋กœ ๋งŒ๋“ค๊ณ  public ๋ถˆ๋ณ€ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

private static final Thing[] PRIVATE_VALUES = { ... };
public static final List<Thing> VALUES = Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));
    

- ํ•ด๊ฒฐ์ฑ… 2: ๋ฐฐ์—ด์„ private์œผ๋กœ ๋งŒ๋“ค๊ณ  ๋ฐฉ์–ด์  ๋ณต์‚ฌ๋ณธ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” public ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

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

- ์–ด๋Š ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ๋” ์“ฐ๊ธฐ ํŽธํ• ์ง€, ์„ฑ๋Šฅ์€ ์–ด๋Š ์ชฝ์ด ๋‚˜์„์ง€ ๊ณ ๋ฏผํ•ด ์ •ํ•˜์ž.

๋ชจ๋“ˆ ์‹œ์Šคํ…œ

ยท ์ž๋ฐ” 9์—์„œ๋Š” ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ด๋ผ๋Š” ๊ฐœ๋…์ด ๋˜์ž…๋˜๋ฉด์„œ ๋‘ ๊ฐ€์ง€ ์•”๋ฌต์  ์ ‘๊ทผ ์ˆ˜์ค€์ด ์ถ”๊ฐ€๋˜์—‡๋‹ค.

- ํŒจํ‚ค์ง€๊ฐ€ ํด๋ž˜์Šค๋“ค์˜ ๋ฌถ์Œ์ด๋“ฏ, ๋ชจ๋“ˆ์€ ํŒจํ‚ค์ง€๋“ค์˜ ๋ฌถ์Œ์ด๋‹ค.

- ๋ชจ๋“ˆ์€ ์ž์‹ ์— ์†ํ•˜๋Š” ํŒจํ‚ค์ง€ ์ค‘ ๊ณต๊ฐœ(export)ํ•  ๊ฒƒ๋“ค์„ (๊ด€๋ก€์ƒ module-info.java ํŒŒ์ผ์—) ์„ ์–ธํ•œ๋‹ค.protected ํ˜น์€ public ๋ฉค๋ฒ„๋ผ๋„ ํ•ด๋‹น ํŒจํ‚ค์ง€๋ฅผ ๊ณต๊ฐœํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ๋ชจ๋“ˆ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.

- ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ํ™œ์šฉํ•˜๋ฉด ํด๋ž˜์Šค๋ฅผ ์™ธ๋ถ€์— ๊ณต๊ฐœํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ๊ฐ™์€ ๋ชจ๋“ˆ์„ ์ด๋ผ๋Š” ํŒจํ‚ค์ง€ ์‚ฌ์ด์—์„œ๋Š” ์ž์œ ๋กญ๊ฒŒ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

- ๋‘ ๊ฐ€์ง€ ์•”๋ฌต์  ์ ‘๊ทผ ์ˆ˜์ค€์€ ์ˆจ๊ฒจ์ง„ ํŒจํ‚ค์ง€ ์•ˆ์— ์žˆ๋Š” public ํด๋ž˜์Šค์˜ public ํ˜น์€ protected ๋ฉค๋ฒ„์™€ ๊ด€๋ จ์ด ์žˆ๋‹ค.

- ์ด ์•”๋ฌต์  ์ ‘๊ทผ ์ˆ˜์ค€๋“ค์€ ๊ฐ๊ฐ public ์ˆ˜์ค€๊ณผ protected ์ˆ˜์ค€๊ณผ ๊ฐ™์œผ๋‚˜, ๊ทธ ํšจ๊ณผ๊ฐ€ ๋ชจ๋“ˆ ๋‚ด๋ถ€๋กœ ํ•œ์ •๋˜๋Š” ๋ณ€์ข…์ด๋‹ค.

- ์ด๋Ÿฐ ํ˜•ํƒœ๋กœ ๊ณต์œ ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์€ ํ”ํ•˜์ง€ ์ฐฎ๋‹ค. ๊ทธ๋ž˜์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฒŒ์–ด์ ธ๋„ ํŒจ์บ์ง€๋“ค ์‚ฌ์ด์—์„œ ํด๋ž˜์Šค๋“ค์„ ์žฌ๋ฐฐ์น˜ํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„ ํ•ด๊ฒฐ๋œ๋‹ค.

TODO: ์ดํ•ด ๋ถ€์กฑ

ยท 4๊ฐœ์˜ ๊ธฐ์กด ์ ‘๊ทผ ์ˆ˜์ค€๊ณผ ๋‹ฌ๋ฆฌ, ๋ชจ๋“ˆ์— ์ ์šฉ๋˜๋Š” ์ƒˆ๋กœ์šด ๋‘ ์ ‘๊ทผ ์ˆ˜์ค€์€ ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

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

ยท JDK๋Š” ์ƒˆ๋กœ ๋“ฑ์žฅํ•œ ์ด ์ ‘๊ทผ ์ˆ˜์ค€์„ ์ ๊ทน ํ™œ์šฉํ•œ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋‹ค.

- ์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๊ณต๊ฐœํ•˜์ง€ ์•Š์€ ํŒจํ‚ค์ง€๋“ค์€ ํ•ด๋‹น ๋ชจ๋“ˆ ๋ฐ–์—์„œ ์ ˆ๋Œ€๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.

ยท ์ ‘๊ทผ ๋ณดํ˜ธ ๋ฐฉ์‹์ด ์ถ”๊ฐ€๋œ ๊ฒƒ ๋ง๊ณ ๋„, ๋ชจ๋“ˆ์€ ์—ฌ๋Ÿฌ ๋ฉด์—์„œ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์˜ํ–ฅ์„ ์ค€๋‹ค.

- ๋ชจ๋“ˆ์˜ ์žฅ์ ์„ ์ œ๋Œ€๋กœ ๋ˆ„๋ฆฌ๋ ค๋ฉด ํ•ด์•ผ ํ•  ์ผ์ด ๋งŽ๋‹ค. 1. ํŒจํ‚ค์ง€๋ฅผ ๋ชจ๋“ˆ ๋‹จ์œ„๋กœ ๋ฌถ๊ณ , ๋ชจ๋“ˆ ์„ ์–ธ์— ํŒจํ‚ค์ง€๋“ค์˜ ๋ชจ๋“  ์˜์กด์„ฑ์„ ๋ฉฐ์‹œํ•œ๋‹ค. 2. ๊ทธ ํ›„ ์†Œ์Šค ํŠธ๋ฆฌ๋ฅผ ์žฌ๋ฐฐ์น˜ํ•˜๊ณ , ๋ชจ๋“ˆ ์•ˆ์—์„œ๋ถ€ํ„ฐ (๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ์ ์šฉํ•˜์ง€ ์•Š์€) ์ผ๋ฐ˜ ํŒจํ‚ค์ง€๋กœ์˜ ๋ชจ๋“  ์ ‘๊ทผ์— ํŠน๋ณ„ํ•œ ์กฐ์น˜๋ฅผ ์ทจํ•ด์•ผ ํ•œ๋‹ค.

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


ยท ํด๋ž˜์Šค์˜ ๋ฐ์ดํ„ฐ ํ•„๋“œ์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์บก์Šํ™”์˜ ์ด์ ์„ ์ œ๊ณตํ•˜์ง€ ๋ชปํ•œ๋‹ค(์•„์ดํ…œ 15).

- API๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋Š” ๋‚ด๋ถ€ ํ‘œํ˜„์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๊ณ , ๋ถˆ๋ณ€์‹์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ์™ธ๋ถ€์—์„œ ํ•„๋“œ์— ์ ‘๊ทผํ•  ๋•Œ ๋ถ€์ˆ˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์—†๋‹ค.

// ์บก์Šํ™”์— ์ด์ ์„ ์ œ๊ณตํ•˜์ง€ ๋ชปํ•˜๋Š” ํด๋ž˜์Šค
class Point{
    public double x;
    public double y;
}

ยท ํด๋ž˜์Šค์˜ ํ•„๋“œ๋Š” ๋ชจ๋‘ private์œผ๋กœ ๋ฐ”๊พธ๊ณ  public ์ ‘๊ทผ์ž(getter)๋ฅผ ์ถ”๊ฐ€ํ•˜์ž.

- ํŒจํ‚ค์ง€ ๋ฐ”๊นฅ์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค๋ผ๋ฉด ์ ‘๊ทผ์ž๋ฅผ ์ œ๊ณตํ•จ์œผ๋กœ์จ ํด๋ž˜์Šค ๋‚ด๋ถ€ ํ‘œํ˜„ ๋ฐฉ์‹์„ ์–ธ์ œ๋“  ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค.

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

class Point{
    private double x;
    private double y;
    
    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 ์ค‘์ฒฉ ํด๋ž˜์Šค๋ผ๋ฉด ๋ฐ์ดํ„ฐ ํ•„๋“œ๋ฅผ ๋…ธ์ถœํ•œ๋‹ค ํ•ด๋„ ํ•˜๋“ฑ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.

- ์ด ๋ฐฉ์‹์€ ํด๋ž˜์Šค ์„ ์–ธ ๋ฉด์—์„œ๋‚˜ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ ๋ฉด์—์„œ๋‚˜ ์ ‘๊ทผ์ž ๋ฐฉ์‹๋ณด๋‹ค ํ›จ์”ฌ ๊น”๋”ํ•˜๋‹ค.

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

- private ์ค‘์ฒฉ ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ ์ˆ˜์ • ๋ฒ”์œ„๊ฐ€ ๋” ์ข์•„์ ธ์„œ ์ด ํด๋ž˜์Šค๋ฅผ ํฌํ•จํ•˜๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค๊นŒ์ง€๋กœ ์ œํ•œ๋œ๋‹ค.

ยท ์ž๋ฐ” ํ”Œ๋žซํผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋„ public ํด๋ž˜์Šค์˜ ํ•„๋“œ๋ฅผ ์ง์ ‘ ๋…ธ์ถœํ•œ ์‚ฌ๋ก€๊ฐ€ ์žˆ๋‹ค. java.aws.package ํŒจํ‚ค์ง€์˜ Point์™€ Dimenssion ํด๋ž˜์Šค๋กœ, ๊ทธ ์ค‘ Dimenssion ํด๋ž˜์Šค๋Š” ํ•ด๋‹น ๋ฌธ์ œ๋กœ ์‹ฌ๊ฐํ•œ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค(์•„์ดํ…œ 67).

ยท public ํด๋ž˜์Šค์˜ ํ•„๋“œ๊ฐ€ ๋ถˆ๋ณ€์ด๋ผ๋ฉด ์ง์ ‘ ๋…ธ์ถœํ•  ๋•Œ์˜ ๋‹จ์ ์ด ์กฐ๊ธˆ์€ ์ค„์–ด๋“ค์ง€๋งŒ, ์—ฌ์ „ํžˆ ์ข‹์€ ์ƒ๊ฐ์€ ์•„๋‹ˆ๋‹ค.

- API๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋Š” ํ‘œํ˜„ ๋ฐฉ์‹์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค.

- ํ•„๋“œ๋ฅผ ์ฝ์„ ๋•Œ ๋ถ€์ˆ˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋‹ค.

- ๋‹จ, ๋ถˆ๋ณ€์‹์€ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ ํด๋ž˜์Šค๋Š” ๊ฐ ์ธ์Šคํ„ด์Šค๊ฐ€ ์œ ํšจํ•œ ์‹œ๊ฐ„์„ ํ‘œํ˜„ํ•จ์„ ๋ณด์žฅํ•œ๋‹ค.

public final 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) {
        validateTime(hour, minute);
        this.hour = hour;
        this.minute = minute;
    }
    
    private void validateTime(int hour, int minute) {
        // .. ์œ ํšจ์„ฑ ๊ฒ€์ฆ ๋กœ์ง, ๋ถˆ๋ณ€์‹ ๋ณด์žฅ
    }
    
    // ...
}

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


ยท ๋ถˆ๋ณ€ ํด๋ž˜์Šค๋ž€ ๊ทธ ์ธ์Šคํ„ด์Šค์˜ ๋‚ด๋ถ€ ๊ฐ’์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋Š” ํด๋ž˜์Šค๋‹ค.

- ๋ถˆ๋ณ€ ์ธ์Šคํ„ด์Šค์— ๊ฐ„์ง๋œ ์ •๋ณด๋Š” ๊ณ ์ •๋˜์–ด ๊ฐ์ฒด๊ฐ€ ํŒŒ๊ดด๋˜๋Š” ์ˆœ๊ฐ„๊นŒ์ง€ ๋‹ฌ๋ผ์ง€์ง€ ์•Š๋Š”๋‹ค.

- ๋ถˆ๋ณ€ ํด๋ž˜์Šค๋Š” ์„ค๊ณ„ํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ณ , ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ธธ ์—ฌ์ง€๋„ ์ ๊ณ  ์•ˆ์ „ํ•˜๋‹ค.

ยท ์ž๋ฐ” ํ”Œ๋žซํผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋‹ค์–‘ํ•œ ๋ถˆ๋ณ€ ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ex) String, ๊ธฐ๋ณธ ํƒ€์ž… ๋ฐ•์‹ฑ ํด๋ž˜์Šค, BigInteger, BigDecimal

ํด๋ž˜์Šค๋ฅผ ๋ถˆ๋ณ€์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ทœ์น™ 5๊ฐ€์ง€

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

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

- ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ๋ถ€์ฃผ์˜ํ•˜๊ฒŒ ํ˜น์œผ ๋‚˜์œ ์˜๋„๋กœ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋ณ€ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์‚ฌํƒœ๋ฅผ ๋ง‰์•„์ค€๋‹ค.

- ์ƒ์†์„ ๋ง‰๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์€ ํด๋ž˜์Šค๋ฅผ final๋กœ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด๋‹ค. (๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ๋’ค์— ์„ค๋ช…)

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

- ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋™๊ธฐํ™” ์—†์ด ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋กœ ๊ฑด๋„ค๋„ ๋ฌธ์ œ์—†์ด ๋™์ž‘ํ•˜๊ฒŒ ๋ณด์žฅํ•ด์ค€๋‹ค.

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

- ํ•„๋“œ๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๊ฐ€๋ณ€ ๊ฐ์ฒด๋ฅผ ํด๋ผ์ด์–ธํŠธ์—์„œ ์ง์ ‘ ์ ‘๊ทผํ•ด ์ˆ˜์ •ํ•˜๋Š” ์ผ์„ ๋ง‰์•„์ค€๋‹ค.

- public final๋กœ๋งŒ ์„ ์–ธํ•ด๋„ ๋ถˆ๋ณ€ ๊ฐ์ฒด๊ฐ€ ๋˜์ง€๋งŒ, ์ด๋Ÿฌ๊ฒŒ ํ•˜๋ฉด ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์—์„œ ๋‚ด๋ถ€ ํ‘œํ˜„์„ ๋ฐ”๊พธ์ง€ ๋ชปํ•˜๋ฏ€๋กœ ๊ถŒ์žฅ x

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 complex) {
        return new Complex(re + complex.re, im + complex.im);
    }
    
    // ...
    
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Complex complex = (Complex) o;
        return Double.compare(complex.re, re) == 0 && Double.compare(complex.im, im) == 0;
    }
    
    @Override
    public int hashCode() {
        return Objects.hash(re, im);
    }
}

ยท ์œ„ ์ฝ”๋“œ์—์„œ ์‚ฌ์น™ ์—ฐ์‚ฐ ๋ฉ”์„œ๋“œ๋“ค์€ ์ธ์Šคํ„ด์Šค ์ž์‹ ์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ , ์ƒˆ๋กœ์šด Complex ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด์ฒ˜๋Ÿผ ํ”ผ์—ฐ์‚ฐ์ž์— ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•ด ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ, ํ”ผ์—ฐ์‚ฐ์ž ์ž์ฒด๋Š” ๊ทธ๋Œ€๋กœ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจํ„ด์„ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ผ ํ•œ๋‹ค.

- ํ•ด๋‹น ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋ฉด, ์ฝ”๋“œ์—์„œ ๋ถˆ๋ณ€์ด ๋˜๋Š” ์˜์—ญ์˜ ๋น„์œจ์ด ๋†’์•„์ง€๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

- ์ด์™€ ๋‹ฌ๋ฆฌ, ์ ˆ์ฐจ์  ํ˜น์€ ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ๋ฉ”์„œ๋“œ์—์„œ ํ”ผ์—ฐ์‚ฐ์ž์ธ ์ž์‹ ์„ ์ˆ˜์ •ํ•ด ์ž์‹ ์˜ ์ƒํƒœ๊ฐ€ ๋ณ€ํ•˜๊ฒŒ ๋œ๋‹ค.

ยท ์œ„ ์ฝ”๋“œ์—์„œ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์€ (add ๊ฐ™์€) ๋™์‚ฌ ๋Œ€์‹  (plus ๊ฐ™์€) ์ „์น˜์‚ฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋Š” ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ๊ฐ์ฒด์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š”์‚ฌ์‹ค์„ ๊ฐ•์กฐํ•˜๋ ค๋Š” ์˜๋„๋‹ค.

- BigInteger, BigDecimal ํด๋ž˜์Šค๋Š” ์ด ๋ช…๋ช… ๊ทœ์น™์„ ๋”ฐ๋ฅด์ง€ ์•Š์•„ ์ž˜๋ชป ์‚ฌ์šฉํ•ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ผ์ด ์ž์ฃผ ์žˆ๋‹ค.

ยท ์œ„ ์ฝ”๋“œ๋Š” ๋ถˆ๋ณ€์„ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•œ ์˜ˆ์ผ ๋ฟ ์‹ค๋ฌด์—์„œ ์“ธ ๋งŒํ•œ ์ˆ˜์ค€์ด ๋ชป๋œ๋‹ค. ๋ณต์ˆ˜์†Œ ๊ณฑ์…ˆ๊ณผ ๋‚˜๋ˆ—์…ˆ์„ ํ‘œ์ค€ ๊ณต์‹๋Œ€๋กœ ๊ตฌํ˜„ํ–ˆ์ง€๋งŒ, ๋ฐ˜์˜ฌ๋ฆผ์„ ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ  ๋ณต์†Œ์ˆ˜ NaN๊ณผ ๋ฌดํ•œ๋Œ€๋„ ๋‹ค๋ฃจ์ง€ ๋ชปํ•œ๋‹ค.

๋ถˆ๋ณ€ ๊ฐ์ฒด์˜ ์žฅ์ 

ยท ๋ถˆ๋ณ€ ๊ฐ์ฒด๋Š” ๋‹จ์ˆœํ•˜๋‹ค. ์ƒ์„ฑ๋œ ์‹œ์ ์˜ ์ƒํƒœ๋ฅผ ํŒŒ๊ดด๋  ๋•Œ๊นŒ์ง€ ๊ทธ๋Œ€๋กœ ๊ฐ„์งํ•œ๋‹ค.

- ๋ชจ๋“  ์ƒ์„ฑ์ž๊ฐ€ ํด๋ž˜์Šค ๋ถˆ๋ณ€์‹(class invariant)์„ ๋ณด์žฅํ•œ๋‹ค๋ฉด, ๊ทธ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋‹ค๋ฅธ ๋…ธ๋ ฅ์„ ๋“ค์ด์ง€ ์•Š๋”๋ผ๋„ ์˜์›ํžˆ ๋ถˆ๋ณ€์œผ๋กœ ๋‚จ๋Š”๋‹ค.

- ๋ฐ˜๋ฉด ๊ฐ€๋ณ€ ๊ฐ์ฒด๋Š” ์ž„์˜์˜ ๋ณต์žกํ•œ ์ƒํƒœ์— ๋†“์ผ ์ˆ˜ ์žˆ๋‹ค. ๋ณ€๊ฒฝ์ž ๋ฉ”์„œ๋“œ๊ฐ€ ์ผ์œผํ‚ค๋Š” ์ƒํƒœ ์ „์ด๋ฅผ ์ •๋ฐ€ํ•˜๊ฒŒ ๋ฌธ์„œ๋กœ ๋‚จ๊ฒจ๋†“์ง€ ์•Š๋ฅด๋ฉด ๋ฏฟ๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜๋„ ์žˆ๋‹ค.

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

- ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์‚ฌ์šฉํ•ด๋„ ์ ˆ๋Œ€ ํ›ผ์†๋˜์ง€ ์•Š๋Š”๋‹ค.

- ๋ถˆ๋ณ€ ๊ฐ์ฒด์— ๋Œ€ํ•ด์„œ๋Š” ๊ทธ ์–ด๋–ค ์Šค๋ ˆ๋“œ๋„ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์—†์œผ๋‹ˆ ์•ˆ์‹ฌํ•˜๊ณ  ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

- ๋”ฐ๋ผ์„œ ๋ถˆ๋ณ€ ํด๋ž˜์Šค๋ผ๋ฉด ํ•œ ๋ฒˆ ๋งŒ๋“  ์ธ์Šคํ„ด์Šค๋ฅผ ์ตœ๋Œ€ํ•œ ์žฌํ™œ์šฉํ•˜๊ธฐ๋ฅผ ๊ถŒํ•œ๋‹ค.

- ์žฌํ™œ์šฉ ๋ฐฉ๋ฒ•: ์ž์ฃผ ์“ฐ์ด๋Š” ๊ฐ’๋“ค์„ ์ƒ์ˆ˜(public static final)๋กœ ์ œ๊ณตํ•œ๋‹ค.

public static final Complex ZERO = new Complex(0, 0);
public static final Complex ONE = new Complex(1, 0);
public static final Complex I = new Complex(0, 1);

ยท ๋ถˆ๋ณ€ ํด๋ž˜์Šค๋Š” ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์บ์‹ฑํ•˜์—ฌ ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๋ฅผ ์ค‘๋ณต ์ƒ์„ฑํ•˜์ง€ ์•Š๊ฒŒ ํ•ด์ฃผ๋Š” ์ •์  ํŒฉํ„ฐ๋ฆฌ(์•„์ดํ…œ1)๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

ex) ๋ฐ•์‹ฑ๋œ ๊ธฐ๋ณธ ํƒ€์ž… ํด๋ž˜์Šค, BigInteger

- ์ด๋Ÿฐ ์ •์  ํŒฉํ„ฐ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณต์œ ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๊ณผ GC ๋น„์šฉ์ด ์ค„์–ด๋“ ๋‹ค.

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

ยท ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ์ž์œ ๋กญ๊ฒŒ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์€ ๋ฐฉ์–ด์  ๋ณต์‚ฌ(์•„์ดํ…œ 50)๋„ ํ•„์š” ์—†๋‹ค๋Š” ๊ฒฐ๋ก ์œผ๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ด์–ด์ง„๋‹ค.

- ์•„๋ฌด๋ฆฌ ๋ณต์‚ฌํ•ด๋„ ์›๋ณธ๊ณผ ๋˜‘๊ฐ™์œผ๋‹ˆ ๋ณต์‚ฌ ์ž์ฒด๊ฐ€ ์˜๋ฏธ ์—†๋‹ค.

- ๊ทธ๋Ÿฌ๋‚˜ ๋ถˆ๋ณ€ ํด๋ž˜์Šค๋Š” clone ๋ฉ”์„œ๋“œ๋‚˜ ๋ณต์‚ฌ ์ƒ์„ฑ์ž(์•„์ดํ…œ 13)๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๊ฒŒ ์ข‹๋‹ค.

ex) String ํด๋ž˜์Šค์˜ ๋ณต์‚ฌ ์ƒ์„ฑ์ž๋Š” ์ด ์‚ฌ์‹ค์„ ์ž˜ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ ์ž๋ฐ” ์ดˆ์ฐฝ๊ธฐ์— ๋งŒ๋“ค์–ด ์กŒ๋‹ค. ๋˜๋„๋ก ์‚ฌ์šฉํ•˜์ง€ ๋ง์ž.

ยท ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ผ๋ฆฌ๋Š” ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

(TODO: ๋ฌด์Šจ ๋ง์ธ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค...)

ยท ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ ๋‹ค๋ฅธ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋“ค์„ ๊ตฌ์„ฑ์š”์†Œ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์ด์ ์ด ๋งŽ๋‹ค.

- ๊ฐ’์ด ๋ฐ”๊ท€์ง€ ์•Š๋Š” ๊ตฌ์„ฑ์š”์†Œ๋“ค๋กœ ์ด๋ค„์ง„ ๊ฐ์ฒด๋ผ๋ฉด, ๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ•ด๋„ ๋ถˆ๋ณ€์‹์„ ์œ ์ง€ํ•˜๊ธฐ ์ˆ˜์›”ํ•˜๋‹ค.

ex) ๋ถˆ๋ณ€ ๊ฐ์ฒด๋Š” ๋งต์˜ ํ‚ค์™€ ์ง‘ํ•ฉ(Set)์˜ ์›์†Œ๋กœ ์“ฐ๊ธฐ์— ์•Œ๋งž๋‹ค. ๋งต์ด๋‚˜ ์ง‘ํ•ฉ์€ ์•ˆ์— ๋‹ด๊ธด ๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด ๋ถˆ๋ณ€์‹์ด ํ—ˆ๋ฌผ์–ด์ง€๋Š”๋ฐ, ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๋Ÿฐ ๊ฑฑ์ •์„ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

ยท ๋ถˆ๋ณ€ ๊ฐ์ฒด๋Š” ๊ทธ ์ž์ฒด๋กœ์‹คํŒจ ์›์ž์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค(์•„์ดํ…œ 76).

- ์ƒํƒœ๊ฐ€ ์ ˆ๋Œ€ ๋ณ€ํ•˜์ง€ ์•Š์œผ๋‹ˆ ์ž ๊น์ด๋ผ๋„ ๋ถˆ์ผ์น˜ ์ƒํƒœ์— ๋น ์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ์—†๋‹ค.

๋ถˆ๋ณ€ ๊ฐ์ฒด์˜ ๋‹จ์ 

ยท ๊ฐ’์ด ๋‹ค๋ฅด๋ฉด ๋…๋ฆฝ๋œ ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค.

- ๊ฐ’์˜ ๊ฐ€์ง“์ˆ˜๊ฐ€ ๋งŽ๋‹ค๋ฉด ํฐ ๋น„์šฉ์„ ์น˜๋Ÿฌ์•ผํ•œ๋‹ค.

ex) ๋ฐฑ๋งŒ ๋น„ํŠธ์งœ๋ฆฌ BigInteger์—์„œ ๋น„ํŠธ ํ•˜๋‚˜๋ฅผ ๋ฐ”๊ฟ”์•ผ ํ•œ๋‹ค๊ณ  ํ•ด๋ณด์ž.

BigInteger moby = ...;
moby = moby.flipBIt(0);

flipBit ๋ฉ”์„œ๋“œ๋Š” ์ƒˆ๋กœ์šด BigInteger ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๋˜ํ•œ ์ด ์—ฐ์‚ฐ์€ BigInteger์˜ ํฌ๊ธฐ์— ๋น„๋ก€ํ•ด ์‹œ๊ฐ„๊ณผ ๊ณต๊ฐ„์„ ์žก์•„ ๋จน๋Š”๋‹ค. BitSet๋„ BiggInteger ์ฒ˜๋Ÿผ ์ž„์˜์˜ ๊ธธ์ด์˜ ๋น„ํŠธ ์ˆœ์—ด์„ ํ‘œํ˜„ํ•˜์ง€๋งŒ, BigInteger์™€ ๋‹ฌ๋ฆฌ ๊ฐ€๋ณ€์ด๋‹ค. BitSet ํด๋ž˜์Šค๋Š” ์›ํ•˜๋Š” ๋น„ํŠธ ํ•˜๋‚˜๋งŒ ์ƒ์ˆ˜ ์‹œ๊ฐ„์— ๋ฐ”๊ฟ”์ฃผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

BitSet moby = ...;
moby.flip(0);

- ์›ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์™„์„ฑํ•˜๊ธฐ๊นŒ์ง€ ๋‹จ๊ณ„๊ฐ€ ๋ง๊ณ , ๊ทธ ์ค‘๊ฐ„ ๋‹จ๊ณ„์—์„œ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด๋“ค์ด ๋ชจ๋‘ ๋ฒ„๋ ค์ง„๋‹ค๋ฉด ์„ ์„ ๋ฌธ์ œ๊ฐ€ ๋” ๋ถˆ๊ฑฐ์ง„๋‹ค.

ยท ์„ฑ๋Šฅ๋ฌธ์ œ ๋Œ€์ฒ˜ ๋ฐฉ๋ฒ•:

1. ํ”ํžˆ ์“ฐ์ผ ๋‹ค๋‹จ๊ณ„ ์—ฐ์‚ฐ(multistep operation)๋“ค์„ ์˜ˆ์ธกํ•˜์—ฌ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์œผ๋กœ ์ œ๊ณตํ•œ๋‹ค.

- ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์ค€๋‹ค.

- BiggIntegerใ„ด๋Š” ๋ชจ๋“ˆ๋Ÿฌ ์ง€์ˆ˜ ๊ฐ™์€ ๋‹ค๋‹จ๊ณ„ ์—ฐ์‚ฐ ์†๋„๋ฅผ ๋†’์—ฌ์ฃผ๋Š” ๊ฐ€๋ณ€ ๋™๋ฐ˜ ํด๋ž˜์Šค(companion class)๋ฅผ packge-private์œผ๋กœ ๋‘๊ณ  ์žˆ๋‹ค.

2. ํด๋ผ์ด์–ธํŠธ๋“ค์ด ์›ํ•˜๋Š” ๋ณต์žกํ•œ ์—ฐ์‚ฐ์„ ์ •ํ™•ํžˆ ์˜ˆ์ธกํ•˜ ์ˆ˜ ์žˆ๋‹ค๋ฉด package-private์˜ ๊ฐ€๋ณ€ ๋™๋ฐ˜ ํด๋ž˜์Šค๋งŒ์œผ๋กœ ์ถฉ๋ถ„ํ•˜๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, ์ด ํด๋ž˜์Šค๋ฅผ public์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฒŒ ์ตœ์„ ์ด๋‹ค.

- String์€ StringBuilder์™€ ๊ตฌ๋‹ฅ๋‹ค๋ฆฌ StringBuffer๋ฅผ ๊ฐ€๋ณ€ ๋™๋ฐ˜ ํด๋ž˜์Šค๋กœ ๋‘๊ณ ์žˆ๋‹ค.

๋ถˆ๋ณ€ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๋˜ ๋‹ค๋ฅธ ์„ค๊ณ„ ๋ฐฉ๋ฒ•

ยท ๋ชจ๋“  ์ƒ์„ฑ์ž๋ฅผ private ํ˜น์€ package-private์œผ๋กœ ๋งŒ๋“ค๊ณ , public ์ •์  ํŒฉํ„ฐ๋ฆฌ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

// ์ƒ์„ฑ์ž ๋Œ€์‹  ์ •์  ํŒฉํ„ฐ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ ๋ถˆ๋ณ€ ํด๋ž˜์Šค
public class Complex2 {
    private final double re;
    private final double im;
    
    private Complex2(double re, double im) {
        this.re = re;
        this.im = im;
    }
    
    public static final Complex2 valueOf(double re, double im){
        return new Complex2(re, im);
    }
    // ... ๋‚˜๋จธ์ง€ ์ฝ”๋“œ ์ƒ๋žต
}

ยท ์ด ๋ฐฉ์‹์ด ์ตœ์„ ์ผ ๋•Œ๊ฐ€ ๋งŽ๋‹ค.

- ๋ฐ”๊นฅ์—์„œ ๋ณผ ์ˆ˜ ์—†๋Š” packge-private ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ์›ํ•˜๋Š” ๋งŒํผ ๋งŒ๋“ค์–ดํ™œ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ํ›จ์”ฌ ์œ ์—ฐํ•˜๋‹ค.

- public์ด๋‚˜ protected ์ƒ์„ฑ์ž๊ฐ€ ์—†์œผ๋‹ˆ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—์„œ ์ด ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•˜๋Š” ๊ฒŒ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ํŒจํ‚ค์ง€ ๋ฐ”๊นฅ์˜ ํด๋ž˜์Šค์—์„œ ๋ฐ”๋ผ๋ณธ ์ด ๋ถˆ๋ณ€ ๊ฐ์ฒด๋Š” ์‚ฌ์‹ค์ƒ final์ด๋‹ค.

- ๋‹ค์ˆ˜์˜ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•œ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•˜๊ณ , ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์—์„œ ๊ฐ์ฒด ์บ์‹ฑ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด ์„ฑ๋Šฅ์„ ๋Œ์–ด์˜ฌ๋ฆด ์ˆ˜๋„ ์žˆ๋‹ค.

BigInteger์™€ BigDecimal์˜ ์„ค๊ณ„ ์˜ค๋ฅ˜

ยท BigInteger์™€ BigDecimal์„ ์„ค๊ณ„ํ•  ๋‹น์‹œ ๋ถˆ๋ณ€ ๊ฐ์ฒด๊ฐ€ ์‚ฌ์‹ค์ƒ final์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋„๋ฆฌ ํผ์ง€์ง€ ์•Š์•˜๋‹ค. ๊ทธ๋ž˜์„œ ์ด ๋‘ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋“ค์€ ๋ชจ๋‘ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์„ค๊ณ„๋˜์—ˆ๊ณ , ํ•˜์œ„ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋กœ ์ง€๊ธˆ๊นŒ์ง€ ๋ฌธ์ œ๋ฅผ ๊ณ ์น˜์ง€ ๋ชปํ–ˆ๋‹ค.

ยท ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ BigInteger๋‚˜ BigDecimal์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ธ์ˆ˜๋กœ ๋ฐ›๋Š”๋‹ค๋ฉด ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

- ์ด ๊ฐ’๋“ค์ด ๋ถˆ๋ณ€์ด์–ด์•ผ ํด๋ž˜์Šค์˜ ๋ณด์•ˆ์„ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์ธ์ˆ˜๋กœ ๋ฐ›์€ ๊ฐ์ฒด๊ฐ€ ์ง„์งœ BigInteger ํ˜น์€ BigDecimal์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

- ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ํ•˜์œ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ผ๊ณ  ํ™•์ธ๋˜๋ฉด, ์ด ์ธ์ˆ˜๋“ค์€ ๊ฐ€๋ณ€์ด๋ผ ๊ฐ€์ •ํ•˜๊ณ  ๋ฐฉ์–ด์ ์œผ๋กœ ๋ณต์‚ฌํ•ด ์‚ฌ์šฉํ•˜์•ผ ํ•œ๋‹ค(์•„์ดํ…œ 50).

public static BigInteger safeInstance(BigInteger val){
    return val.getClass() == BigInteger.class ?
        val : new BigInteger(val.toByteArray());
}

์„ฑ๋Šฅ ๊ณ ๋ คํ•˜๊ธฐ

ยท "๋ชจ๋“  ํ•„๋“œ๊ฐ€ final์ด๊ณ , ์–ด๋–ค๋ฉ”๋–ค ๋ฉ”์„œ๋“œ๋„ ๊ทธ ๊ฐ์ฒด๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์–ด์•ผ ํ•œ๋‹ค"๋Š” ๊ทœ์น™์€ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์™„ํ™”๋  ์ˆ˜ ์žˆ๋‹ค.

"์–ด๋–ค ๋ฉ”์„œ๋“œ๋„ ๊ฐ์ฒด์˜ ์ƒํƒœ ์ค‘ ์™ธ๋ถ€์— ๋น„์น˜๋Š” ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค."

ยท ์–ด๋–ค ๋ถˆ๋ณ€ ํด๋ž˜์Šค๋Š” ๊ณ„์‚ฐ ๋น„์šฉ์ด ํฐ ๊ฐ’์„ ์ฒ˜์Œ ์“ฐ์ผ ๋•Œ ๊ณ„์‚ฐํ•˜์—ฌ final์ด ์•„๋‹Œ ํ•„๋“œ์— ์บ์‹ทํ•ด๋†“๊ธฐ๋„ ํ•œ๋‹ค. ๋˜‘๊ฐ™์€ ๊ฐ’์„ ๋‹ค์‹œ ์š”์ฒญํ•˜๋ฉด ์บ์‹œํ•ด๋‘” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๊ณ„์‚ฐ ๋น„์šฉ์„ ์ ˆ๊ฐํ•œ๋‹ค.

- ์ด ๋ฌ˜์ˆ˜๋Š” ์ˆœ์ „ํžˆ ๊ทธ ๊ฐ์ฒต๊ฐ€ ๋ถˆ๋ณ€์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€๋ฆด ์ˆ˜ ์žˆ๋‹ค. ๋ช‡ ๋ฒˆ์„ ๊ณ„์‚ฐํ•ด๋„ ํ•ญ์ƒ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋งŒ๋“ค์–ด์ง์„ ๋ณด์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋ถˆ๋ณ€์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์—†๋Š” ํด๋ž˜์Šค

ยท ๋ชจ๋“  ํด๋ž˜์Šค๋ฅผ ๋ถˆ๋ณ€์œผ๋กœ ๋งŒ๋“ค ์ˆ˜๋Š” ์—†๋‹ค.

ยท ๋ถˆ๋ณ€์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์—†๋Š” ํด๋ž˜์Šค๋ผ๋„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์„ ์ตœ์†Œํ•œ์œผ๋กœ ์ค„์ด์ž.

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

๋ถˆ๋ณ€์‹ ์ดˆ๊ธฐํ™”

ยท ์ƒ์„ฑ์ž๋Š” ๋ถˆ๋ณ€์‹ ์„ค์ •์ด ๋ชจ๋‘ ์™„๋ฃŒ๋œ, ์ดˆ๊ธฐํ™”๊ฐ€ ์™„๋ฒฝํžˆ ๋๋‚œ ์ƒํƒœ์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.

ยท ํ™•์‹คํ•œ ์ด์œ ๊ฐ€ ์—†๋‹ค๋ฉด, ์ƒ์„ฑ์ž์™€ ์ •์  ํŒฉํ„ฐ๋ฆฌ ์™ธ์—๋Š” ๊ทธ ์–ด๋–ค ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ๋„ public์œผ๋กœ ์ œ๊ณตํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

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

์ •๋ฆฌํ•˜๊ธฐ

ยท ๊ฒŒํ„ฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ด์„œ ๋ฌด์กฐ๊ฑด ์„ธํ„ฐ๋ฅผ ๋งŒ๋“ค์ง€ ๋ง์ž.

ยท ํด๋ž˜์Šค๋Š” ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋ถˆ๋ณ€์ด์–ด์•ผ ํ•œ๋‹ค.

ยท ๋ถˆ๋ณ€ ํด๋ž˜์Šค๋Š” ์žฅ์ ์ด ๋งŽ์œผ๋ฉฐ, ๋‹จ์ ์€ ํŠน์ • ์ƒํ™ฉ์—์„œ์˜ ์ž ์žฌ์  ์„ฑ๋Šฅ ์ €ํ•˜๋ฟ์ด๋‹ค.

ยท ๋‹จ์ˆœํ•œ ๊ฐ’ ๊ฐ์ฒด๋Š” ํ•ญ์ƒ ๋ถˆ๋ณ€์œผ๋กœ ๋งŒ๋“ค์ž.

ยท String๊ณผ BigInteger์ฒ˜๋Ÿผ ๋ฌด๊ฑฐํ›ˆ ๊ฐ’ ๊ฐ์ฒด๋„ ๋ถˆ๋ณ€์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ๊ณ ์‹ฌํ•œ๋‹ค.

- ์„ฑ๋Šฅ ๋•Œ๋ฌธ์— ์–ด์ฉ” ์ˆ˜ ์—†๋‹ค๋ฉด, ๋ถˆ๋ณ€ ํด๋ž˜์Šค์™€ ์Œ์„ ์ด๋ฃจ๋Š” ๊ฐ€๋ณ€ ๋™๋ฐ˜ ํด๋ž˜์Šค๋ฅผ public ํด๋ž˜์Šค๋กœ ์ œ๊ณตํ•˜์ž.

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


ํ•ต์‹ฌ ์ •๋ฆฌ

ยท ์ƒ์†์„ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ ์บก์Šํ™”๋ฅผ ํ•ด์นœ๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

ยท ์ƒ์†์€ ์ƒ์œ„ ํด๋ž˜์Šค์™€ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์ˆœ์ˆ˜ํ•œ is-a ๊ด€๊ณ„์ผ ๋•Œ๋งŒ ์จ์•ผํ•œ๋‹ค.

- is-a ๊ด€๊ณ„์ผ ๋•Œ๋„ ์•ˆ์‹ฌํ•  ์ˆ˜ ์—†๋‹ค. ํ•˜์œ„ ํด๋ž˜์Šค์˜ ํŒจํ‚ค์ง€๊ฐ€ ์ƒ์œ„ ํด๋ž˜์Šค์™€ ๋‹ค๋ฅด๊ณ , ์ƒ์œ„ ํด๋ž˜์Šค๊ฐ€ ํ™•์žฅ์„ ๊ณ ๋ คํ•ด ์„ค๊ณ„๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

ยท ์ƒ์†์˜ ์ทจ์•ฝ์ ์„ ํ”ผํ•˜๋ ค๋ฉด ์ƒ์† ๋Œ€์‹  ์ปดํฌ์ง€์…˜๊ณผ ์ „๋‹ฌ์„ ์‚ฌ์šฉํ•˜์ž.

- ํŠนํžˆ ๋ž˜ํผ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•  ์ ๋‹นํ•œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด ๋”์šฑ ๊ทธ๋ ‡๋‹ค. ๋ž˜ํผ ํด๋ž˜์Šค๋Š” ํ•˜์œ„ ํด๋ž˜์Šค๋ณด๋‹ค ๊ฒฌ๊ณ ํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ๋‹ค.

์ƒ์†์˜ ๋‹จ์ 

ยท ์ƒ์†์€ ์ฝ”๋“œ๋ฅผ ์žฌํ™œ์šฉํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ์ˆ˜๋‹จ์ด์ง€๋งŒ, ํ•ญ์ƒ ์ตœ์„ ์€ ์•„๋‹ˆ๋‹ค. ์ž˜๋ชป ์‚ฌ์šฉํ•˜๋ฉด ์˜ค๋ฅ˜๋ฅผ ๋‚ด๊ธฐ ์‰ฌ์šด ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋งŒ๋“ ๋‹ค.

- ์ƒ์œ„ ํด๋ž˜์Šค์™€ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๋ชจ๋‘ ๊ฐ™์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ํ†ต์ œํ•˜๋Š” ํŒจํ‚ค์ง€ ์•ˆ์—์„œ๋ผ๋ฉด, ์ƒ์†๋„ ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค.

- ํ™•์žฅํ•  ๋ชฉ์ ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ๊ณ , ๋ฌธ์„œํ™”๋„ ์ž˜ ๋œ ํด๋ž˜์Šค(์•„์ดํ…œ 19)๋„ ์•ˆ์ „ํ•˜๋‹ค.

- ์ผ๋ฐ˜์ ์ธ ๊ตฌ์ฒด ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์˜ ๊ตฌ์ฒด ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๋Š” ์ผ์€ ์œ„ํ—˜ํ•˜๋‹ค.

ยท ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ๊ณผ ๋‹ฌ๋ฆฌ ์ƒ์†์€ ์บก์Šํ™”๋ฅผ ๊นจ๋œจ๋ฆฐ๋‹ค.

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

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

์ƒ์†์„ ์ž˜๋ชป ์‚ฌ์šฉํ•œ ์˜ˆ์‹œ

ยท ๋‹ค์Œ ํด๋ž˜์Šค๋Š” HashSet์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค. ์ด ํด๋ž˜์Šค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

public class InstrumentedHashSet<E> extends HashSet<E> {
    // ์ถ”๊ฐ€๋œ ์›์†Œ์˜ ์ˆ˜
    private int addCount = 0;
    
    public InstrumentedHashSet() {
    }
    
    public InstrumentedHashSet(int initialCapacity, float loadFactor) {
        super(initialCapacity, loadFactor);
    }
    
    @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;
    }
    }

ยท ์ด ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์— addAll ๋ฉ”์„œ๋“œ๋กœ ์›์†Œ 3๊ฐœ๋ฅผ ๋”ํ–ˆ๋‹ค๊ณ  ํ•ด๋ณด์ž. getAddCount ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด 3์„ ๋ฐ˜ํ™˜ํ•˜๋ฆฌ๋ผ ๊ธฐ๋Œ€ํ•˜๊ฒ ์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” 6์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

InstrumentedHashSet<String> s = new InstrumentedHashSet();
    s.addAll(List.of("๊ฐ€","๋‚˜","๋‹ค"))

ยท ์›์ธ์€ HashSet์˜ addAll ๋ฉ”์„œ๋“œ๊ฐ€ add ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๊ตฌํ˜„๋œ ๋ฐ์žˆ๋‹ค. ์ด๋Ÿฐ ๊ตฌํ˜„ ๋ฐฉ์‹์€ HashSet ๋ฌธ์„œ์—๋Š” ์“ฐ์—ฌ ์žˆ์ง€ ์•Š๋‹ค.

addAll ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜์ง€ ์•Š์œผ๋ฉด?

ยท ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ addAll ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜์ง€ ์•Š์œผ๋ฉด, ๋ฌธ์ œ๋ฅผ ๊ณ ์น  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ HashSet์˜ addAll์ด add ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด ๊ตฌํ˜„ํ–ˆ์œผ์„ ๊ฐ€์ •ํ•œ ํ•ด๋ฒ•์ด๋ผ๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค.

- ์ž์‹ ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์„์‚ฌ์šฉํ•˜๋Š” ์ž๊ธฐ์‚ฌ์šฉ(self-use) ์—ฌ๋ถ€๋Š” ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„ ๋ฐฉ์‹์— ํ•ด๋‹นํ•˜๋ฉฐ, ์ž๋ฐ” ํ”Œ๋žซํผ ์ „๋ฐ˜์ ์ธ ์ •์ฑ…์ธ์ง€, ๋‹ค์Œ ๋ฆด๋ฅด์Šค์—์„œ๋„ ์œ ์ง€๋ ์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฐ ๊ฐ€์ •์— ๊ธฐ๋Œ„ ํด๋ž˜์Šค๋Š” ๊บ ์ง€๊ธฐ ์‰ฝ๋‹ค.

addAll ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค๋ฅธ ์‹์œผ๋กœ ์žฌ์ •์˜ ํ•œ๋‹ค๋ฉด?

ยท addAll ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค๋ฅธ ์‹์œผ๋กœ ์žฌ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์˜ˆ์ปจ๋Œ€ ์ฃผ์–ด์ง„ ์ปฌ๋ ‰์…˜์„ ์ˆœํšŒํ•˜๋ฉฐ ์›์†Œ ํ•˜๋‚˜๋‹น add ๋ฉ”์„œ๋“œ๋ฅผ ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

- ์žฅ์ : HashSet์˜ addAll์„ ๋” ์ด์ƒ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋‹ˆ addAll์ด add๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€์™€ ์ƒ๊ด€์—†์ด ๊ฒฐ๊ณผ๊ฐ€ ์˜ณ๋‹ค๋Š” ์ ์—์„œ ๋” ๋‚˜์€ ํ•ด๋ฒ•์ด๋‹ค.

- ๋‹จ์ : ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ ๋™์ž‘์„ ๋‹ค์‹œ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์€ ์–ด๋ ต๊ณ , ์‹œ๊ฐ„๋„ ๋” ๋“ค๊ณ , ์˜ค๋ฅ˜๋ฅผ ๋‚ด๊ฑฐ๋‚˜ ์„ฑ๋Šฅ์„ ๋–จ์–ด๋œจ๋ฆด ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” private ํ•„๋“œ๋ฅผ ์จ์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด ์ด ๋ฐฉ์‹ฑ์œผ๋กœ๋Š” ๊ตฌํ˜„ ์ž์ฒด๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ๊นจ์ง€๊ธฐ ์ถ”๊ฐ€์ ์ธ ์‰ฌ์šด ์ด์œ 

ยท ๋ณด์•ˆ ๋•Œ๋ฌธ์— ์ปฌ๋ ‰์…˜์— ์ถ”๊ฐ€๋œ ๋ชจ๋“  ์›์†Œ๊ฐ€ ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ๋งŒ ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์— ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๋ฉด?

- ์ปฌ๋ ‰์…˜์„ ์ƒ์†ํ•˜์—ฌ ์›์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•ด ํ•„์š”ํ•œ ์กฐ๊ฑด์„ ๋จผ์ € ๊ฒ€์‚ฌํ•˜๊ฒŒ ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

- ๋ฌธ์ œ์ : ์ด ๋ฐฉ์‹์ด ํ†ตํ•˜๋Š” ๊ฒƒ์€ ์ƒ์œ„ ํด๋ž˜์Šค์— ๋˜ ๋‹ค๋ฅธ ์›์†Œ ์ถ”๊ฐ€ ๋ฉ”์„œ๋“œ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ธฐ ์ „๊นŒ์ง€๋‹ค. ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์—์„œ ์šฐ๋ คํ•œ ์ผ์ด ์ƒ๊ธฐ๋ฉด, ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ์žฌ์ •์˜ํ•˜์ง€ ๋ชปํ•œ ๊ทธ ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด 'ํ—ˆ์šฉ๋˜์ง€ ์•Š์€' ์›์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

- ์‹ค์ œ๋กœ Hashtable๊ณผ Vector๋ฅผ ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์— ํฌํ•จ์‹œํ‚ค์ž ์ด์™€ ๊ด€๋ จํ•œ ๋ณด์•ˆ ๊ตฌ๋ฉ๋“ค์„ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ์‚ฌํƒœ๊ฐ€ ๋ฒŒ์–ด์กŒ๋‹ค.

ยท ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๋Œ€์‹  ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด๋„ (ํ›จ์”ฌ ์•ˆ์ „ํ•œ ๊ฒƒ์€ ๋งž์ง€๋งŒ) ์œ„ํ—˜์ด ์กด์žฌํ•œ๋‹ค.

- ์ƒ์œ„ ํด๋ž˜์Šค์— ์ƒˆ ๋ฉ”์„œ๋“œ๊ฐ€ ์ถ”๊ฐ€๋๋Š”๋ฐ ํ•˜์œ„ ํด๋ž˜์Šค์— ์ถ”๊ฐ€ํ•œ ๋ฉ”์„œ๋“œ์™€ ์‹œ๊ทธ๋‹ˆ์ฒ˜๊ฐ€ ๊ฐ™๊ณ  ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ๋‹ค๋ฅด๋‹ค๋ฉด, ํด๋ž˜์Šค๋Š” ์ปดํŒŒ์ผ์กฐ์ฐจ ๋˜์ง€ ์•Š๋Š”๋‹ค.

- ๋ฐ˜ํ™˜ ํƒ€์ž… ๋งˆ์ € ๊ฐ™๋‹ค๋ฉด ์ƒ์œ„ ํด๋ž˜์Šค์˜ ์ƒˆ ๋ฉ”์„œ๋“œ๋ฅด ์žฌ์ •์˜ํ•œ ๊ผด์ด๋‹ˆ ์•ž์„œ์˜ ๋ฌธ์ œ์™€ ๋˜‘๊ฐ™์€ ์ƒํ™ฉ์— ๋ถ€๋‹ฅ์นœ๋‹ค.

- ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋Š” ์กด์žฌํ•˜์ง€๋„ ์•Š์•˜์œผ๋‹ˆ, ๋งŒ๋“  ๋ฉ”์„œ๋“œ๋Š” ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์š”๊ตฌํ•˜๋Š” ๊ทœ์•ฝ์„ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•œ ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๋‹ค.

์ƒ์†์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฌ˜์•ˆ - ์ปดํฌ์ง€์…˜

ยท ๊ธฐ์กด ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•˜๋Š” ๋Œ€์‹ , ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  private ํ•„๋“œ๋กœ ๊ธฐ์กด ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

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

ยท ์ƒˆ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๋“ค์€ (private ํ•„๋“œ๋กœ ์ฐธ์กฐํ•˜๋Š”) ๊ธฐ์กด ํด๋ž˜์Šค์˜ ๋Œ€์‘ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ ํ•ด ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

- ์ด ๋ฐฉ์‹์„ ์ „๋‹ฌ(forwarding)์ด๋ผ ํ•˜๋ฉฐ, ์ƒˆ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋“ค์€ ์ „๋‹ฌ ๋ฉ”์„œ๋“œ(forwarding method)๋ผ ๋ถ€๋ฅธ๋‹ค.

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

์ปดํฌ์ง€์…˜์„ ์ ์šฉํ•œ ํด๋ž˜์Šค

ยท ์•„๋ž˜ ์ฝ”๋“œ๋Š” ์•ž์„œ ๊ตฌํ˜„ํ•œ InstrumentedHshSet์„ ์ปดํฌ์ง€์…˜๊ณผ ์ „๋‹ฌ ๋ฐฉ์‹์œผ๋กœ ๋‹ค์‹œ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ด๋‹ค. ํ•˜๋‚˜๋Š” ์ง‘ํ•œ ํด๋ž˜์Šค ์ž์‹ ์ด๊ณ , ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ „๋‹ฌ ๋ฉ”์„œ๋“œ๋งŒ์œผ๋กœ ์ด๋ค„์ง„ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ „๋‹ฌ ํด๋ž˜์Šค๋‹ค.

// ๋ž˜ํผ ํด๋ž˜์Šค - ์ƒ์† ๋Œ€์‹  ์ปดํฌ์ง€์…˜ ์‚ฌ์šฉ
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> s;
        public ForwardingSet(Set<E> s) {this.s = s;}
            
            public int size() {return 0;}
            public boolean isEmpty() {return s.isEmpty();}
            public boolean contains(Object o) {return s.contains(o);}
            public Iterator<E> iterator() {return s.iterator();}
                public Object[] toArray() {return s.toArray();}
                public <T> T[] toArray(T[] a) {return s.toArray(a);}
                    public boolean add(E e) {return s.add(e);}
                    public boolean remove(Object o) {return s.remove(o);}
                    public boolean containsAll(Collection<?> c) {return s.containsAll(c);}
                        public boolean addAll(Collection<? extends E> c) {return s.addAll(c);}
                            public boolean retainAll(Collection<?> c) {return s.retainAll(c);}
                                public boolean removeAll(Collection<?> c) {return s.removeAll(c);}
                                    public void clear() {s.clear();}
                                    @Override public boolean equals(Object o) {return s.equals(o);}
                                    @Override public int hashCode() {return s.hashCode();}
                                    @Override public String toString() {return s.toString();}
                                    }

ยท InstrumentedSet์€ HashSet์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ •์˜ํ•œ Set ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•ด ์„ค๊ณ„๋˜์–ด ๊ฒฌ๊ณ ํ•˜๊ณ , ์œ ์—ฐํ•˜๋‹ค.

- Set ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ–ˆ๊ณ , Set์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ธ์ˆ˜๋กœ ๋ฐ›๋Š” ์ƒ์„ฑ์ž๋ฅผ ํ•˜๋‚˜ ์ œ๊ณตํ•œ๋‹ค.

- ์ž„์˜์˜ Set์— ๊ณ„์ธก ๊ธฐ๋Šฅ์„ ๋ง์”Œ์›Œ ์ƒˆ๋กœ์šด Set์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ด ํด๋ž˜์Šค์˜ ํ•ต์‹ฌ์ด๋‹ค.

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

Set<Instant> times = new InstrumentedSet<>(new TreeSet<>());
    Set<E> s = new InstrumentedSet<>(new HashSet<>(INIT_CAPACITY));

ยท InstrumentSet์„ ์ด์šฉํ•˜๋ฉด ๋Œ€์ƒ Set ์ธ์Šคํ„ด์Šค๋ฅผ ํŠน์ • ์กฐ๊ฑดํ•˜์—์„œ๋งŒ ์ž„์‹œ๋กœ ๊ณ„์ธกํ•  ์ˆ˜ ์žˆ๋‹ค.

static void walk(Set<Dog> dogs) {
    InstrumentedSet<Dog> iDogs = new InstrumentedSet<>(dogs);
        ... //์ด ๋ฉ”์„œ๋“œ์—์„œ๋Š” dogs๋Œ€์‹  idogs๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
        }

ยท ๋‹ค๋ฅธ Set ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ์‹ธ๊ณ  ์žˆ๋‹ค๋Š” ๋œป์—์„œ InstrumentedSet ๊ฐ™์€ ํด๋ž˜์Šค๋ฅผ ๋ž˜ํผ ํด๋ž˜์Šค๋ผ ํ•˜๋ฉฐ, ๋‹ค๋ฅธ Set์— ๊ณ„์ธก ๊ธฐ๋Šฅ์„ ๋ง์”Œ์šด๋‹ค๋Š” ๋œป์—์„œ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด[Gamma95]์ด๋ผ๊ณ  ํ•œ๋‹ค.

ยท ์ปดํฌ์ง€์…˜๊ณผ ์ „๋‹ฌ์˜ ์กฐํ•ฉ์€ ๋„“์€ ์˜๋ฏธ๋กœ ์œ„์ž„(delegation)์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

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

ยท ์ „๋‹ฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋‹น ํ•˜๋‚˜์”ฉ๋งŒ ๋งŒ๋“ค์–ด๋‘๋ฉด ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋ง์”Œ์šฐ๋Š” ์ „๋‹ฌ ํด๋ž˜์Šค๋“ค์„ ์†์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

ex) ๊ตฌ์•„๋ฐ”๋Š” ๋ชจ๋“  ์ปฌ๋ ‰์…˜ ์ธํ„ฐํŽ˜์ด์Šค์šฉ ์ „๋‹ฌ ๋ฉ”์„œ๋“œ๋ฅด ์ „๋ถ€ ๊ตฌํ˜„ํ•ด๋’€๋‹ค.

๋ž˜ํผ ํด๋ž˜์Šค์˜ ๋‹จ์ 

ยท ๋ž˜ํผ ํด๋ž˜์Šค์˜ ๋‹จ์ ์€ ๊ฑฐ์˜ ์—†์ง€๋งŒ, ์ฝœ๋ฐฑ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ์–ด์šธ๋ฆฌ์ง€ ์•Š๋‹ค๋Š” ์ ๋งŒ ์ฃผ์˜ํ•˜์ž.

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

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

์ƒ์†์„ ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

ยท ์ƒ์†์€ ๋ฐ˜๋“œ์‹œ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ์ง„์งœ ํ•˜์œ„ ํƒ€์ž…์ธ ์ƒํ™ฉ์—๋งŒ ์“ฐ์—ฌ์•ผ ํ•œ๋‹ค. ์ฆ‰, ํด๋ž˜์Šค B๊ฐ€ ํด๋ž˜์Šค A์™€ is-a ๊ด€๊ณ„์ผ ๋•Œ๋งŒ ํด๋ž˜์Šค A๋ฅผ ์ƒ์†ํ•ด์•ผํ•œ๋‹ค.

- ์•„๋‹Œ ๊ฒฝ์šฐ A๋ฅผ private ์ธ์Šคํ„ด์Šค๋กœ ๋‘๊ณ , A์™€๋Š” ๋‹ค๋ฅธ API๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ๋Œ€๋‹ค์ˆ˜๋‹ค. ์ฆ‰, A๋Š” B๊ฐ€ ํ•„์ˆ˜ ๊ตฌ์„ฑ์š”์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ผ ๋ฟ์ด๋‹ค.

- ์ž๋ฐ” ํ”Œ๋žซํผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ Stack๊ณผ Vector, Properties์™€ Hashtable์€ ๋Š” ์ด๋ฅผ ๋ช…๋ฐฑํžˆ ์œ„๋ฐ˜ํ•œ ํด๋ž˜์Šค๋‹ค. ๋‘ ์‚ฌ๋ก€ ๋ชจ๋‘ ์ปดํฌ์ง€์…˜์„ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด ๋” ์ข‹์•˜์„ ๊ฒƒ์ด๋‹ค.

ยท ์ปดํฌ์ง€์…˜์„ ์จ์•ผ ํ•  ์ƒํ™ฉ์— ์ƒ์†์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฑด ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋…ธ์ถœํ•˜๋Š” ๊ผด์ด๋‹ค.

- ๊ทธ ๊ฒฐ๊ณผ API๊ฐ€ ๋‚ด๋ถ€ ๊ตฌํ˜„์— ๋ฌถ์ด๊ณ , ํด๋ž˜์Šค์˜ ์„ฑ๋Šฅ๋„ ์˜์›ํžˆ ์ œํ•œ๋œ๋‹ค. ๋˜ํ•œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋…ธ์ถœ๋œ ๋‚ด๋ถ€์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ€์žฅ ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ์ƒ์œ„ ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜์—ฌ ํ•˜์œ„ ํด๋ž˜์Šค์˜ ๋ถˆ๋ณ€์‹์„ ํ•ด์น  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

ex) Properties๋Š” ํ‚ค์™€ ๊ฐ’์œผ๋กœ ๋ฌธ์ž์—ด๋งŒ ํ—ˆ์šฉํ•˜๋„๋ก ์„ค๊ณ„ํ•˜๋ ค ํ–ˆ์œผ๋‚˜, ์ƒ์œ„ ํด๋ž˜์Šค์ธ Hashtable์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋ฉด ์ด ๋ถˆ๋ณ€์‹ ์„ ๊บ ๋ฒ„๋ฆด ์ˆ˜ ์žˆ๋‹ค. ๋ถˆ๋ณ€์‹์ด ํ•œ ๋ฒˆ ๊บ ์ง€๋ฉด load, store ๊ฐ™์€ properties API๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

ยท ์ปดํฌ์ง€์…˜ ๋Œ€์‹  ์ƒ์†์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๊ธฐ ์ „ ์ž๋ฌธํ•  ์งˆ๋ฌธ๋“ค: 1. ํ™•์žฅํ•˜๋ ค๋Š” ํด๋ž˜์Šค์˜ API์— ์•„๋ฌด๋Ÿฐ ๊ฒฐํ•จ์ด ์—†๋Š”๊ฐ€?

2. ๊ฒฐํ•จ์ด ์žˆ๋‹ค๋ฉด, ์ด ๊ฒฐํ•จ์ด ํ™•์žฅ ํด๋ž˜์Šค์˜ API๊นŒ์ง€ ์ „ํŒŒ๋ผ๋„ ๊ดœ์ฐฎ์€๊ฐ€?

- ์ปดํฌ์ง€์…˜์œผ๋กœ๋Š” ์ด๋Ÿฐ ๊ฒฐํ•จ์„ ์ˆจ๊ธฐ๋Š” ์ƒˆ๋กœ์šด API๋ฅผ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ƒ์†์€ ์ƒ์œ„ ํด๋ž˜์Šค์˜ API์˜ ๊ฒฐํ•จ๊นŒ์ง€ ๊ทธ๋Œ€๋กœ ์Šน๊ณ„ํ•œ๋‹ค.

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


ํ•ต์‹ฌ ์ •๋ฆฌ

ยท ์ƒ์†์šฉ ํด๋ž˜์Šค๋ฅผ ์„ค๊ณ„ํ•˜๊ธฐ๋งŒ ๋งŒ๋งŒ์น˜ ์•Š๋‹ค.

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

ยท ๋‹ค๋ฅธ ์ด๊ฐ€ ํšจ์œจ ์ข‹์€ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ์ผ๋ถ€ ๋ฉ”์„œ๋“œ๋ฅผ protected๋กœ ์ œ๊ณตํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

ยท ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•ด์•ผ ํ•  ๋ช…ํ™•ํ•œ ์ด์œ ๊ฐ€ ๋– ์˜ค๋ฅด์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ƒ์†์„ ๊ธˆ์ง€ํ•˜๋Š” ํŽธ์ด ๋‚ซ๋‹ค.

ยท ์ƒ์†์„ ๊ธˆ์ง€ํ•˜๋ ค๋ฉด ํด๋ž˜์Šค๋ฅผ final๋กœ ์„ ์–ธํ•˜๊ฑฐ๋‚˜ ์ƒ์„ฑ์ž ๋ชจ๋‘๋ฅผ ์™ธ๋ถ€์—์„œ ์ ‘๊ธ€ํ•  ์ˆ˜ ์—†๋„๋ก ๋งŒ๋“ค๋ฉด ๋œ๋‹ค.

TODO: ๋‚ด์šฉ ์ถ”๊ฐ€

public class Super {
    // ์ž˜๋ชป๋œ ์˜ˆ - ์ƒˆ์—‰์ž๊ฐ€ ์žฌ์ •์˜ ๊ฐ€๋Šฅ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
    public Super() {
        overrideMe();
    }
    
    public void overrideMe() {
    }
}
public class Sub extends Super{
    // ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ final ํ•„๋“œ, ์ƒ์„ฑ์ž์—์„œ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
    private final Instant instant;
    
    public Sub() {
        super();
        instant = Instant.now();
    }
    
    // ์žฌ์ •์˜ ๊ฐ€๋Šฅ ๋ฉ”์„œ๋“œ, ์ƒ์œ„ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๊ฐ€ ํ˜ธ์ถœํ•œ๋‹ค.
    @Override
    public void overrideMe() {
        System.out.println(instant);
    }
    
    public static void main(String[] args) {
        Sub sub = new Sub();
        sub.overrideMe();
    }
}

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


ํ•ต์‹ฌ ์ •๋ฆฌ

ยท ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์ค‘ ๊ตฌํ˜„์šฉ ํƒ€์ž…์œผ๋กœ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ฐ€์žฅ ์ ํ•ฉํ•˜๋‹ค.

ยท ๋ณต์žกํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ผ๋ฉด ๊ตฌํ˜„ํ•˜๋Š” ์ˆ˜๊ณ ๋ฅผ ๋œ์–ด์ฃผ๋Š” ๊ณจ๊ฒฉ ๊ตฌํ˜„์„ ํ•จ๊ป˜ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ผญ ๊ณ ๋ คํ•˜์ž.

ยท ๊ณจ๊ฒฉ ๊ตฌํ˜„์€ '๊ฐ€๋Šฅํ•œ' ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋กœ ์ œ๊ณตํ•˜์—ฌ ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๋ชจ๋“  ๊ณณ์—์„œ ํ™œ์šฉํ•˜๋„๋ก ํ•˜์ž.

ยท '๊ฐ€๋Šฅํ•œ'์ด๋ผ๊ณ  ํ•œ ์ด์œ ๋Š”, ์ธํ„ฐํŽ˜์ด์Šค์— ๊ฑธ๋ ค ์žˆ๋Š” ๊ตฌํ˜„์ƒ์˜ ์ œ์•ฝ ๋•Œ๋ฌธ์— ๊ณจ๊ฒฉ ๊ตฌํ˜„์„ ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋” ํ”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

TODO: ๋‚ด์šฉ ์ถ”๊ฐ€

public interface Singer {
    AudioClip sing(Song s);
}

public interface SonrgWriter {
    Song compose(int chartPosition);
}
public interface SingerSongWriter extends Singer, SongWritter {
    AudioClip strum();
    void actSensitive();
}
static List<Integer> intArrayAsList(int[] a) {
    Objects.requireNonNull(a);
    
    // ๋‹ค์ด์•„๋ชฌ๋“œ ์—ฐ์‚ฐ์ž๋ฅผ ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฑด ์ž๋ฐ” 9๋ถ€ํ„ฐ ๊ฐ€๋Šฅํ•˜๋‹ค.
    // ๋” ๋‚ฎ์€ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด <Integer>๋กœ ์ˆ˜์ •ํ•˜์ž.
    return new AbstractList<>() {
        @Override
        public Integer get(int i) {
            return a[i]; // ์˜คํ† ๋ฐ•์‹ฑ(์•„์ดํŒ€ 6)
        }
        @Override public Integer set(int i, Integer val) {
            int oldVal = a[i];
            a[i] = val; 	// ์˜คํ† ์–ธ๋ฐ•์‹ฑ
            return oldVal; //์˜คํ† ๋ฐ•์‹ฑ
        }
        
        @Override public int size() {
            return a.length;
        }
    };
}
public abstract class AbstractMapEntry<K,V> implements Map.Entry<K,V> {
    // ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์—”ํŠธ๋ฆฌ๋Š” ์ด ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ์žฌ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.
    @Override public V setValue(V value) {
        throw new UnsupportedOperationException();
    }
    // Map.Entry.equals์˜ ์ผ๋ฐ˜ ๊ทœ์•ฝ์„ ๊ตฌํ˜„ํ•œ๋‹ค.
    @Override public boolean equals(Object o) {
        if (o == this) {
            return true;
        }
        if (!(o instanceof Map.Entry)) {
            return false;
        }
        Map.Entry<?,?> e = (Map.Entry) o;
        return Objects.equals(e.getKey(),   getKey())
        && Objects.equals(e.getValue(), getValue());
    }
    
    // Map.Entry.hashCode์˜ ์ผ๋ฐ˜ ๊ทœ์•ฝ์„ ๊ตฌํ˜„ํ•œ๋‹ค.
    @Override public int hashCode() {
        return Objects.hashCode(getKey()) ^ Objects.hashCode(getValue());
    }
    
    @Override public String toString() {
        return getKey() + "=" + getValue();
    }
}

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


* ํ•ต์‹ฌ: ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋ผ๋Š” ๋„๊ตฌ๊ฐ€ ์ƒ๊ฒผ๋”๋ผ๋„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ค๊ณ„ํ•  ๋–„๋Š” ์—ฌ์ „ํžˆ ์„ธ์‹ฌํ•œ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ด์ž. ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋กœ ๊ธฐ์กด ์ธํ„ฐํŽ˜์ด์Šค์— ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ปค๋‹ค๋ž€ ์œ„ํ—˜๋„ ๋”ธ๋ ค ์˜จ๋‹ค.

ยท ์ž๋ฐ” 8์ „์—๋Š” ๊ธฐ์กด ๊ตฌํ˜„์ฒด๋ฅผ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š๊ณ ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•  ๋ฐฉ๋ฒ•์ด ์—ˆ์—ˆ๋‹ค.

- ์ธํ„ฐํŽ˜์ด์Šค์— ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ณดํ†ต์€ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š”๋ฐ, ์ถ”๊ฐ€๋œ ๋ฉ”์„œ๋“œ๊ฐ€ ์šฐ์—ฐํžˆ ๊ธฐ์กด ๊ตฌํ˜„์ฒด์— ์ด๋ฏธ ์กด์žฌํ•  ๊ฐ€๋Šฅ์„ฑ์€ ์•„์ฃผ ๋‚ฎ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

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

- ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•˜๋ฉด, ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํ›„ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜์ง€ ์•Š์€ ๋ชจ๋“  ํด๋ž˜์Šค์—์„œ ๋””ํดํŠธ ๊ตฌํ˜„์ด ์“ฐ์ด๊ฒŒ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋Š” ๊ตฌํ˜„ ํด๋ž˜์Šค์— ๋Œ€ํ•ด ์•„๋ฌด๊ฒƒ๋„ ๋ชจ๋ฅธ ์ฑ„ ๋ฌด์ž‘์ • ์‚ฝ์ž…๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋“  ๊ธฐ์กด ๊ตฌํ˜„์ฒด๋“ค๊ณผ ๋งค๋„๋Ÿฝ๊ฒŒ ์—ฐ๋™๋˜๋ฆฌ๋ผ๋Š” ๋ณด์žฅ์€ ์—†๋‹ค.

๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ ์˜ˆ์‹œ - ์ปฌ๋ ‰์…˜ ์ธํ„ฐํŽ˜์ด์Šค

ยท ์ž๋ฐ” 8์—์„œ๋Š” ํ•ต์‹ฌ ์ปฌ๋ ‰์…˜ ์ธํ„ฐํŽ˜์ด์Šค๋“ค์— ๋‹ค์ˆ˜์˜ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.

- ์ฃผ๋กœ ๋žŒ๋‹ค๋ฅผ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋‹ค.

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

ยท ์ž๋ฐ” 8 Collection ์ธํ„ฐํŽ˜์ด์Šค์— ์ถ”๊ฐ€๋œ removeIf ๋ฉ”์„œ๋“œ๋Š” ์ฃผ์–ด์ง„ ๋ถˆ๋ฆฌ์–ธ ํ•จ์ˆ˜(predicate)๊ฐ€ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ชจ๋“  ์›์†Œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค. ๋””ํดํŠธ ๊ตฌํ˜„์€ ์•„๋งˆ ๋‹ค์Œ์ฒ˜๋Ÿผ ๊ตฌํ˜„๋˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

default boolean removeIf(Predicate<? super E> filter) {
    Objects.requireNonNull(filter);
    boolean removed = false;
    final Iterator<E> each = iterator();
        while (each.hasNext()) {
            if (filter.test(each.next())) {
                each.remove();
                removed = true;
            }
        }
        return removed;
        }

์ด ์ฝ”๋“œ๋ณด๋‹ค ๋” ๋ฒ”์šฉ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ๋„ ์–ด๋ ต๊ฒ ์ง€๋งŒ, ํ˜„์กดํ•˜๋Š” ๋ชจ๋“  Collection ๊ตฌํ˜„์ฒด์™€ ์ž˜ ์–ด์šฐ๋Ÿฌ์ง€๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์•„ํŒŒ์น˜ ์ปค๋จผ์ฆˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ SynchronizedCollection ํด๋ž˜์Šค๋Š” ์ง€๊ธˆ๋„ ํ™œ๋ฐœํžˆ ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ์ง€๋งŒ, removeIf ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜์ง€ ์•Š๊ณ  ์žˆ๋‹ค. (2018.11 ๊ธฐ์ค€)

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

์ด ํด๋ž˜์Šค๋ฅผ ์ž๋ฐ” 8๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ฒŒ๋˜์–ด removeIf์˜ ๋””ํดํŠธ ๊ตฌํ˜„์„ ๋ฌผ๋ ค๋ฐ›์œผ๋ฉด, ๋ชจ๋“  ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ์•Œ์•„์„œ ๋™๊ธฐํ™”ํ•ด์ฃผ์ง€ ๋ชปํ•œ๋‹ค. removeIf์˜ ๊ตฌํ˜„์€ ๋™๊ธฐํ™”์— ๊ด€ํ•ด ์•„๋ฌด๊ฒƒ๋„ ๋ชจ๋ฅด๋ฏ€๋กœ ๋ฝ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ SynchronizedCollection ์ธ์Šคํ„ด์Šค๋ฅผ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ removeIf๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ConcurrentModificationException์ด ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๋กœ ์ด๋Ÿฌ์งˆ ์ˆ˜ ์žˆ๋‹ค.

ยท ์ž๋ฐ” ํ”Œ๋žซํผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ๋„ ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ จ์˜ ์กฐ์น˜๋ฅผ ์ทจํ–ˆ๋‹ค.

- ์˜ˆ๋ฅผ ๋“ค์–ด ๊ตฌํ˜„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๊ณ , ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ์—์„œ๋Š” ๋””ํฌ๋กœํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „ ํ•„์š”ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ–ˆ๋‹ค.

ex) Collections.synchronizedCollection์ด ๋ฐ˜ํ™˜ํ•˜๋Š” package-private ํด๋ž˜์Šค๋“ค์€ removeIf๋ฅผ ์žฌ์ •์˜ํ•˜๊ณ , ์ด๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋“ค์€ ๋””ํดํŠธ ๊ตฌํ˜„์„ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ๋™๊ธฐํ™”๋ฅผ ํ•˜๋„๋ก ํ–ˆ๋‹ค.

ยท ์ž๋ฐ” ํ”Œ๋žซํผ์— ์†ํ•˜์ง€ ์•Š์€ ์ œ3์˜ ๊ธฐ์กด ์ปฌ๋ ‰์…˜ ๊ตฌํ˜„์ฒด๋“ค์€ ์ด๋Ÿฐ ์–ธ์–ด ์ฐจ์›์˜ ์ธํ„ฐํŽ˜์ด์Šค ๋ณ€ํ™”์— ๋ฐœ๋งž์ถฐ ์ˆ˜์ •๋  ๊ธฐํšŒ๊ฐ€ ์—†์—ˆ์œผ๋ฉฐ, ๊ทธ์ค‘ ์ผ๋ถ€๋Š” ์—ฌ์ „ํžˆ ์ˆ˜์ •๋˜์ง€ ์•Š๊ณ  ์žˆ๋‹ค.

๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ ์‚ฌํ•ญ

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

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

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

ยท ๋ฐ˜๋ฉด, ์ƒˆ๋กœ์šด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ํ‘œ์ค€์ ์ธ ๋ฉ”์„œ๋“œ ๊ตฌํ˜„์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ ์•„์ฃผ ์œ ์šฉํ•œ ์ˆ˜๋‹จ์ด๋ฉฐ, ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋” ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•ด ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” ํ•ด์ค€๋‹ค(์•„์ดํ…œ 20).

ยท ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋Š” 1. ์ธํ„ฐํŽ˜์ด์Šค๋กœ๋ถ€ํ„ฐ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ 2. ๊ธฐ์กด ๋ฉ”์„œ๋“œ์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์šฉ๋„๊ฐ€ ์•„๋‹˜์„ ๋ช…์‹ฌํ•˜์ž.

- ์ด๋Ÿฐ ํ˜•ํƒœ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฐ˜๋“œ์‹œ ๊ธฐ์กด ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋ง๊ฐ€๋œจ๋ฆฌ๊ฒŒ ๋œ๋‹ค.

ยท ์ƒˆ๋กœ์šด ์ธํ„ฐํŽ˜์ด์Šค๋ผ๋ฉด ๋ฆด๋ฆฌ์Šค ์ „ ๋ฐ˜๋“œ์‹œ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์น˜์ž.

- ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ตœ์†Œํ•œ ์„ธ ๊ฐ€์ง€๋Š” ๊ตฌํ˜„ํ•˜์ž.

- ๊ฐ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋‹ค์–‘ํ•œ ์ž‘์—…์— ํ™œ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๋„ ์—ฌ๋Ÿฌ ๊ฐœ ๋งŒ๋“ค์–ด๋ณด์ž.

- ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฆด๋ฆฌ์Šคํ•œ ํ›„๋ผ๋„ ๊ฒฐํ•จ์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒŒ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๋กœ ์žˆ๊ฒ ์ง€๋งŒ, ์ ˆ๋Œ€ ๊ทธ ๊ฐ€๋Šฅ์„ฑ์— ๊ธฐ๋Œ€์„œ๋Š” ์•ˆ ๋œ๋‹ค.

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


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

- ํด๋ž˜์Šค๊ฐ€ ์–ด๋–ค ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์ž์‹ ์˜ ์ธ์Šคํ„ด์Šค๋กœ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ์–˜๊ธฐํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง€์นจ์— ๋งž์ง€ ์•Š๊ฒŒ ์‚ฌ์šฉํ•œ ์˜ˆ์‹œ - ์ƒ์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค

ยท ์ƒ์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค๋ž€ ๋ฉ”์„œ๋“œ ์—†์ด, ์ƒ์ˆ˜๋ฅผ ๋œปํ•˜๋Š” static final ํ•„๋“œ๋กœ๋งŒ ๊ฐ€๋“ ์ฐฌ ์ธํ„ฐํŽ˜์ด์Šค๋‹ค.

- ์ด ์ƒ์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ํด๋ž˜์Šค์—์„œ๋Š” ์ •๊ทœํ™”๋œ ์ด๋ฆ„(qualified name)์„ ์“ฐ๋Š” ๊ฑธ ํ”ผํ•˜๊ณ ์ž ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

public interface PhysicalConstants {
    // ์•„๋ณด๊ฐ€๋“œ๋กœ ์ˆ˜ (1/๋ชฐ)
    static final double AVOGADRO_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๋กœ ๋…ธ์ถœํ•˜๋Š” ํ–‰์œ„๋‹ค.

- ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๊ฐ€ ๋‚ด๋ถ€ ๊ตฌํ˜„์— ํ•ด๋‹นํ•˜๋Š” ์ด ์ƒ์ˆ˜๋“ค์— ์ข…์†๋  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์—์„œ ์ด ์ƒ์ˆ˜๋“ค์„ ๋” ์“ฐ์ง€ ์•Š๊ฒŒ ๋˜๋”๋ผ๋„ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ์—ฌ์ „ํžˆ ์ƒ์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.

- final์ด ์•„๋‹Œ ํด๋ž˜์Šค๊ฐ€ ์ƒ์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด, ๋ชจ๋“  ํ•˜์œ„ ํด๋ž˜์Šค์˜ ์ด๋ฆ„ ๊ณต๊ฐ„์ด ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ •์˜ํ•œ ์ƒ์ˆ˜๋“ค๋กœ ์˜ค์—ผ๋˜์–ด ๋ฒ„๋ฆฐ๋‹ค.

ยท ์ž๋ฐ” ํ”Œ๋žซํผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž˜๋ชป ํ™œ์šฉํ•œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ช‡ ๊ฐœ ์žˆ๋‹ค. ex) java.io.ObjectStreamConstants

์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ƒ์ˆ˜๋ฅผ ๊ณต๊ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•

ยท ํŠน์ • ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ฐ•ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋œ ์ƒ์ˆ˜๋ผ๋ฉด ๊ทธ ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค ์ž์ฒด์— ์ถ”๊ฐ€ํ•œ๋‹ค.

ex) Integer์™€ Double์— ์„ ์–ธ๋œ MIN_VALUE, MAX_VALUE

ยท ์—ด๊ฑฐ ํƒ€์ž…์œผ๋กœ ๋‚˜ํƒ€๋‚ด๊ธฐ ์ ํ•ฉํ•œ ์ƒ์ˆ˜๋ผ๋ฉด, ์—ด๊ฑฐํƒ€์ž…์œผ๋กœ ๋งŒ๋“ค์–ด ๊ณต๊ฐœํ•œ๋‹ค(์•„์ดํ…œ34).

ยท ์ธ์Šคํ„ด์Šคํ™”ํ•  ์ˆ˜ ์—†๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค(์•„์ดํ…œ4)์— ๋‹ด์•„ ๊ณต๊ฐœํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

public class PhysicalConstants {
    
    private PhysicalConstants(){};  //์ธ์Šคํ„ด์Šคํ™” ๋ฐฉ์ง€
    
    //์•„๋ณด๊ฐ€๋„๋ฅด ์ˆ˜(1/๋ชฐ)
    public static final double AVOGADROS_NUMBER = 6.002_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. ํƒœ๊ทธ ๋‹ฌ๋ฆฐ ํด๋ž˜์Šค๋ณด๋‹ค๋Š” ํด๋ž˜์Šค ๊ณ„์ธต๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•˜๋ผ


ยท ํƒœ๊ทธ ๋‹ฌ๋ฆฐ ํด๋ž˜์Šค๋Š” ๋‹จ์ ์ด ํ•œ๊ฐ€๋“์ด๋‹ค.

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

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

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

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

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

5. ์ƒ์„ฑ์ž๊ฐ€ ํƒœ๊ทธ ํ•„๋“œ๋ฅผ ์„ค์ •ํ•˜๊ณ  ํ•ด๋‹น ์˜๋ฏธ์— ์“ฐ์ด๋Š” ๋ฐ์ดํ„ฐ ํ•„๋“œ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋„์™€์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฑด ๋ณ„๋กœ ์—†๋‹ค.

- ์—‰๋šฑํ•œ ํ•„๋“œ๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด๋„ ๋Ÿฐํƒ€์ž„์— ๋ฌธ์ œ๊ฐ€ ๋“œ๋Ÿฌ๋‚œ๋‹ค.

6. ๋‹ค๋ฅธ ์˜๋ฏธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.

- ์ƒˆ๋กœ์šด ์˜๋ฏธ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ๋ชจ๋“  switch ๋ฌธ์— ์ƒˆ ์˜๋ฏธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•˜๊ณ , ์‹ค์ˆ˜๋กœ ๋น ๋œจ๋ฆฌ๋ฉด ๋Ÿฐํƒ€์ž„์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

7. ์ธ์Šคํ„ด์Šค์˜ ํƒ€์ž…๋งŒ์œผ๋กœ ํ˜„์žฌ ๋‚˜ํƒ€๋‚ด๋Š ์˜๋ฏธ๋ฅผ ์•Œ ์ˆ˜ ์—†๋‹ค.

* ์š”์•ฝ: ํƒœ๊ทธ ๋‹ฌ๋ฆฐ ํด๋ž˜์Šค๋Š” ์žฅํ™ฉํ•˜๊ณ , ์˜ค๋ฅ˜๋ฅผ ๋‚ด๊ธฐ ์‰ฝ๊ณ , ๋น„ํšจ์œจ์ ์ด๋‹ค.

// ํƒœ๊ทธ ๋‹ฌ๋ฆฐ ํด๋ž˜์Šค ์˜ˆ์‹œ
class Figure {
    enum Shape { RECTANGLE, CIRCLE };
    
    // ํƒœ๊ทธ ํ•„๋“œ - ํ˜„์žฌ ๋ชจ์–‘์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
    final Shape shape;
    
    // ๋‹ค์Œ ํ•„๋“œ๋“ค์€ ๋ชจ์–‘์ด ์‚ฌ๊ฐํ˜•์ผ ๋•Œ๋งŒ ์“ฐ์ธ๋‹ค.
    double length;
    double width;
    
    // ๋‹ค์Œ ํ•„๋“œ๋Š” ๋ชจ์–‘์ด ์›์ผ ๋•Œ๋งŒ ์“ฐ์ธ๋‹ค.
    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);
        }
    }

ํƒœ๊ทธ ๋‹ฌ๋ฆฐ ํด๋ž˜์Šค์˜ ๋Œ€์•ˆ: ์„œ๋ธŒํƒ€์ดํ•‘

ยท ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด๋Š” ํƒ€์ž… ํ•˜๋‚˜๋กœ ๋‹ค์–‘ํ•œ ์˜๋ฏธ ๊ฐ์ฒด๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ํ›จ์”ฌ ๋‚˜์€ ์ˆ˜๋‹จ์„ ์ œ๊ณตํ•œ๋‹ค.

๋ฐ”๋กœ ํด๋ž˜์Šค ๊ณ„์ธต๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•˜๋Š” ์„œ๋ธŒํƒ€์ดํ•‘์ด๋‹ค.

- ์„œ๋ธŒ ํƒ€์ดํ•‘(subtyping): ํƒ€์ž… ๊ณ„์ธต์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์†์„ ์‚ฌ์šฉ.

- ์„œ๋ธŒ ํด๋ž˜์‹ฑ(subclassing): ๋‹ค๋ฅธ ํด๋ž˜์Šค ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋ชฉ์ ์œผ๋กœ ์ƒ์†์„ ์‚ฌ์šฉ.

ยท ํƒœ๊ทธ ๋‹ฌ๋ฆฐ ํด๋ž˜์Šค๋ฅผ ํด๋ž˜์Šค ๊ณ„์ธต๊ตฌ์กฐ๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•:

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

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

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

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

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

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; }
}

ยท ์œ„์˜ ํด๋ž˜์Šค ๊ณ„์ธต๊ตฌ์กฐ์˜ ์žฅ์ :

1. ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•˜๊ณ , ๋ช…ํ™•ํ•˜๋‹ค.

2. ์“ธ๋ฐ์—†๋Š” ์ฝ”๋“œ๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค.

- ๊ฐ์˜๋ฏธ๋ฅผ ๋…๋ฆฝ๋œ ํด๋ž˜์Šค์— ๋‹ด์•„ ๊ด€๋ จ ์—†๋˜ ๋ฐ์ดํ„ฐ ํ•„๋“œ๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐ

3. ๊ฐ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๊ฐ€ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ๋‚จ๊น€์—†์ด ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋‘ ๊ตฌํ˜„ํ—€๋Š”์ง€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ™•์ธํ•ด์ค€๋‹ค.

4. ์‹ค์ˆ˜๋กœ ๋นผ๋จน์€ case๋ฌธ ๋–„๋ฌธ์— ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ผ์ด ์—†๋‹ค.

5. ๋ฃจํŠธ ํด๋ž˜์Šค์˜ ์ฝ”๋“œ๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ ๋„ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์ด ๋…๋ฆฝ์ ์œผ๋กœ ๊ณ„์ธต๊ตฌ์กฐ๋ฅผ ํ™•์žฅํ•˜๊ณ  ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

6. ํƒ€์ž…์ด ์˜๋ฏธ๋ณ„๋กœ ๋”ฐ๋กœ ์กด์žฌํ•˜์—ฌ ๋ณ€์ˆ˜์˜ ์˜๋ฏธ๋ฅผ ๋ช…์‹œํ•˜๊ฑฐ๋‚˜ ์ œํ•œํ•  ์ˆ˜ ์žˆ๊ณ , ํŠน์ • ์˜๋ฏธ๋งŒ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

7. ํƒ€์ž… ์‚ฌ์ด์˜ ์ž์—ฐ์Šค๋Ÿฌ์šด ๊ณ„์ธต ๊ด€๊ณ„๋ฅผ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ์–ด์„œ ์œ ์—ฐ์„ฑ์€ ๋ฌผ๋ก  ์ปดํŒŒ์ผํƒ€์ž„ ํƒ€์ž… ๊ฒ€์‚ฌ ๋Šฅ๋ ฅ์„ ๋†’์—ฌ์ค€๋‹ค.

ex) ํด๋ž˜์Šค ๊ณ„์ธต๊ตฌ์กฐ์—์„œ ์ •์‚ฌ๊ฐํ˜•์ด ์‚ฌ๊ฐํ˜•์˜ ํŠน๋ณ„ํ•œ ํ˜•ํƒœ์ž„์„ ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

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


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

- ์ค‘์ฒฉ ํด๋ž˜์Šค(nested class): ๋‹ค๋ฅธ ํด๋ž˜์Šค์•ˆ์— ์ •์˜๋œ ํด๋ž˜์Šค

ยท ์ค‘์ฒฉ ํด๋ž˜์Šค๋Š” ์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค, (๋น„์ •์ ) ๋ฉค๋ฒ„ ํด๋ž˜์Šค, ์ต๋ช… ํด๋ž˜์Šค, ์ง€์—ญ ํด๋ž˜์Šค ๋„ค ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ๊ฐ๊ฐ์€ ์“ฐ์ž„์ด ๋‹ค๋ฅด๋‹ค.

- ์ด ์ค‘ ์ฒซ ๋ฒˆ์งธ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€๋Š” ๋‚ด๋ถ€ ํด๋ž˜์Šค(inner class)์— ํ•ด๋‹นํ•œ๋‹ค.

์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค์™€ ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค

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

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

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

ยท ์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋Š” ํ”ํžˆ ๋ฐ”๊นฅ ํด๋ž˜์Šค์™€ ํ•จ๊ป˜ ์“ฐ์ผ ๋•Œ๋งŒ ์œ ์šฉํ•œ public ๋„์šฐ๋ฏธ ํด๋ž˜์Šค๋กœ ์“ฐ์ธ๋‹ค.

ex) ๊ณ„์‚ฐ๊ธฐ๊ฐ€ ์ง€์›ํ•˜๋Š” ์—ฐ์‚ฐ ์ข…๋ฅ˜๋ฅผ ์ •์˜ํ•˜๋Š” Operation ์—ด๊ฑฐ ํƒ€์ž…์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ž. Operation ์—ด๊ฑฐ ํƒ€์ž…์€ Calculator ํด๋ž˜์Šค์˜ public ์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๊ฐ€ ๋˜์–ด Calculator ํด๋ผ์ด์–ธํŠธ์—์„œ Calculator.Operation.Plus ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์›ํ•˜๋Š” ์—ฐ์‚ฐ์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

ยท ์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค์™€ ๋น„์ •์  ๋ฉค๋ฒ„ํด๋ž˜์Šค์˜ ๊ตฌ๋ฌธ์ƒ ์ฐจ์ด๋Š” ๋‹จ์ง€ static์ด ๋ถ™์–ด ์žˆ๊ณ  ์—†๊ณ  ๋ฟ์ด์ง€๋งŒ, ์˜๋ฏธ์ƒ ์ฐจ์ด๋Š” ํฌ๋‹ค.

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

- ์ด ๊ด€๊ณ„ ์ •๋ณด๋Š” ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ์•ˆ์— ๋งŒ๋“ค์–ด์ ธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๋ฉฐ, ์ƒ์„ฑ ์‹œ๊ฐ„๋„ ๋” ๊ฑธ๋ฆฐ๋‹ค.

- ์ด ๊ด€๊ณ„๋Š” ๋ฉค๋ฒ„ ํด๋ž˜์Šค๊ฐ€ ์ธ์Šคํ„ด์Šคํ™”๋  ๋•Œ ํ™•๋ฆฝ๋˜๋ฉฐ, ๋” ์ด์ƒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

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

ยท ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋Š” ์–ด๋Œ‘ํ„ฐ[Gamma95]๋ฅผ ์ •์˜ํ•  ๋•Œ ์ž์ฃผ ์“ฐ์ธ๋‹ค.

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

ex) Map ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด๋“ค์€ ๋ณดํ†ต (keySet, entrySet, values ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š”)์ž์‹ ์˜ ์ปฌ๋ ‰์…˜ ๋ทฐ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. Set๊ณผ List ๊ฐ™์€ ๋‹ค๋ฅธ ์ปฌ๋ ‰์…˜ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„๋“ค๋„ ์ž์‹ ์˜ ๋ฐ˜๋ณต์ž๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

public class MySet<E> extends AbstractSet<E> {
    ... // ์ƒ๋žต
    
    @Override public Iterator<E> iterator() {
        return new MyIterator();
    }
    
    private class MyIterator implements Iterator<E> {
        ...
    }
    }

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

- static์„ ์ƒ๋žตํ•˜๋ฉด ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค๋กœ์˜ ์ˆจ์€ ์™ธ๋ถ€ ์ฐธ์กฐ๋ฅผ ๊ฐ–๊ฒŒ๋œ๋‹ค. ์ด ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•˜๋ ค๋ฉด ์‹œ๊ฐ„๊ณผ ๊ณต๊ฐ„์ด ์†Œ๋น„๋œ๋‹ค. ๋” ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ๋ฐ”๊นฅ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ˆ˜๊ฑฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.

ยท private ์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋Š” ํ”ํžˆ ๋ฐ”๊นฅ ํด๋ž˜์Šค๊ฐ€ ํ‘œํ˜„ํ•˜๋Š” ๊ฐ์ฒด์˜ ํ•œ ๋ถ€๋ถ„์„ ๋‚˜ํƒ€๋‚ผ ๋•Œ ์“ด๋‹ค.

ex) ๋งŽ์€ Map ๊ตฌํ˜„์ฒด๋Š” ๊ฐ๊ฐ์˜ ํ‚ค-๊ฐ’ ์Œ์„ ํ‘œํ˜„ํ•˜๋Š” ์—”ํŠธ๋ฆฌ ๊ฐ์ฒด๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๋ชจ๋“  ์—”ํŠธ๋ฆฌ๊ฐ€ ๋งต๊ณผ ์—ฐ๊ด€๋˜์–ด ์žˆ์ง€๋งŒ, ์—”ํŠธ๋ฆฌ์˜ ๋ฉ”์„œ๋“œ๋“ค(getKey, getValue, setValue)์€ ๋งต์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ์—”ํŠธ๋ฆฌ๋ฅผ ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๋‚ญ๋น„๊ณ , private ์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๊ฐ€ ๊ฐ€์žฅ ์•Œ๋งž๋‹ค. TODO: ์ดํ•ด๊ฐ€....

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

ยท ์ต๋ช… ํด๋ž˜์Šค๋Š” ์ด๋ฆ„์ด ์—†๊ณ , ๋ฉค๋ฒ„์™€ ๋‹ฌ๋ฆฌ ์“ฐ์ด๋Š” ์‹œ์ ์— ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ธ์Šคํ„ด์Šค๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.

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

public class NestedClass {
    private Integer outerClassInstance;
    public static Integer constant = 100_000;
    
    public void nonStaticMethod(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("๋น„์ •์ ๋ฌธ๋งฅ ๋ฉ”์†Œ๋“œ์—์„œ ๋ฐ”๊นฅ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค ์ฐธ์กฐ ๊ฐ€๋Šฅ:" + outerClassInstance);
                System.out.println("๋น„์ •์ ๋ฌธ๋งฅ ๋ฉ”์†Œ๋“œ์—์„œ ์ƒ์ˆ˜ ์ฐธ์กฐ ๊ฐ€๋Šฅ:" + constant);
            }
        });
    }
    
    public static void staticMethod() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                //์ปดํŒŒ์ผ ์˜ค๋ฅ˜   System.out.println("์ •์ ๋ฌธ๋งฅ ๋ฉ”์†Œ๋“œ์—์„œ ๋ฐ”๊นฅ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค ์ฐธ์กฐ ๋ถˆ๊ฐ€๋Šฅ:" + outerClassInstance);
                System.out.println("์ •์ ๋ฌธ๋งฅ ๋ฉ”์†Œ๋“œ์—์„œ ๋ฐ”๊นฅ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค ์ƒ์ˆ˜ ์ฐธ์กฐ ๊ฐ€๋Šฅ:" + constant);
            }
        });
    }
}

ยท ์ต๋ช… ํด๋ž˜์Šค๋Š” ์‘์šฉํ•˜๋Š” ๋ฐ ์ œ์•ฝ์ด ๋งŽ๋‹ค.

1. ์„ ์–ธํ•œ ์ง€์ ์—์„œ๋งŒ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

2. instanceof ๊ฒ€์‚ฌ๋‚˜ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์ด ํ•„์š”ํ•œ ์ž‘์—…์€ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋‹ค.

3. ์—ฌ๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๋‹ค.

4. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋™์‹œ์— ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•  ์ˆ˜ ์—†๋‹ค.

5. ์ต๋ช… ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๋Š” ๊ทธ ์ต๋ช… ํด๋ž˜์Šค๊ฐ€ ์ƒ์œ„ ํƒ€์ž…์—์„œ ์ƒ์†ํ•œ ๋ฉค๋ฒ„ ์™ธ์—๋Š” ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค.

6. ํ‘œํ˜„์‹ ์ค‘๊ฐ„์— ๋“ฑ์žฅํ•˜๋ฏ€๋กœ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง„๋‹ค.

ยท ์ž๋ฐ”๊ฐ€ ๋žŒ๋‹ค๋ฅผ ์ง€์›ํ•˜๊ธฐ ์ „์—๋Š” ์ฆ‰์„ฑ์—์„œ ์ž‘์€ ํ•จ์ˆ˜ ๊ฐ์ฒด๋‚˜ ์ฒ˜๋ฆฌ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์ฃผ๋กœ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ, ์ด์ œ ๋žŒ๋‹ค์—๊ฒŒ ๊ทธ ์ž๋ฆฌ๋ฅผ ๋ฌผ๋ ค์คฌ๋‹ค.

ยท ์ต๋ช… ํด๋ž˜์Šค๋Š” ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

static List<Integer> intArrayAsList(int[] a) {
    Objects.requireNonNull(a);
    
    return new AbtractList<Integer>() {
        @Override public Integer get(int i) {
            return a[i]; // ์˜คํ† ๋ฐ•์‹ฑ
        }
        
        @Override public Integer set(int i, Integer val) {
            int oldVal = a[i];
            a[i] = val; // ์–ธ๋ฐ•์‹ฑ
            return oldVal; // ์˜คํ† ๋ฐ•์‹ฑ
        }
        
        @Ovveride public int size() {
            return a.length;
        }
    }
    }

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

ยท ์ง€์—ญ ํด๋ž˜์Šค๋Š” ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด๋ฉด, ์‹ค์งˆ์ ์œผ๋กœ ์–ด๋””์„œ๋“  ์„ ์–ธํ•  ์ˆ˜ ์žˆ๊ณ , ์œ ํšจ ๋ฒ”์œ„๋„ ์ง€์—ญ๋ณ€์ˆ˜์™€ ๊ฐ™๋‹ค.

ยท ๋„ค ๊ฐ€์ง€ ์ค‘์ฒฉ ํด๋ž˜์Šค ์ค‘ ๊ฐ€์žฅ ๋“œ๋ฌผ๊ฒŒ ์‚ฌ์šฉ๋œ๋‹ค.

ยท ๋‹ค๋ฅธ ์„ธ ์ค‘์ฒฉ ํด๋ž˜์Šค์™€ ๊ณตํ†ต์ ์„ ํ•˜๋‚˜์”ฉ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

- ๋ฉค๋ฒ„ ํด๋ž˜์Šค์ฒ˜๋Ÿผ ์ด๋ฆ„์ด ์žˆ๊ณ , ๋ฐ˜๋ณตํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

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

์ƒํ™ฉ์— ๋”ฐ๋ผ ์‚ฌ์šฉํ•  ์ค‘์ฒฉ ํด๋ž˜์Šค ์„ ํƒํ•˜๊ธฐ

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

ยท ๋ฉค๋ฒ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๊ฐ๊ฐ์ด ๋ฐ”๊ฐ™ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•œ๋‹ค๋ฉด ๋น„์ •์ ์œผ๋กœ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ •์ ์œผ๋กœ ๋งŒ๋“ ๋‹ค.

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

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


ยท ์†Œ์Šค ํŒŒ์ผ ํ•˜๋‚˜์— ํ†ฑ๋ ˆ๋ฒจ ํด๋ž˜์Šค๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์„ ์–ธํ•ด๋„ ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ถˆํ‰ํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ ์•„๋ฌด๋Ÿฐ ๋“์ด ์—†๊ณ , ์‹ฌ๊ฐํ•œ ์œ„ํ—˜์„ ๊ฐ์ˆ˜ํ•ด์•ผ ํ•˜๋Š” ํ–‰์œ„๋‹ค.

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

ํ•˜๋‚˜์˜ ์†Œ์Šค ํŒŒ์ผ์— ๋‘ ๊ฐœ์˜ ํ†ฑ๋ ˆ๋ฒจ ํด๋ž˜์Šค๊ฐ€ ์ •์˜๋œ ์˜ˆ์‹œ

๋‹ค๋ฅธ ํ†ฑ๋ ˆ๋ฒจ ํด๋ž˜์Šค 2๊ฐœ(Utensil, Dssert)๋ฅผ ์ฐธ์กฐํ•˜๋Š” Main ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

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

Utensil๊ณผ Dessert ํด๋ž˜์Šค๋Š” Utensil.java๋ผ๋Š” ํ•œ ํŒŒ์ผ์— ์ •์˜๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

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

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

Main์„ ์‹คํ–‰ํ•˜๋ฉด pancake๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ์ด๋•Œ, ์šฐ์—ฐํžˆ ๋˜‘๊ฐ™์€ ๋‘ ํด๋ž˜์Šค๋ฅผ ๋‹ด์€ Dessert.java๋ผ๋Š” ํŒŒ์ผ์„ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

class Utensil {
    static final String NAME = "pot";
}

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

์šด ์ข‹๊ฒŒ javac Main.java Desert.java ๋ช…๋ น์œผ๋กœ ์ปดํŒŒ์ผํ•œ๋‹ค๋ฉด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๊ณ , Utensil๊ณผ Dessert ํด๋ž˜์Šค๋ฅผ ์ค‘๋ณต ์ •์˜ํ—€๋‹ค๊ณ  ์•Œ๋ ค์ค„ ๊ฒƒ์ด๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ฐ€์žฅ ๋จผ์ € Main.java๋ฅผ ์ปดํŒŒ์ผํ•˜๊ณ , ๊ทธ ์•ˆ์—์„œ Utensil ์ฐธ์กฐ๋ฅผ ๋งŒ๋‚˜๋ฉด Utensil.java ํŒŒ์ผ์„ ์‚ดํŽด Utensil๊ณผ Dessert๋ฅผ ๋ชจ๋‘ ์ฐพ์•„๋‚ผ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋‘ ๋ฒˆ์งธ ๋ช…๋ น์ค„ ์ธ์ˆ˜๋กœ ๋„˜์–ด์˜จ Dessert.java๋ฅผ ์ฒ˜๋ฆฌํ•ณ๋ ค ํ•  ๋•Œ ๊ฐ™์€ ํด๋ž˜์Šค์˜ ์ •์˜๊ฐ€ ์ด๋ฏธ ์žˆ์Œ์„ ์•Œ๊ฒŒ ๋œ๋‹ค.

ํ•œํŽธ, javac Main.java๋‚˜ javac Main.java Utensil.java ๋ช…๋ น์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋ฉด Dessert.java ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๊ธฐ ์ „์ฒ˜๋Ÿผ pancake๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ javac Dessert.java Main.java ๋ช…๋ น์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋ฉด potpie๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

* ์ด ์ฒ˜๋Ÿผ ์ปดํŒŒ์ผ๋Ÿฌ์— ์–ด๋Š ์†Œ์Šค ํŒŒ์ผ์„ ๋จผ์ € ๊ฑด๋„ค๋Š๋ƒ์— ๋”ฐ๋ผ ๋™์ž‘์ด ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ, ๋ฐ˜๋“œ์‹œ ๋ฐ”๋กœ ์žก์•„์•ผํ•  ๋ฌธ์ œ๋‹ค.

ํ•ด๊ฒฐ์ฑ…1

ยท ํ†ฑ๋ ˆ๋ฒจ ํด๋ž˜์Šค๋“ค์„ ์„œ๋กœ ๋‹ค๋ฅธ ์†Œ์Šค ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค.

ํ•ด๊ฒฐ์ฑ…2

ยท ํ†ฑ๋ ˆ๋ฒจ ํด๋ž˜์Šค๋ฅผ ํ•œ ํŒŒ์ผ์— ๋‹ด๊ณ  ์‹ถ๋‹ค๋ฉด, ์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค(์•„์ดํ…œ 24)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ฏผํ•œ๋‹ค.

- ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ๋”ธ๋ฆฐ ๋ถ€์ฐจ์ ์ธ ํด๋ž˜์Šค๋ผ๋ฉด ์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋กœ ๋งŒ๋“œ๋Š” ์ชฝ์ด ์ผ๋ฐ˜์ ์œผ๋กœ ๋” ๋‚ซ๋‹ค.

- ์ฝ๊ธฐ ์ข‹๊ณ , private์œผ๋กœ ์„ ์–ธํ•˜๋ฉด(์•„์ดํ…œ 15) ์ ‘๊ทผ ๋ฒ”์œ„๋„ ์ตœ์†Œ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

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";
    }
}

Last updated