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

Effective Java 3e ์•„์ดํ…œ 15๋ฅผ ์š”์•ฝํ•œ ๋‚ด์šฉ ์ž…๋‹ˆ๋‹ค.

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

์ •๋ณด ์€๋‹‰์˜ ์žฅ์ ์„ ๊ตฌ์ฒด์ ์œผ๋กœ ํ•œ๋ฒˆ ์•Œ์•„๋ณด์ž.

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

๊ธฐ๋ณธ ์›์น™์€ ๊ฐ„๋‹จํ•˜๋‹ค.

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

๋ฉค๋ฒ„์— ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋Š” ์ ‘๊ทผ ์ˆ˜์ค€

  • private : ๋ฉค๋ฒ„๋ฅผ ์„ ์–ธํ•œ ํ†ฑ ๋ ˆ๋ฒจ ํด๋ž˜์Šค์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • package-private : ๋ฉค๋ฒ„๊ฐ€ ์†Œ์†๋œ ํŒจํ‚ค์ง€ ์•ˆ์˜ ๋ชจ๋“  ํด๋ž˜์Šค์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • protected : package-private์˜ ์ ‘๊ทผ ๋ฒ”์œ„๋ฅผ ํฌํ•จํ•˜๋ฉฐ ์ด ๋ฉค๋ฒ„๋ฅผ ์„ ์–ธํ•œ ํด๋ž˜์Šค์˜ ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • public : ๋ชจ๋“  ๊ณณ์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

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

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

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

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

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

๊ธธ์ด๊ฐ€ 0์ด ์•„๋‹Œ ๋ฐฐ์—ด์€ ๋ชจ๋‘ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•˜๋‹ˆ ์ฃผ์˜ํ•˜์ž. ๋”ฐ๋ผ์„œ ํด๋ž˜์Šค์—์„œ public static final ๋ฐฐ์—ด ํ•„๋“œ๋ฅผ ๋‘๊ฑฐ๋‚˜ ์ด ํ•„๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ ‘๊ทผ์ž ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค. ์ด๋Ÿฐ ํ•„๋“œ๋‚˜ ์ ‘๊ทผ์ž๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋ฉด ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ทธ ๋ฐฐ์—ด์˜ ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์˜ˆ์ปจ๋Œ€ ๋‹ค์Œ ์ฝ”๋“œ์—๋Š” ๋ณด์•ˆ ํ—ˆ์ ์ด ์กด์žฌํ•œ๋‹ค.

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

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

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

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

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

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

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

๋ชจ๋“ˆ ์‹œ์Šคํ…œ์—์„œ ๋„์ž…๋œ ๋‘ ๊ฐ€์ง€ ์•”๋ฌต์  ์ ‘๊ทผ ์ˆ˜์ค€์ด๋ž€?

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

JDK ์™ธ์—๋„ ๋ชจ๋“ˆ ๊ฐœ๋…์ด ๋„๋ฆฌ ๋ฐ›์•„๋“ค์—ฌ์งˆ์ง€ ์˜ˆ์ธกํ•˜๊ธฐ๋Š” ์•„์ง ์ด๋ฅธ ๊ฐ์ด ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋‹น๋ถ„๊ฐ„์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

์ •๋ฆฌ

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

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