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

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

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

์ •๋ณด ์€๋‹‰, ์บก์Šํ™”

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

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

์ž๋ฐ”์—์„œ ์ œ๊ณตํ•˜๋Š” ์ •๋ณด ์€๋‹‰

  • ์ ‘๊ทผ ์ œ์–ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค, ๋ฉค๋ฒ„์˜ ์ ‘๊ทผ์„ฑ(์ ‘๊ทผ ํ—ˆ์šฉ ๋ฒ”์œ„)์„ ๋ช…์‹œํ•œ๋‹ค.
  • Object์˜ protected ๋ฉ”์„œ๋“œ์ธ clone์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•œ๋‹ค.
  • ์ ‘๊ทผ ์ œํ•œ์ž๋ฅผ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ •๋ณด ์€๋‹‰์˜ ํ•ต์‹ฌ

์ ‘๊ทผ ์ œํ•œ์ž ๊ธฐ๋ณธ ์›์น™

๋ชจ๋“  ํด๋ž˜์Šค์™€ ๋ฉค๋ฒ„์˜ ์ ‘๊ทผ์„ฑ์„ ๊ฐ€๋Šฅํ•œ ํ•œ ์ขํ˜€์•ผ ํ•œ๋‹ค.

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

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

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

๋ฉค๋ฒ„ ์ ‘๊ทผ์„ฑ์„ ์ขํžˆ์ง€ ๋ชปํ•˜๊ฒŒ ๋ฐฉํ•ดํ•˜๋Š” ์ œ์•ฝ

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

ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค, ๋ฉค๋ฒ„์˜ ์ ‘๊ทผ ๋ฒ”์œ„๋ฅผ ๋„“ํžˆ๋ คํ•  ๋•Œ

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

public ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ํ•„๋“œ๋Š” ๋˜๋„๋ก public์ด ์•„๋‹ˆ์–ด์•ผ ํ•œ๋‹ค.

  • ํ•„๋“œ๊ฐ€ ๊ฐ€๋ณ€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ final์ด ์•„๋‹Œ ์ธ์Šคํ„ด์Šค ํ•„๋“œ๋ฅผ public์œผ๋กœ ์„ ์–ธํ•˜๋ฉด ๊ทธ ํ•„๋“œ์— ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ์ œํ•œํ•  ํž˜์„ ์žƒ๊ฒŒ๋จ
  • ํ•„๋“œ์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ๊ฒƒ์€ ๋ถˆ๋ณ€์‹์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜๋ฏ€๋กœ ํ•„๋“œ๊ฐ€ ์ˆ˜์ •๋  ๋•Œ(๋ฝ ํš๋“) ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜๋จ

public ๊ฐ€๋ณ€ ํ•„๋“œ๋ฅผ ๊ฐ–๋‹ค ๋ถ™์ด๋Š” ํด๋ž˜์Šค๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค. ์ •์  ํ•„๋“œ์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€ ์ž„

์ƒ์ˆ˜๋Š” ๊ณต๊ฐœ ๊ฐ€๋Šฅ

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

๊ธธ์ด๊ฐ€ 0์ด ์•„๋‹Œ ๋ฐฐ์—ด์€ ๋ชจ๋‘ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ

  • ํด๋ž˜์Šค์—์„œ public satic final ๋ฐฐ์—ด ํ•„๋“œ๋ฅผ ๋‘๊ฑฐ๋‚˜ ์ด ํ•„๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ ‘๊ทผ์ž ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ทธ ๋ฐฐ์—ด์˜ ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฏ€๋กœ ๋ณด์•ˆ ํ—ˆ์ ์ด ๋ฐœ์ƒ.
public static final Thing[] VALUES = { };

ํ•ด๊ฒฐ์ฑ… 1

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

ํ•ด๊ฒฐ์ฑ… 2

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

์ž๋ฐ” 9 ๋ชจ๋“ˆ ์‹œ์Šคํ…œ

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

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

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

์ ‘๊ทผ ๋ณดํ˜ธ ๋ฐฉ์‹๊ณผ ๋ชจ๋“ˆ

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

ํ•ต์‹ฌ ์ •๋ฆฌ

public์ผ ํ•„์š”๊ฐ€ ์—†๋Š” ํด๋ž˜์Šค์˜ ์ ‘๊ทผ ์ˆ˜์ค€์„ package-private ํ†ฑ๋ ˆ๋ฒจ ํด๋ž˜์Šค๋กœ ์ขํžŒ๋‹ค. public ํด๋ž˜์Šค๋Š” ๊ทธ ํŒจํ‚ค์ง€์˜ API์ธ ๋ฐ˜๋ฉด package-private ํ†ฑ๋ ˆ๋ฒจ ํด๋ž˜์Šค๋Š” ๋‚ด๋ถ€ ๊ตฌํ˜„์— ์†ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ผญ ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ๊ณจ๋ผ ์ตœ์†Œํ•œ์˜ public API๋ฅผ ์„ค๊ณ„ํ•˜์ž.

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