Day 17(21.09.29) - Gomserker/Java-101 GitHub Wiki

24. ์‹ฑ๊ธ€ํ†ค ๋””์ž์ธ ํŒจํ„ด(Singleton Design Pattern)

(1) ๋””์ž์ธ ํŒจํ„ด์ด๋ž€?

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

(2) ์‹ฑ๊ธ€ํ†ค ๋””์ž์ธ ํŒจํ„ด(Singleton Design Pattern)

์‹ฑ๊ธ€ํ†ค ๋””์ž์ธ ํŒจํ„ด์ด๋ž€ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ์ธ์Šคํ„ด์Šค๋ฅผ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•˜๋„๋ก ํ•˜๋ฉฐ, ์–ด๋””์—์„œ๋“ ์ง€ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํŒจํ„ด์ด๋‹ค. ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ ์ธ์Šคํ„ด์Šค๋ฅผ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•œ๋‹ค๋Š” ์ ์ธ๋ฐ, ์‚ฌ์›์ด ๊ทผ๋ฌดํ•˜๋Š” ํšŒ์‚ฌ, ์ฐจ๋Ÿ‰์ด ์ถœ๊ณ ๋˜๋Š” ๊ณต์žฅ ๋“ฑ ๊ฐ€๋”์”ฉ ๋‹จ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ์„ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์ด๋Ÿด๋•Œ ์‹ฑ๊ธ€ํ†ค ๋””์ž์ธ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ด๋•Œ ์ƒ์„ฑ๋˜๋Š” ์œ ์ผํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์‹ฑ๊ธ€ํ†ค(singleton)์ด๋ผ๊ณ  ํ•œ๋‹ค.

(3) ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์˜ ์‚ฌ์šฉ๋ฒ•

  • ์‹ฑ๊ธ€ํ†ค ์ƒ์„ฑํ•˜๊ธฐ
    ์‹ฑ๊ธ€ํ†ค์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋จผ์ € ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ new ์—ฐ์‚ฐ์ž๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋„๋ก ๋ง‰์•„์•ผํ•œ๋‹ค. ๋งŒ์•ฝ new ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ๋˜๋ฉด ์‚ฌ์šฉํ•œ๋งŒํผ ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ณ„์† ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋•Œ๋ฌธ์— ์ด๋ฅผ ๋ง‰๊ธฐ์œ„ํ•ด ์ƒ์„ฑ์ž์— ์ ‘๊ทผ์ œ์–ด์ž 'private'์„ ๋ถ™์—ฌ์ค€๋‹ค. private ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ–ˆ์œผ๋ฏ€๋กœ ๋‹น์—ฐํžˆ ๊ฐ™์€ ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ๋Š” new ์—ฐ์‚ฐ์ž๋กœ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ •์  ํ•„๋“œ ์„ ์–ธ ๋ฐ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
    ์ž์‹ ์˜ ํƒ€์ž…์ธ ์ •์  ํ•„๋“œ(static)๋ฅผ ์„ ์–ธํ•˜๊ณ  ์ž์‹ ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์„œ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ๋Š” new ์—ฐ์‚ฐ์ž๋กœ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. static ํ•„๋“œ ๋˜ํ•œ private ์ ‘๊ทผ์ œํ•œ์ž๋ฅผ ๋ถ™์—ฌ ์™ธ๋ถ€์—์„œ ํ•„๋“œ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•œ๋‹ค.
  • ์ •์  ๋ฉ”์†Œ๋“œ(static method) ์„ ์–ธ
    ์™ธ๋ถ€์—์„œ ์ž์‹ ์„ ํ˜ธ์ถœํ•˜๋Š” ์ •์  ๋ฉ”์†Œ๋“œ๋ฅผ ์„ ์–ธํ•œ๋‹ค. ๋ณดํ†ต getInstance()๋กœ ์ž‘์„ฑํ•˜๋Š”๋ฐ, ์ •์  ํ•„๋“œ์—์„œ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ์ž์‹ ์˜ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•ด์ค€๋‹ค.
    ์•„๋ž˜๋Š” ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค.
public class Singleton {
    //์ •์  ํ•„๋“œ
    private static Singleton singleton = new Singleton();

    //์ƒ์„ฑ์ž
    private Singleton() {}

    //์ •์  ๋ฉ”์†Œ๋“œ
    static Singleton getInstance() {
        return singleton;
    }
}
public class SingletonExample {
    public static void main(String[] args) {

    Singleton object1 = Singleton.getInstance();
    Singleton object2 = Singleton.getInstance();

    if (object1 == object2) {
        System.out.println("๊ฐ™์€ Singleton ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.");
    } else {
        System.out.println("๋‹ค๋ฅธ Singleton ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.");
    }
  }
}

Result

๊ฐ™์€ Singleton ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.  

์œ„ ํ”„๋กœ๊ทธ๋žจ์„ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด์ž

private static Singleton singleton = new Singleton();

๋จผ์ € ์ •์  ํ•„๋“œ๋ฅผ ์„ ์–ธํ•˜๊ณ  ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด ์ดˆ๊ธฐํ™”ํ–ˆ๋‹ค. ์—ฌ๊ธฐ์„  singleton์ด๋ผ๋Š” ์ฐธ์กฐ๋ณ€์ˆ˜๊ฐ€ ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค์ธ Singleton์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค.

private Singleton() {}

์™ธ๋ถ€์—์„œ new ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ•˜๋„๋ก private ์ ‘๊ทผ์ œํ•œ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ์ž๋ฅผ ์„ ์–ธํ–ˆ๋‹ค.

static Singleton getInstance() {
        return singleton;
    }

๊ทธ๋ฆฌ๊ณ , ์ •์  ํ•„๋“œ์—์„œ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ •์  ๋ฉ”์†Œ๋“œ๋ฅผ ์„ ์–ธํ–ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ ํด๋ž˜์Šค๋Š” private ์ ‘๊ทผ์ œํ•œ์ž๋ฅผ ์‚ฌ์šฉํ–ˆ๊ธฐ์— ์™ธ๋ถ€์—์„œ

1)
Singleton object1 = new Singleton();
Singleton object2 = new Singleton();

2)
Singleton object1 = Singleton.getInstance();
Singleton object2 = Singleton.getInstance();

1๋ฒˆ๊ณผ ๊ฐ™์ด new ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋‹ค. ๋Œ€์‹  2๋ฒˆ ๋ฐฉ๋ฒ•์ฒ˜๋Ÿผ ์œ ์ผํ•˜๊ฒŒ ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ •์  ๋ฉ”์†Œ๋“œ์ธ getInstance()๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ์ฒด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ object1๊ณผ object2์˜ ์ฃผ์†Œ๊ฐ’์„ ์ถœ๋ ฅํ•ด๋ณด๋ฉด ๊ฐ™์€ ์ฃผ์†Œ๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ†ตํ•ด, ์ธ์Šคํ„ด์Šค๋Š” ๋‹จ ํ•˜๋‚˜๋ฟ์ด๋ผ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
๋‹ค์Œ๊ณผ ๋‹ค์Œ ํ”„๋กœ๊ทธ๋žจ์€ ์•„์ด์–ธ๋งจ์„ ์œ ์ผํ•œ ์ธ์Šคํ„ด์Šค, ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ์„ค์ •ํ–ˆ๋‹ค. ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
Result

Tony Stark, 32
Tony Stark, 32
IronMan@880ec60
IronMan@880ec60  

์œ„์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ironman1๊ณผ ironman2 ์ฐธ์กฐ๋ณ€์ˆ˜๋Š” ์‹ฑ๊ธ€ํ†ค์ธ IM ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.