๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋””์ž์ธ ํŒจํ„ด

[๋””์ž์ธ ํŒจํ„ด] ์‹ฑ๊ธ€ํ„ด

by young-ji 2022. 10. 31.
  • ๋””์ž์ธ ํŒจํ„ด์ด๋ž€? ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ํŠน์ • ๋งฅ๋ฝ์—์„œ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ๊ณ ์งˆ์ ์ธ ๋ฌธ์ œ๋“ค์ด ๋˜ ๋ฐœ์ƒํ–ˆ์„๋•Œ ์žฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ›Œ๋ฅญํ•œ ํ•ด๊ฒฐ์ฑ…
  • ๋””์ž์ธ ํŒจํ„ด์˜ ์ข…๋ฅ˜
    • ์ƒ์„ฑ ํŒจํ„ด : ๊ฐ์ฒด ์ƒ์„ฑ์— ๊ด€๋ จ๋œ ํŒจํ„ด. ๊ฐ์ฒด๋ฅผ ๊ฐญ์Šํ™”ํ•ด ๋ณ€ํ™”์— ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค.
    • ๊ตฌ์กฐ ํŒจํ„ด : ํด๋ž˜์Šค๋‚˜ ๊ฐ์ฒด๋ฅผ ์กฐํ•ฉํ•ด ๋” ํฐ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“œ๋Š” ํŒจํ„ด
    • ํ–‰์œ„ ํŒจํ„ด : ๊ฐ์ฒด๋‚˜ ํด๋ž˜์Šค ์‚ฌ์ด์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‚˜ ์ฑ…์ž„ ๋ถ„๋ฐฐ์— ๊ด€๋ จ๋œ ํŒจํ„ด. ์ž‘์—…์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ์ฒด๋กœ ์–ด๋–ป๊ฒŒ ๋ถ„๋ฐฐํ• ์ง€, ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด์„œ๋„ ๊ฐ์ฒด ์‚ฌ์ด์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์— ์ค‘์ ์„ ๋‘”๋‹ค.

์ƒ์„ฑ ํŒจํ„ด ์ค‘ ํ•˜๋‚˜์— ์†ํ•˜๋Š”,

 

์‹ฑ๊ธ€ํ„ด(Singleton)

์‹ฑ๊ธ€ํ„ด์€ ํด๋ž˜์Šค์— ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ๋„๋ก ํ•˜๋ฉด์„œ ์ด ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ์ „์—ญ ์ ‘๊ทผ(์•ก์„ธ์Šค) ์ง€์ ์„ ์ œ๊ณตํ•˜๋Š” ์ƒ์„ฑ ๋””์ž์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

์ธ์Šคํ„ด์Šค๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ์ผ ๋•Œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.(์‹œ์Šคํ…œ ๋Ÿฐํƒ€์ž„, ํ™˜๊ฒฝ ์„ธํŒ… ์ •๋ณด) ์ธ์Šคํ„ด์Šค๋ฅผ ์˜ค์ง ํ•œ๊ฐœ๋งŒ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ๊ฐ์ฒด์˜ ์œ ์ผ์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

 

→ ์„ค์ • ํŒŒ์ผ์˜ ๊ฒฝ์šฐ ๊ฐ์ฒด๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ์ƒ์„ฑ๋˜๋ฉด ์„ค์ • ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ์œ„ํ—˜์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ ์ธ์Šคํ„ด์Šค๊ฐ€ 1๊ฐœ๋งŒ ์ƒ์„ฑ๋˜๋Š” ํŠน์ง•์„ ๊ฐ€์ง„ ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์„ ์ด์šฉํ•˜๋ฉด ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋“ฑ๋กํ•ด์„œ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” ํ•œ๋‹ค.

์žฅ์ 

: ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

: ๊ฐ์ฒด์˜ ์œ ์ผ์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

: ๋‘๋ฒˆ์งธ ์ด์šฉ์‹œ ๊ฐ์ฒด ๋กœ๋”ฉ ์‹œ๊ฐ„์ด ์ค„์–ด ์„ฑ๋Šฅ์ด ์ข‹์•„์ง„๋‹ค.

 

๋‹จ์ 

: ์‹ฑ๊ธ€ํ„ด์€ ํ•œ๋ฒˆ์— ์—ฌ๋Ÿฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ์œผ๋กœ “๋‹จ์ผ ์ฑ…์ž„ ์›์น™”์„ ์œ„๋ฐฐํ•œ๋‹ค. ๋˜ํ•œ ๋„ˆ๋ฌด ๋งŽ์€ ์ผ์„ ํ•˜๊ฑฐ๋‚˜ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ์‹œํ‚ฌ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋“ค ๊ฐ„์— ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์–ด์ ธ “๊ฐœ๋ฐฉํ์‡  ์›์น™”์— ์œ„๋ฐฐ๋  ์ˆ˜ ์žˆ๋‹ค.

: ๋˜ํ•œ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋™๊ธฐํ™” ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค˜์•ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋Ÿฌ์›€๋„ ์žˆ๋‹ค.

 

→ ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด ์ง€์–‘ํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค

 

 

