Skip to content

Latest commit

ย 

History

History
72 lines (41 loc) ยท 3.07 KB

item3.md

File metadata and controls

72 lines (41 loc) ยท 3.07 KB

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

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

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

์‹ฑ๊ธ€ํ†ค์„ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์€ ๋ณดํ†ต 2๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค.

1. public static final ํ•„๋“œ

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

private ๊ธฐ๋ณธ ์ƒ์„ฑ์ž Elvis()๋Š” public static final ํ•„๋“œ(Elvis.INSTANCE)๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ ๋”ฑ ํ•œ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋œ๋‹ค. ์ด๋กœ์จ Elvis ํด๋ž˜์Šค๊ฐ€ ์ „์ฒด ์‹œ์Šคํ…œ์—์„œ ์˜ค์ง ํ•˜๋‚˜๋ฟ์ž„์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค๋งŒ reflection์„ ํ™œ์šฉํ•˜์—ฌ ์™ธ๋ถ€์—์„œ ํด๋ž˜์Šค์˜ private ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•(๊ณต๊ฒฉ)์ด ์กด์žฌํ•œ๋‹ค. (AccessibleObject.setAccessible) ์ด ๊ณต๊ฒฉ์„ ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด private ์ƒ์„ฑ์ž๊ฐ€ ๋‘ ๋ฒˆ์งธ ํ˜ธ์ถœ ๋˜๋Š” ์‹œ์ ์— ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค.

์žฅ์ 

ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ์‹ฑํดํ„ด์ด๋ผ๋Š” ๊ฒƒ์ด API์— ๋ช…๋ฐฑํžˆ ๋“œ๋Ÿฌ๋‚˜๋ฉฐ ๊ฐ„๊ฒฐํ•˜๋‹ค.

2. ์ •์  ํŒฉํ† ๋ฆฌ

public class Elvis {
    private static final Elvis INSTANCE = new Elvis();
    private Elvis() {}
    public static Elvis getInstance() { return INSTANCE; }
    
    public void someMethod() {}
}

Elvis.getInstance ๋ฉ”์†Œ๋“œ๋Š” ํ•ญ์ƒ ๋™์ผํ•œ ๊ฐ์ฒด INSTANCE๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์žฅ์ 

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

  • ์œ ์ผํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  thread ๋ณ„๋กœ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Œ

๋˜ํ•œ ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ๋ฅผ generic singleton factory ๋ฉ”์†Œ๋“œ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์žฅ์ ์„ ํ™œ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ •์  ํŒฉํ† ๋ฆฌ ๋ฐฉ์‹๋ณด๋‹ค public static final ํ•„๋“œ๋ฅผ ํ™œ์šฉํ•œ ๋ฐฉ์‹์ด ์ข‹๋‹ค.

์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด์˜ ์ง๋ ฌํ™”

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

3. ์—ด๊ฑฐ ํƒ€์ž…

public enum Elvis {
    INSTANCE;
    
    public void someMethod() {}
}

์—ด๊ฑฐ ํƒ€์ž…์„ ํ†ตํ•ด ์‹ฑ๊ธ€ํ„ด์„ ๊ตฌํ˜„ํ•˜๋ฉด ์ง๋ ฌํ™”๋ฅผ ์œ„ํ•œ ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์ด ํ•„์š”์—†๋‹ค. ๋˜ํ•œ reflection์„ ํ†ตํ•œ ์ œ 2์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์ƒํ™ฉ์—์„œ ์›์†Œ๊ฐ€ ํ•˜๋‚˜๋ฟ์ธ ์—ด๊ฑฐ ํƒ€์ž…์œผ๋กœ ์‹ฑ๊ธ€ํ„ด์„ ๋งŒ๋“œ๋Š”๊ฒŒ ๊ฐ€์žฅ ๋ฐ”๋žŒ์งํ•˜๋‹ค.

  • ๋‹จ, ๋งŒ๋“œ๋ ค๋Š” ์‹ฑ๊ธ€ํ†ค ํด๋ž˜์Šค๊ฐ€ ์—ด๊ฑฐ ํƒ€์ž… ์ด์™ธ์˜ ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•œ๋‹ค๋ฉด ์ด ๋ฐฉ์‹์œผ๋กœ ์‹ฑ๊ธ€ํ†ค ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค.