Post

โ›“๏ธ Java Design-Pattern โ…ฅ - Singleton

โ›“๏ธ Java Design-Pattern โ…ฅ - Singleton

๐Ÿ“— ใ€ŽJAVA ์–ธ์–ด๋กœ ๋ฐฐ์šฐ๋Š” ๋””์ž์ธ ํŒจํ„ด : ์‰ฝ๊ฒŒ ๋ฐฐ์šฐ๋Š” GoF์˜ 23๊ฐ€์ง€ ๋””์ž์ธ ํŒจํ„ดใ€๋ฅผ ์ฝ๊ณ  ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

Singleton ํŒจํ„ด์ด๋ž€?

  • ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ฉด ๋ณดํ†ต ๋งŽ์€ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ดย java.lang.Stringย ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ ๋ฌธ์ž์—ด 1๊ฐœ์— ์ธ์Šคํ„ด์Šค 1๊ฐœ๊ฐ€ ์ƒ์„ฑ๋˜๋ฏ€๋กœ ๋ฌธ์ž์—ด์ด 1000๊ฐœ ๋“ฑ์žฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด๋ผ๋ฉด ์ธ์Šคํ„ด์Šค๋„ 1000๊ฐœ๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.
  • ํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?

โ€œ์ง€์ •ํ•œ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐ˜๋“œ์‹œ 1๊ฐœ๋งŒ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์ฆํ•˜๊ณ  ์‹ถ์„ ๋•Œโ€
โ€œ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ํ”„๋กœ๊ทธ๋žจ ์ƒ์—์„œ ํ‘œํ˜„ํ•˜๊ณ  ์‹ถ์„ ๋•Œโ€

  • ์ด๋•Œ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ๋ณด์ฆํ•˜๋Š” ํŒจํ„ด์„ย Singletonย ํŒจํ„ด์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ

  • Singleton์€ย staticย ํ•„๋“œ๋กœ ์ •์˜๋œ๋‹ค.
  • ํด๋ž˜์Šค ๋ณ€์ˆ˜๋ผ๊ณ ๋„ ํ•œ๋‹ค.
  • ํ•ด๋‹น ํ•„๋“œ๋Š”ย Singletonย ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์—์„œ ์ดˆ๊ธฐํ™”ํ•˜๋ฉฐ, ์ดˆ๊ธฐํ™”๋Š” ํด๋ž˜์Šค๋ฅผ ๋กœ๋“œํ•  ๋•Œ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋œ๋‹ค.
  • ์ƒ์„ฑ์ž๋Š”ย private๋กœ ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์™ธ๋ถ€์—์„œ ์ƒ์„ฑ์ž ํ˜ธ์ถœ์„ ๊ธˆ์ง€ํ•œ๋‹ค.
  • ๋งŒ์•ฝ ์™ธ๋ถ€์—์„œ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ ์ปดํŒŒ์ผํ•  ๋•Œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜๋ฌธ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

โ€œ์ฒ˜์Œ๋ถ€ํ„ฐ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ฃผ์˜ํ•ด์„œ ์™ธ๋ถ€์—์„œ ์ƒ์„ฑ์ž ํ˜ธ์ถœ์„ ํ•˜์ง€ ์•Š์œผ๋ฉด ๋˜์ง€ ์•Š๋‚˜?โ€
โ€œ์• ์ดˆ์— ์‹ฑ๊ธ€ํ†ค ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ํ•„์š” ์—†์ด ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ธ์Šคํ„ด์Šค๋ฅผ ํ•œ ๋ฒˆ๋งŒ ์ƒ์„ฑํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ ์•„๋‹Œ๊ฐ€?โ€

  • ํ•ด๋‹น ํŒจํ„ด์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์–ด๋–ค ์‹ค์ˆ˜๋ฅผ ํ•˜๋”๋ผ๋„ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ๋ณด์ฆํ•˜๋Š” ํŒจํ„ด์ด๋ฏ€๋กœ ์œ„์˜ ์˜๋ฌธ๋“ค์€ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค.
  • getInstance๋Š”ย Singletonย ํด๋ž˜์Šค์˜ ์œ ์ผํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์–ป๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค.
  • ์‚ฌ์‹ค ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋Š”ย static Factory Method์˜ ์ผ์ข…์ด๋‹ค.
  • ์ด๋ฆ„์€ ๋‹ฌ๋ฆฌ ํ•ด๋„ ๋˜์ง€๋งŒ, ์œ ์ผํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์–ป์„ ๋ฐฉ๋ฒ•์ด ๋ฌด์–ธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

