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

private ์ƒ์„ฑ์ž๋‚˜ ์—ด๊ฑฐ ํƒ€์ž…์œผ๋กœ ์‹ฑ๊ธ€ํ„ด์ž„์„ ๋ณด์ฆํ•˜๋ผ

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

ํด๋ž˜์Šค๋ฅผ ์‹ฑ๊ธ€ํ„ด์œผ๋กœ ๋งŒ๋“ค ๊ฒฝ์šฐ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ธฐ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค.

ํƒ€์ž…์„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ •์˜ํ•œ ๋‹ค์Œ ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์„œ ๋งŒ๋“  ์‹ฑ๊ธ€ํ„ด์ด ์•„๋‹ˆ๋ผ๋ฉด ์‹ฑ๊ธ€ํ„ด ์ธ์Šคํ„ด์Šค๋ฅผ mock ๊ตฌํ˜„์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์—†๋‹ค.

์‹ฑ๊ธ€ํ„ด์„ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹ 3๊ฐ€์ง€

public static ๋ฉค๋ฒ„๊ฐ€ final ํ•„๋“œ ๋ฐฉ์‹์˜ ์‹ฑ๊ธ€ํ„ด

public class Elvis {
    public static final Elvis INSTANCE = new Elvis(); 
    private Elvis() {....}
   
    public void leaveTheBuilding() {....}
}

private ์ƒ์„ฑ์ž๋Š” public static final ํ•„๋“œ์ธ Elvis.INSTANCE๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ ๋”ฑ ํ•œ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋œ๋‹ค.

public ์ด๋‚˜ protected ์ƒ์„ฑ์ž๊ฐ€ ์—†์œผ๋ฏ€๋กœ Elvis ํด๋ž˜์Šค๊ฐ€ ์ดˆ๊ธฐํ™”๋  ๋•Œ ๋งŒ๋“ค์–ด์ง„ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ „์ฒด ์‹œ์Šคํ…œ์—์„œ ํ•˜๋‚˜๋ฟ์ž„์ด ๋ณด์žฅ๋œ๋‹ค.

  • ์˜ˆ์™ธ๋Š” ๋‹จ ํ•œ๊ฐ€์ง€ ๊ถŒํ•œ์ด ์žˆ๋Š” ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฆฌํ”Œ๋ ‰์…˜ API(์•„์ดํ…œ 65)์ธ AccessibleObject.setAccessible์„ ์‚ฌ์šฉํ•ด private ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ๊ณต๊ฒฉ์„ ๋ฐฉ์–ดํ•˜๋ ค๋ฉด ์ƒ์„ฑ์ž๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ๋‘ ๋ฒˆ์งธ ๊ฐœ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋ ค ํ•  ๋•Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๊ฒŒ ํ•˜๋ฉด๋œ๋‹ค.

public static ๋ฉค๋ฒ„๊ฐ€ final ํ•„๋“œ ๋ฐฉ์‹ ์žฅ์ 

  • public ํ•„๋“œ ๋ฐฉ์‹์˜ ํฐ ์žฅ์ ์€ ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ์‹ฑ๊ธ€ํ„ด์ž„์ด API์— ๋ช…๋ฐฑํžˆ ๋“œ๋Ÿฌ๋‚œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
  • public static ํ•„๋“œ๊ฐ€ final์ด๋‹ˆ ์ ˆ๋Œ€๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค.
  • ๊ฐ„๊ฒฐํ•จ

์ •์  ํŒฉํ† ๋ฆฌ ๋ฐฉ์‹์˜ ์‹ฑ๊ธ€ํ„ด

public class Elvis {
    public static final Elvis INSTANCE = new Elvis(); 
    private Elvis() {....}
    public static Elvis getInstance() { return INSTANCE; } 
    public void leaveTheBuilding() { ... }
}
  • Elvis.getInstance๋Š” ํ•ญ์ƒ ๊ฐ™์€ ๊ฐ์ฒด์˜ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ์ œ2์˜ Elvis ์ธ์Šคํ„ด์Šค๋ž€ ๊ฒฐ์ฝ” ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š๋‹ค.

