๋””์ž์ธ ํŒจํ„ด์˜ ๊ฐ€์žฅ ์ฒซ๋ฒˆ์งธ์ธ ์‹ฑ๊ธ€ํ†ค์„ ์•Œ์•„๋ณด์ž.

Singleton ์ •์˜

  • ํŠน์ • ํด๋ž˜์Šค์—์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ธ์Šคํ„ด์Šค ์ˆ˜๋ฅผ ํ•˜๋‚˜๋กœ ์ œํ•œ
  • ์กฐ๊ฑด
    • ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘์— ์ตœ๋Œ€ ํ•˜๋‚˜๋งŒ ์žˆ์–ด์•ผ ํ•จ
      • Setting, file system
    • ์ „์—ญ์  ์ ‘๊ทผ ์ง€์ ์„ ์ œ๊ณตํ•ด์•ผ ํ•จ

Singleton์˜ ๋น„๊ณต์‹์  ์ •์˜

  • static ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๋น„ํŒ์„ ํ•ด๊ฒฐํ•˜๋Š” ํŒจํ„ด
  • ์ฆ‰, OO์—์„œ ์ „์—ญ ๋ณ€์ˆ˜ ๋ฐ ์ „์—ญ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๋ฒ•

Singleton

  • ๋” ์ž์„ธํ•œ ์„ค๋ช…์€, 08. Singleton๋ฅผ ์ฐธ๊ณ ํ•˜์ž.
  • Class Diagram์ด ์–ด์ƒ‰ํ•˜๋‹ค๋ฉด, ์—ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ•˜์ž.

Singleton Example

์ด์ „์— ์‚ดํŽด๋ณธ Math Class๋ฅผ 08. Singleton์œผ๋กœ ๋ฐ”๊พผ๋’ค ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋œ๋‹ค.

int absValue = Math.abs(-2); // static ์—†์œผ๋ฏ€๋กœ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜
 
Math math = Math.getInstance();
int minValue = math.min(-2, 1);
int maxValue = Math.getInstance().max(3, 100);

Singleton vs. static

static์œผ๋กœ ๋ชปํ•˜๋Š” ์ผ

  1. ๋‹คํ˜•์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
  2. Signiture๋ฅผ ๊ทธ๋Œ€๋กœ ๋‘” ์ฑ„, multiton ํŒจํ„ด์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค.
    • ์ฆ‰, instance๊ฐ€ ํ•œ๊ฐœ์ธ ์ƒํ™ฉ(singleton)์—์„œ ์—ฌ๋Ÿฌ๊ฐœ์ธ ์ƒํ™ฉ(multiton)์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค.
  3. ๊ฐœ์ฒด์˜ ์ƒ์„ฑ ์‹œ์ ์„ ์ œ์–ดํ•  ์ˆ˜ ์—†๋‹ค.
    • Java์˜ static์€ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์‹œ ์ดˆ๊ธฐํ™”๋จ
    • ๋ฌผ๋ก  singleton๋„ ์ƒ์„ฑ ์‹œ๊ธฐ๋ฅผ ์ œ์–ดํ•˜๋Š”๋ฐ ์–ด๋ ค์›€์ด ์žˆ์Œ

Singleton ๊ฐœ์ฒด์˜ ์ƒ์„ฑ ์‹œ๊ธฐ

  • getInstance() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ๋  ๋•Œ ์ƒ์„ฑ๋œ๋‹ค.
  • ํ•˜์ง€๋งŒ ๋ณดํ†ต ๋‹ค์–‘ํ•œ ๊ฐœ์ฒด์—์„œ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
  • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์—, ์–ด๋–ค ๊ฐœ์ฒด๊ฐ€ ๋จผ์ € ์‚ฌ์šฉํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ ํ•ด๋‹น ๊ฐ์ฒด์˜ ์ƒ์„ฑ์‹œ์ ์€ ๋‹ฌ๋ผ์ง„๋‹ค.

์ดˆ๊ธฐํ™” ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•

  • ๋ณดํ†ต์€ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.
  • ํ•˜์ง€๋งŒ ์™ธ๋ถ€ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ˆœ์„œ๊ฐ€ ์œ ์˜๋ฏธ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
  • ์ด๋Ÿฐ ๊ฒฝ์šฐ ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘ ์‹œ ์—ฌ๋Ÿฌ ์‹ฑ๊ธ€ํ„ด์˜ getInstance()๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ํ˜ธ์ถœํ•˜์—ฌ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
    • B.getInstance(); C.getInstance(); A.getInstance()

์‹ฑ๊ธ€ํ„ด ์ƒ์„ฑ์‹œ ์ธ์ž๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ

  • ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘ ์‹œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋‚˜์ค‘์— ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ์ฒด๋“ค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ณด์žฅํ•˜๋ฉด ๋œ๋‹ค.
  • Swift์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ์ง€.. ๊ณต์‹ ๋ฌธ์„œ์—๋„ ์ด๋ ‡๊ฒŒ ๋‚˜์™€ ์žˆ์–ด ํŒŒ์•…ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค ใ… 

Singleton์˜ ๋ณ€ํ˜•

  • ํ˜„์žฌ์˜ ๊ตฌํ˜„์œผ๋กœ๋Š” ํ‘œํ˜„์ด ์–ด๋ ต๋‹ค.
  • ๊ทธ๋ž˜์„œ ์‹ค๋ฌด์—์„œ๋Š” ๋‹ค๋ฅธ ๋ณ€ํ˜•์„ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค.
  • ์ฆ‰, ์ด๋Ÿฌํ•œ ์ ์—์„œ ๋””์ž์ธ ํŒจํ„ด์€ ๊ทธ์ € ๊ฐ€์ด๋“œ๋ผ์ธ ์ด๋ผ๋Š” ๊ฒƒ.
// ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์‹œ ํ˜ธ์ถœ
public static void createInstance(Dependency1 dep1, Dependency2 dep2) {
    assert(instance == null): "do not create instance twice";
 
    instance = new Singleton(dep1, dep2)
}
 
// ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ์‹œ ํ˜ธ์ถœ
public static void deleteInstance() {
    assert(instance != null): "no instance to delete";
 
    instance = null;
}
 
// ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ˜ธ์ถœ
public static Singleton getInstance() {
    assert (instance != null): "no instance was created before getInstance()";
 
    return instance;
}
  • ๊ทธ๋ž˜์„œ ์œ„์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ƒ์„ฑ๊ณผ ๋ฐ˜ํ™˜ ์‹œ์ ์„ ๋ถ„๋ฆฌํ•œ๋‹ค.
  • ์ด ๊ณผ์ •์—์„œ assert๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ, ์ดˆ๊ธฐ ์‚ฌ์šฉ์‹œ์— instance๊ฐ€ ๋งŒ๋“ค์–ด์กŒ๋Š”์ง€ ๋Ÿฐํƒ€์ž„์— ํ™•์ธํ•œ๋‹ค.
    • ๋””๋ฒ„๊น…์ด ์กฐ๊ธˆ ํŽธํ•ด์ง„๋‹ค.
  • ์ด ๋•Œ, getInstance() ์—ญ์‹œ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค.
    • createInstance() ์ฝ”๋“œ๊ฐ€ ๋จผ์ € ํ˜ธ์ถœ๋˜์—ˆ๋‹ค๋Š” ๊ฐ€์ •์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ
    • ์–ธ์ œ๋‚˜ ์œ ํšจํ•œ ์ƒํƒœ๋ฅผ ์ถ”๊ตฌํ•˜๋Š” OO ์ •์‹ ์—๋Š” ์œ„๋ฐฐ๋จ
  • ์‹คํ–‰์‹œ ์ดˆ๊ธฐํ™”, ์ข…๋ฃŒ์‹œ ์ฒญ์†Œํ•˜๋Š” ํ•จ์ˆ˜๋Š” ๋นผ๋จน๊ธฐ ์–ด๋ ค์šด ํ•จ์ˆ˜. ๊ทธ๋ž˜์„œ ๊ทธ๋‚˜๋งˆ ์šฉ์ธ ๊ฐ€๋Šฅ
    • ํ•˜์ง€๋งŒ ์ด ์‹ค์ˆ˜๋ฅผ ํ•˜์ง€ ์•Š๋„๋ก ๋‚˜๋ฅผ ๋งŒ๋“œ๋Š”๊ฒŒ ๋” ์šฐ์„ ์ด ๋˜์–ด์•ผ ํ•จ
  • ๊ดœํžˆ ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ์žก์ž๊ณ  ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์˜ค๋ฒ„ ์—”์ง€๋‹ˆ์–ด๋ง
    • ์•ˆ์ „ ์ˆ˜์น™์œผ๋กœ ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ๊ธฐ์ˆ ์ ์œผ๋กœ ํ‘ธ๋Š” ๊ฒƒ์€,
    • ๊ทผ๋ณธ์ ์œผ๋กœ โ€œ๋ฌธ์ œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํ•ด๊ฒฐโ€ํ•˜์ž๋Š” ์—”์ง€๋‹ˆ์–ด์˜ ์‹ ์กฐ์— ์–ด๊ธ‹๋‚œ ๊ฒƒ

Singleton์€ ์•ˆํ‹ฐํŒจํ„ด์ธ๊ฐ€?

์•ˆํ‹ฐํŒจํ„ด: ์•ˆ์ข‹์€ ๋ฐฉ๋ฒ• - ์˜ˆ) ๋งค์ง ๋„˜๋ฒ„, ๋งค์ง ์ŠคํŠธ๋ง

  1. ๊ทผ๋ณธ์ ์œผ๋กœ static๊ณผ ๊ฐ™์ž–์•„
  2. ์‹ฑ๊ธ€ํ„ด์„ ์•ˆ์“ฐ๊ณ  ๊ฐ™์€ ์ผ ํ•  ์ˆ˜ ์žˆ์ž–์•„
    • ๊ทผ๋ฐ ์“ธ๋ฐ ์—†์ด ๋ณต์žกํ•ด์ง
    • ๋ชจ๋“  ๊ฒƒ์ด ๊ฐœ์ฒด์—ฌ์•ผ๋งŒ ํ•˜๋Š” ์‹ค์šฉ์  ์ด์œ ๊ฐ€ ์žˆ๋Š”๊ฐ€? ์—†์œผ๋‹ˆ ํŒจ์Šค

๋ชจ๋“  ๊ฒƒ์€ ๋„๊ตฌ์— ๋ถˆ๊ณผ

  • ํŠน์ • ๋ฌธ์ œ์— ์ž˜ ๋งž๋Š” ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๋งŒ์ด๋‹ค.
  • ์‹ฑ๊ธ€ํ†ค๋„ ๊ทธ๋Ÿฐ ๋„๊ตฌ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

Reference