item 15 dodo4513 - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

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

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

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

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

์ •๋ณด์€๋‹‰ ์ง€ํ‚ค๊ธฐ

  • ๊ธฐ๋ณธ ์›์น™์€ ๊ฐ„๋‹จํ•˜๋‹ค. ๋ชจ๋“  ํด๋ž˜์Šค์™€ ๋ฉค๋ฒ„์˜ ์ ‘๊ทผ์„ฑ์„ ๊ฐ€๋Šฅํ•œ ํ•œ ์ขํ˜€์•ผ ํ•œ๋‹ค. ๋‹ฌ๋ฆฌ ๋งํ•˜๋ฉด, ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์˜ฌ๋ฐ”๋กœ ๋™์ž‘ํ•˜๋Š” ํ•œ ํ•ญ์ƒ ๊ฐ€์žฅ ๋‚ฎ์€ ์ ‘๊ทผ ์ˆ˜์ค€์„ ๋ถ€์—ฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.
  • ํ†ฑ๋ ˆ๋ฒจ ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ public์œผ๋กœ ์„ ์–ธํ•˜๋ฉด ๊ณต๊ฐœ API๊ฐ€ ๋˜๋ฉฐ, package-private์œผ๋กœ ์„ ์–ธํ•˜๋ฉด ํ•ด๋‹น ํŒจํ‚ค์ง€ ์•ˆ์—์„œ๋งŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํŒจํ‚ค์ง€ ์™ธ๋ถ€์—์„œ ์“ธ ์ด์œ ๊ฐ€ ์—†๋‹ค๋ฉด package private์œผ๋กœ ์„ ์–ธํ•˜์ž.
  • ํด๋ž˜์Šค์˜ ๊ณต๊ฐœ API๋ฅผ ์„ธ์‹ฌํžˆ ์„ค๊ณ„ํ•œ ํ›„, ๊ทธ ์™ธ์˜ ๋ชจ๋“  ๋ฉค๋ฒ„๋Š” private์œผ๋กœ ๋งŒ๋“ค์ž. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์˜ค์ง ๊ฐ™์€ ํŒจํ‚ค์ง€์˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค๊ฐ€ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š” ๋ฉค๋ฒ„์— ํ•œํ•˜์—ฌ (private ์ œํ•œ์ž๋ฅผ ์ œ๊ฑฐํ•ด) package-private์œผ๋กœ ํ’€์–ด์ฃผ์ž.
  • public ํด๋ž˜์Šค์˜ protected ๋ฉค๋ฒ„๋Š” ๊ณต๊ฐœ API์ด๋ฏ€๋กœ ์˜์›ํžˆ ์ง€์›๋ผ์•ผ ํ•œ๋‹ค. ๋˜ํ•œ ๋‚ด๋ถ€ ๋™์ž‘ ๋ฐฉ์‹์„ API ๋ฌธ์„œ์— ์ ์–ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ณต๊ฐœํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค(์•„์ดํ…œ 19). ๋”ฐ๋ผ์„œ protected ๋ฉค๋ฒ„์˜ ์ˆ˜๋Š” ์ ์„์ˆ˜๋ก ์ข‹๋‹ค.
  • public ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ํ•„๋“œ๋Š” ๋˜๋„๋ก public์ด ์•„๋‹ˆ์–ด์•ผ ํ•œ๋‹ค ํ•„๋“œ๊ฐ€ ๊ฐ€๋ณ€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜, final์ด ์•„๋‹Œ ์ธ์Šคํ„ด์Šค ํ•„๋“œ๋ฅผ public์œผ๋กœ ์„ ์–ธํ•˜๋ฉด ๊ทธ ํ•„๋“œ์— ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ์ œํ•œํ•  ํž˜์„ ์žƒ๊ฒŒ ๋œ๋‹ค. ๋˜ํ•œ public ๊ฐ€๋ณ€ ํ•„๋“œ๋ฅผ ๊ฐ–๋Š” ํด๋ž˜์Šค๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค.

์ž๋ฐ”9 ๋ชจ๋“ˆ

  • ์ž๋ฐ” 9์—์„œ๋Š” ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ด๋ผ๋Š” ๊ฐœ๋…์ด ๋„์ž…๋˜๋ฉด์„œ ๋‘ ๊ฐ€์ง€ ์•”๋ฌต์  ์ ‘๊ทผ ์ˆ˜์ค€์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. ํŒจํ‚ค์ง€๊ฐ€ ํด๋ž˜์Šค๋“ค์˜ ๋ฌถ์Œ์ด๋“ฏ, ๋ชจ๋“ˆ์€ ํŒจํ‚ค์ง€๋“ค์˜ ๋ฌถ์Œ์ด๋‹ค.
  • ๋ชจ๋“ˆ์€ ์ž์‹ ์— ์†ํ•˜๋Š” ํŒจํ‚ค์ง€ ์ค‘ ๊ณต๊ฐœ(export)ํ•  ๊ฒƒ๋“ค์„ (๊ด€๋ก€์ƒ moduleinfo.java ํŒŒ์ผ์—) ์„ ์–ธํ•œ๋‹ค.
  • protected ํ˜น์€ public ๋ฉค๋ฒ„๋ผ๋„ ํ•ด๋‹น ํŒจํ‚ค์ง€๋ฅผ ๊ณต๊ฐœํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋ชจ๋“ˆ ์™ธ๋ถ€์—์„œ๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค. ๋ฌผ๋ก  ๋ชจ๋“ˆ ์•ˆ์—์„œ๋Š” exports๋กœ ์„ ์–ธํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€์— ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ๋„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.
  • ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ํ™œ์šฉํ•˜๋ฉด ํด๋ž˜์Šค๋ฅผ ์™ธ๋ถ€์— ๊ณต๊ฐœํ•˜์ง€ ์•Š์œผ๋ฉด์„œ๋„ ๊ฐ™์€ ๋ชจ๋“ˆ์„ ์ด๋ฃจ๋Š” ํŒจํ‚ค์ง€ ์‚ฌ์ด์—์„œ๋Š” ์ž์œ ๋กญ๊ฒŒ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค

ํ•ต์‹ฌ์ •๋ฆฌ

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

โš ๏ธ **GitHub.com Fallback** โš ๏ธ