์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฐฉ์‹์˜ ์žฅ์ 

  1. API๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š๊ณ ๋„ ์‹ฑ๊ธ€ํ„ด์ด ์•„๋‹ˆ๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

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

  1. ์›ํ•œ๋‹ค๋ฉด ์ •์  ํŒฉํ† ๋ฆฌ๋ฅผ ์ œ๋„ค๋ฆญ ์‹ฑ๊ธ€ํ„ด ํŒฉํ† ๋ฆฌ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
  2. ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ์ฐธ์กฐ๋ฅผ ๊ณต๊ธ‰์ž(supplier)๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Elvis::getInstance๋ฅผ Supplier๋กœ ์‚ฌ์šฉํ•˜๋Š” ์‹์ด๋‹ค. (์•„์ดํ…œ 43, 44)

  • ๋‘๋ฐฉ์‹ ๋ชจ๋‘ ์ƒ์„ฑ์ž๋Š” private์œผ๋กœ ๊ฐ์ถฐ๋‘๊ณ  ์œ ์ผํ•œ ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋‹จ์œผ๋กœ public static ๋ฉค๋ฒ„๋ฅผ ํ•˜๋‚˜ ๋งˆ๋ จํ•ด๋‘”๋‹ค.

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

๋ชจ๋“  ์ธ์Šคํ„ด์Šค ํ•„๋“œ๋ฅผ ์ผ์‹œ์ ์ด๋ผ๊ณ  ์„ ์–ธํ•˜๊ณ  readResolve ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ด์•ผํ•œ๋‹ค. (์•„์ดํ…œ 89)

์ด๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š์œผ๋ฉด ์ง๋ ฌํ™”๋œ ์ธ์Šคํ„ด์Šค๋ฅผ ์—ญ์ง๋ ฌํ™”ํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค. - ๊ฐ€์งœ Elvis๊ฐ€ ํƒ„์ƒ

๊ฐ€์งœ Elvis ํƒ„์ƒ์„ ์˜ˆ๋ฐฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด Elvis ํด๋ž˜์Šค์— ๋‹ค์Œ readResolve ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์ž.

// ์‹ฑ๊ธ€ํ„ด์ž„์„ ๋ณด์žฅํ•ด์ฃผ๋Š” readResolve ๋ฉ”์„œ๋“œ
private Object readResolve() {
    //  ์ง„์งœ Elvis๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๊ฐ€์งœ Elvis๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์— ๋งก๊ธด๋‹ค. 
    return INSTANCE;
}

์—ด๊ฑฐ ํƒ€์ž… ๋ฐฉ์‹์˜ ์‹ฑ๊ธ€ํ„ด - ๋ฐ”๋žŒ์งํ•œ ๋ฐฉ๋ฒ•

public enum Elvis {
    INSTANCE;
    pulblic void leaveTheBuilding() { ... }
}
  • public ํ•„๋“œ ๋ฐฉ์‹๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ์ถ”๊ฐ€ ๋…ธ๋ ฅ์—†์ด ์ง๋ ฌํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ณต์žกํ•œ ์ง๋ ฌํ•œ ์ƒํ™ฉ์ด๋‚˜ ๋ฆฌํ”Œ๋ ‰์…˜ ๊ณต๊ฒฉ์—์„œ๋„ ์ œ2์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ๊ธฐ๋Š” ์ผ์„ ์™„๋ฒฝํžˆ ๋ง‰์•„์ค€๋‹ค.
  • ์›์†Œ๊ฐ€ ํ•˜๋‚˜๋ฟ์ธ ์—ด๊ฑฐ ํƒ€์ž…์ด ์‹ฑ๊ธ€ํ„ด์„ ๋งŒ๋“œ๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ค.

ํ•ต์‹ฌ ์ •๋ฆฌ

์—ด๊ฑฐ ํƒ€์ž… ๋ฐฉ์‹์˜ ์‹ฑ๊ธ€ํ„ด์„ ๋งŒ๋“œ๋Š”๊ฒŒ ๊ฐ€์žฅ ๋ฐ”๋žŒ์งํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. 
๋‹จ ๋งŒ๋“ค๋ ค๋Š” ์‹ฑ๊ธ€ํ„ด์ด Enum ์™ธ์˜ ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์ด ์ด ๋ฐฉ๋ฒ•์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. 
- ์—ด๊ฑฐ ํƒ€์ž…์ด ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ์„ ์–ธ ํ•  ์ˆ˜๋Š” ์žˆ๋‹ค.
โš ๏ธ **GitHub.com Fallback** โš ๏ธ