Singleton ํด๋ž˜์Šค

1
2
3
4
5
6
7
8
9
10
11
12
public class Singleton {
    private static Singleton instance;
    
    private Singleton() { }
    
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

Mainย ํด๋ž˜์Šค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Main {
	public static void main(String[] args) {
    	System.out.println("Start");
        
        Singleton obj1 = Singleton.getInstance();
        Singleton obj2 = Singleton.getInstance();
		
        if (obj1 == obj2) {
        	System.out.println("obj1๊ณผ obj2๋Š” ๊ฐ™์€ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.");
        } else {
        	System.out.println("obj1๊ณผ obj2๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.");
        }
        
        System.out.println("End");
	}
}
  • Mainย ํด๋ž˜์Šค๋ฅผ ์‹คํ–‰ํ•˜๋ฉดย obj1์™€ย obj2๋Š” ๊ฐ™์€ ์ธ์Šคํ„ด์Šค์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

Singletonย ํŒจํ„ด์˜ ๋“ฑ์žฅ์ธ๋ฌผ

Singletonย ํด๋ž˜์Šค

  • Singletonย ์—ญํ• ์ด๋‹ค.
  • ํ•ด๋‹น ์—ญํ• ์€ ์œ ์ผํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์–ป๊ธฐ ์œ„ํ•œย staticย ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉฐ, ํ•ญ์ƒ ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ฑ…์—์„œ ์ œ์‹œํ•˜๋Š” ํžŒํŠธ

์™œ ์ œํ•œํ• ๊นŒ?

  • ์ธ์Šคํ„ด์Šค๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์กด์žฌํ•˜๋ฉด ์ธ์Šคํ„ด์Šค๊ฐ€ ์„œ๋กœ ์˜ํ–ฅ์„ ๋ฏธ์ณ ์˜๋„์น˜ ์•Š์€ ๋ฒ„๊ทธ๋ฅผ ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
  • ํ•˜์ง€๋งŒ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•˜๋‚˜๋ฟ์ด๋ผ๋Š” ๋ณด์žฅ์ด ์žˆ๋‹ค๋ฉด ๊ทธ ์ „์ œ ์กฐ๊ฑด ํ•˜์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ „์ œ ์กฐ๊ฑด์„ ๋‘๊ณ  ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋ฅผ ์ œ์–ดํ•˜๋Š”๋ฐ ํšจ๊ณผ์ ์ด๋‹ค.

์œ ์ผํ•œ ์ธ์Šคํ„ด์Šค๋Š” ์–ธ์ œ ์ƒ์„ฑ๋˜๋Š”๊ฐ€?

  • ์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š”ย getInstanceย ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œย Singletonย ํด๋ž˜์Šค๊ฐ€ ๋กœ๋“œ๋˜๋ฉฐ ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ์ดˆ๊ธฐํ™”๋œ๋‹ค.
  • ์ด ๋•Œย staticย ํ•„๋“œ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๋ฉฐ ์œ ์ผํ•œ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

Enum์„ ์ด์šฉํ•œย Singleton

1
2
3
4
5
6
7
enum Singleton {
	INSTANCE;
    
    public void hello() {
    	System.out.println("hello is called");
    }
}
  • enum์˜ ์š”์†Œ๋Š” ์ƒ์ˆ˜๋กœ์„œ ์ธ์Šคํ„ด์Šค์˜ ์œ ์ผ์„ฑ์„ ๋ณด์ฆ๋ฐ›๋Š”๋‹ค.
  • ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์š”์†Œ๋ฅผ ํ•˜๋‚˜๋งŒ ๊ฐ€์ง€๋Š”ย enum์„ ์ด์šฉํ•˜์—ฌ ์ƒ๊ธฐ ์ฝ”๋“œ์™€ ๊ฐ™์ดย Singletonย ํŒจํ„ด์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹ค์Œ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์œ ์ผํ•œ ์ธ์Šคํ„ด์Šค์— ์•ก์„ธ์Šคํ•˜์—ฌ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.
1
Singleton.INSTANCE.hello();
This post is licensed under CC BY 4.0 by the author.