โœ… ์‹ค๋ฌด์—์„œ ์–ด๋–ป๊ฒŒ ์“ฐ์ด๋Š”๊ฐ€

  • java.lang์˜ Runtime ํด๋ž˜์Šค → ์‹คํ–‰ํ•˜๋Š” ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ถœ๋ ฅ๊ฐ€๋Šฅ

 

 

 

โœ… ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

public class Setting {

    private static Setting instance;

    // private ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค๋ฉด ๋ฐ–์—์„œ๋Š” ํ˜ธ์ถœ์ด ์•ˆ๋˜๊ณ  ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค.
    private Setting(){ }

    // ๋‚ด๋ถ€์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด ์ „์—ญ์—์„œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์•ผํ•œ๋‹ค. -> static
    public static Setting getInstance(){
        if (instance == null) {
            instance = new Setting();
        }
        return instance;
    }
}
public static void main(String[] args) {

    Setting setting1 = Setting.getInstance();
    Setting setting2 = Setting.getInstance();

    if (setting1 == setting2){
        System.out.println("Hello world!");
    }
}

 

 

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ด์œ 

๋™๊ธฐํ™” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

1. synchronized ํ‚ค์›Œ๋“œ ์‚ฌ์šฉํ•˜๊ธฐ - ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋‹ค.

public static synchronized Setting getInstance(){
    if (instance == null) {
        instance = new Setting();
    }
    return instance;
}

๋‹จ์  → getInstance ํ• ๋•Œ๋งˆ๋‹ค synchronized (lock-release)์ฒ˜๋ฆฌ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ €ํ•˜๊ฐ€ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

 

 

2. ์ด๋ฅธ ์ดˆ๊ธฐํ™”(eager initialization) ์‚ฌ์šฉํ•˜๊ธฐ

public class Setting {

    private static final Setting INSTANCE = new Setting();

    private Setting(){}

    public static synchronized Setting getInstance(){
        return INSTANCE;
    }
}

๋‹จ์  → ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๋น„์šฉ์ด ๊ทธ๋ ‡๊ฒŒ ๋น„์‹ธ์ง€ ์•Š๋‹ค๋ฉด ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋†”๋„๋œ๋‹ค. ํ•˜์ง€๋งŒ ๋งŽ์€ ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•„์š”ํ•œ ์ธ์Šคํ„ด์Šค๋ผ๋ฉด ์ด๋ฏธ ๋งŒ๋“œ๋Š”๊ฑฐ ์ž์ฒด๊ฐ€ ๋‹จ์ ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

 

 

3. double checked locking

public class Setting {

    private static volatile Setting instance;

    private Setting(){ }

    public static Setting getInstance(){
        if (instance == null) {
            synchronized (Setting.class){
                if(instance == null){
                    instance = new Setting();
                }
            }
        }
        return instance;
    }
}

synchronized ์‚ฌ์šฉ ๊ฒฝ์šฐ๋ฅผ ๋‚ฎ์ถฐ ๊ทธ์— ๋”ฐ๋ฅธ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

๋‹จ์  → ๋„ˆ๋ฌด ๋ณต์žกํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋ฉฐ, java 1.5 ๋ฒ„์ „๋ถ€ํ„ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

4. static inner class → ๊ถŒ์žฅ ๋ฐฉ๋ฒ• โœจ

public class Setting {

    private Setting(){}

    //inner class
    private static class SettingsHolder{
        private static final Setting INSTANCE = new Setting();
    }

    public static Setting getInstance(){
        return SettingsHolder.INSTANCE;
    }
}

ํด๋ž˜์Šค ์ดˆ๊ธฐํ™”๋Š” ์›์ž์  ํŠน์„ฑ์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋„ ์•ˆ์ „ํ•˜๊ณ  lazy load๋„ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ

 

 


 

 

โž• ์—ด๊ฑฐ๋ฒ• (enum)

enum์€ ์—ด๊ฑฐํ˜• ์ƒ์ˆ˜๋ฅผ ํ†ตํ•ด ์ •์˜๋œ ์ธ์Šคํ„ด์Šค ์ด์™ธ์˜ ์ธ์Šคํ„ด์Šค๋Š” ์—†๋‹ค.

enum์€ ์ง๋ ฌํ™”๊ฐ€ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๊ณ , ๋ฆฌํ”Œ๋ ‰์…˜์— ์•ˆ์ „ํ•˜๊ธฐ๋•Œ๋ฌธ์— ์—ด๊ฑฐํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ๋ฌธ์ œ๋“ค์„ ๋ง‰์„ ์ˆ˜ ์žˆ๊ณ  ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด์— ํ•˜๋‚˜๋งŒ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ณด์žฅ ๋˜๋ฏ€๋กœ, ์‹ฑ๊ธ€ํ†ค์„ ๋งŒ๋“ค๊ธฐ ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ค.

 

 

 

reference.

https://refactoring.guru/ko/design-patterns/singleton

https://www.youtube.com/playlist?list=PLfI752FpVCS_v_sc8Q6V9QQN7GhoyktKD

'๋””์ž์ธ ํŒจํ„ด' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[๋””์ž์ธ ํŒจํ„ด] ํผ์‚ฌ๋“œ ํŒจํ„ด  (0) 2023.02.18

๋Œ“๊ธ€