๐ŸŽฐ Design Pattern

Singleton pattern | ์‹ฑ๊ธ€ํ†คํŒจํ„ด

์—ฐ_์šฐ๋ฆฌ 2022. 7. 29. 20:03
๋ฐ˜์‘ํ˜•

๋ชฉ์ฐจ

     

     

     

    ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์“ฐ์ผ๊นŒ?

    ์‹œ์Šคํ…œ ๋Ÿฐํƒ€์ž„, ํ™˜๊ฒฝ์…‹ํŒ…์ •๋ณด ๋“ฑ์˜ ๊ฐ์ฒด๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ์ƒ์„ฑ๋˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ??

    ์—ฌ๊ธฐ์ €๊ธฐ์„œ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์…‹ํŒ…์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ๊ฒŒ๋˜๊ณ ,

    ๋™์ผํ•œ ์„ค์ •๊ฐ’์ด๋ผ๋ฉด ์ค‘๋ณต๋œ ๋งŒํผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๊ฒŒ๋œ๋‹ค.

     

    ์…‹ํŒ…์ •๋ณด์˜ ์ธ์Šคํ„ด์Šค๋Š” ์˜ค์ง ํ•˜๋‚˜๋งŒ ์กด์žฌํ•ด์•ผํ•œ๋‹ค. ์ด๋Ÿด๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์ด๋‹ค.

     

     

     

    ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์ด๋ž€?

    ์ธ์Šคํ„ด์Šค๋ฅผ ์˜ค์ง ํ•˜๋‚˜๋งŒ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋งํ•œ๋‹ค

    ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ๊ณต์œ ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค. (๊ณต์œ ํ•˜๋Š” ๋งŒํผ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋„ ๊ณ ๋ คํ•ด์•ผํ•œ๋‹ค!)

     

     

    ์žฅ์ 

    - new๊ฐ€ ์•„๋‹Œ staticํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ณ ์ •๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ๊ฐ€์ง€๊ฒŒ๋œ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค

    - ์‹ฑ๊ธ€ํ†ค ์ธ์Šคํ„ด์Šค๋Š” ์ „์—ญ์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์—, ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

    - ์ธ์Šคํ„ด์Šค์˜ 2๋ฒˆ์งธ ์ ‘๊ทผ๋ถ€ํ„ฐ๋Š” ๊ฐ์ฒด ๋กœ๋”ฉ์‹œ๊ฐ„์ด ์ค„์–ด๋“ ๋‹ค

     

     

    ๋‹จ์ 

    - ์‹ฑ๊ธ€ํ†ค ์ธ์Šคํ„ด์Šค๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ์—ญํ• ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ฑฐ๋‚˜, ๋„ˆ๋ฌด ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์žˆ์„ ๋•Œ์—๋Š”

      ์ธ์Šคํ„ด์Šค๋“ค ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์•„์ ธ OCP(๊ฐœ๋ฐฉ ํ์‡„ ์›์น™)์„ ์œ„๋ฐฐํ•  ์ˆ˜ ์žˆ๋‹ค.

    - ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋™๊ธฐํ™”์ฒ˜๋ฆฌ๋ฅผ ๋†“์น˜๋ฉด ์ธ์Šคํ„ด์Šค๊ฐ€ 2๊ฐœ๊ฐ€ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค!!

    - ๋™์‹œ์„ฑ ํ•ด๊ฒฐ์„ ์œ„ํ•ด ํ•„์š”ํ•œ ์ฝ”๋“œ๊ฐ€ ๋งŽ๋‹ค.

     

     

     

    ๊ตฌํ˜„๋ฐฉ๋ฒ•

     

    ๋ฐฉ๋ฒ• 1 : private ์ƒ์„ฑ์ž์— static ๋ฉ”์„œ๋“œ

    ์™ธ๋ถ€์—์„œ new ํ‚ค์›Œ๋“œ๋กœ Settings ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†๋„๋ก ์ƒ์„ฑ์ž๋ฅผ private๋กœ ์ง€์ •ํ•˜๊ณ ,

    ์—ฌ๋Ÿฌ ๊ณณ์—์„œ Settings์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ ธ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก getInstance()๋ฉ”์„œ๋“œ๋ฅผ static ์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค

    public class Settings {
        
        //private ์ƒ์„ฑ์ž
        private Settings() {}
    
        //static ์ธ์Šคํ„ด์Šค
        private static Settings instance;
    
        //์ธ์Šคํ„ด์Šค ๋ฐ˜ํ™˜ํ•˜๋Š” static getter ๋ฉ”์„œ๋“œ
        public static Settings getInstance(){
        	if(instance == null){
            	instance = new Settings();
            }
            return instance;
        }
        
    }
    --------------------------------------------------
    Settings setting1 = Settings.getInstance();
    Settings setting2 = Settings.getInstance();
    
    System.out.println(setting1 == setting2);
    //๊ฒฐ๊ณผ๊ฐ’ true

     

    ๋ฐฉ๋ฒ•1์˜ ๋ฌธ์ œ์ 

    ์›น์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ, ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

    ์Šค๋ ˆ๋“œA๊ฐ€ getInstance()์˜ if๋ฌธ์„ ํ†ต๊ณผํ•˜์—ฌ new Settings()๋ฅผ ํ†ตํ•ด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์ด์ „์—

    ์Šค๋ ˆ๋“œB๊ฐ€ getInstance()์˜ if๋ฌธ์„ ํ†ต๊ณผํ•˜์—ฌ new Settings()๋ฅผ ํ†ตํ•ด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผ๊ฒ ๋‹ค! ๋ผ๊ณ ํ•˜๋ฉด

     

    ๊ฒฐ๊ณผ์ ์œผ๋กœ ์Šค๋ ˆ๋“œA์™€ ์Šค๋ ˆ๋“œB๊ฐ€ ๊ฐ€์ง„ instance๋Š” ์„œ๋กœ ๋‹ค๋ฅธ instance๊ฐ€ ๋˜์–ด๋ฒ„๋ฆฐ๋‹ค.

    ์‹ฑ๊ธ€ํ†ค์€ ๋ฌด์กฐ๊ฑด instance๊ฐ€ 1๊ฐœ๋งŒ ์กด์žฌํ•ด์•ผํ•œ๋‹ค.

    ์Šค๋ ˆ๋“œA๊ฐ€ getInstance() ๋ฉ”์„œ๋“œ์— ์ ‘๊ทผํ•˜๋ฉด ์Šค๋ ˆ๋“œB๊ฐ€ getInstance()์— ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•  ์ˆ˜ ์—†์„๊นŒ?

     

     

     

    ๋ฐฉ๋ฒ• 2 : getInstance๋ฅผ ๋™๊ธฐํ™”(synchronized)์ฒ˜๋ฆฌํ•œ๋‹ค.

    synchronized ํ‚ค์›Œ๋“œ๋Š” ํ•œ๋ฒˆ์— ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•˜๊ฒŒ๋œ๋‹ค.

    ๋•Œ๋ฌธ์— ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋™์‹œ์„ฑ ๋ฌธ์ œ ์—†์ด ์‹ฑ๊ธ€ํ†ค์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค.

    public class Settings {
        
        //private ์ƒ์„ฑ์ž
        private Settings() {}
    
        //static ์ธ์Šคํ„ด์Šค
        private static Settings instance;
    
        //์ธ์Šคํ„ด์Šค ๋ฐ˜ํ™˜ํ•˜๋Š” static getter ๋ฉ”์„œ๋“œ
        public static synchronized Settings getInstance(){ //๐Ÿ”ฅ
        	if(instance == null){
            	instance = new Settings();
            }
            return instance;
        }
        
    }

     

     

     

    ๋ฐฉ๋ฒ•2์˜ ๋ฌธ์ œ์ 

    synchronized ํ‚ค์›Œ๋“œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ block/unblock ์ฒ˜๋ฆฌํ•˜์—ฌ ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š”๋ฐ,

    ์ด block/unblock ์ž‘์—…์˜ ๋น„์šฉ์ด ๋น„์‹ผํŽธ์ด๋ผ ์„ฑ๋Šฅ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.

     

     

    ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—†์„๊นŒ?

     

     

     

     

     

    ๋ฐฉ๋ฒ• 3 : ์ด๋ฅธ ์ดˆ๊ธฐํ™”(eager initialization)์„ ์‚ฌ์šฉํ•œ๋‹ค

    ์‚ฌ์‹ค Settings๊ฐ€ ํ•˜๋‚˜๋ฐ–์— ์—†์–ด์•ผํ•œ๋‹ค๋ฉด ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฏธ๋ฆฌ ๋งŒ๋“ค๊ณ ,

    ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ finalํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ์„œ๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    getInstance๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์‹œ์ ์— ๊ฐ์ฒด ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ณ , ์ƒ์„ฑํ•˜๋Š” if๋ฌธ๋„ ๊ตณ์ด ์—†์–ด๋„ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

     

    ๋˜ํ•œ ์ด๋ฏธ ๋งŒ๋“ค์–ด์ ธ์žˆ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜๋งŒ ํ•ด์ฃผ๋ฉด ๋˜๋‹ˆ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋„ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค!

    public class Settings {
        
        //private ์ƒ์„ฑ์ž
        private Settings() {}
    
        //static final ์ธ์Šคํ„ด์Šค
        private static final Settings instance = new Settings(); //๐Ÿ”ฅ
    
        //์ธ์Šคํ„ด์Šค ๋ฐ˜ํ™˜ํ•˜๋Š” static getter ๋ฉ”์„œ๋“œ
        public static Settings getInstance(){ //๐Ÿ”ฅ
            return instance;
        }
        
    }

     

     

     

    ๋ฐฉ๋ฒ•3์˜ ๋ฌธ์ œ์ 

    Settings๊ฐ€ ์•„์ฃผ ๋ฌด๊ฑฐ์šด ๊ฐ์ฒด์ด๋ฉด ์–ด๋–จ๊นŒ??

    ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๋”ฉ ์‹œ์ ์— ๋งŽ์€ ์ž์›์„ ํ• ์• ํ•˜์—ฌ Settings์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ

    ์‚ฌ์šฉ๋˜๋Š” ๋นˆ๋„๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ๋†’์ง€ ์•Š๋‹ค๋ฉด(์“ฐ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋„ ํฌํ•จ) ์ด๋ฅธ ์ดˆ๊ธฐํ™”๊ฐ€ ์˜คํžˆ๋ ค ๋…์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

     

     

     

     

    ๋ฐฉ๋ฒ• 4 : ํšจ์œจ์ ์ธ synchronized block : double checked locking 

    ๋ฐฉ๋ฒ• 3๋ฒˆ๊ณผ ๋‹ฌ๋ฆฌ ์ธ์Šคํ„ด์Šค๋ฅผ ๋‚˜์ค‘์— ๋งŒ๋“ค๊ณ  ์‹ถ๋‹คํ•˜๋ฉด

    ๋ฐฉ๋ฒ• 2๋ฒˆ์˜ synchronized ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋˜, double checked locking๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค

     

    ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์— volatile ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ

    volatile์€ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ์ ‘๊ทผํ•˜๋Š” ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ํ•ญ์ƒ ์ตœ์‹ ๊ฐ’์œผ๋กœ ์ฝ๊ฒŒํ•ด์ค€๋‹ค.

    (๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์ฐธ์กฐํ•˜๋ฏ€๋กœ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ๋„ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ๋จ)

    public class Settings {
        
        //private ์ƒ์„ฑ์ž
        private Settings() {}
    
        //static volatile ์ธ์Šคํ„ด์Šค
        private static volatile Settings instance;
    
        //์ธ์Šคํ„ด์Šค ๋ฐ˜ํ™˜ํ•˜๋Š” static getter ๋ฉ”์„œ๋“œ
        public static Settings getInstance(){ //๐Ÿ”ฅ
        	if(instance == null){
                synchronized (Settings.class){
                    if(instance == null){
                        instance = new Settings();
                    }
                }
            }
            return instance;
        }
        
    }

    ์ด ๋ฐฉ๋ฒ•์€ ๋งค๋ฒˆ synchronized ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.

    ๋“œ๋ฌผ๊ฒŒ ๋™์‹œ์— ์ ‘๊ทผํ•œ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ์˜ ๊ฒฝ์šฐ์—๋งŒ synchronized ์ฒ˜๋ฆฌ๊ฐ€ ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์—

    ๋ฐฉ๋ฒ• 2์—์„œ ๊ฑฑ์ •ํ•˜๋˜ synchronized ํ‚ค์›Œ๋“œ์˜ ๋น„์šฉ์ฒ˜๋ฆฌ๊ฐ€ ํ›จ์”ฌ ์ค„์–ด๋“ค์—ˆ๋‹ค.

     

    ๋˜ํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ํ˜ธ์ถœํ•˜๋Š” ์‹œ์ ์—์„œ์•ผ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— 

    ๋ฐฉ๋ฒ• 3์—์„œ ๊ฑฑ์ •ํ•˜๋˜ ์ด๋ฅธ ์ดˆ๊ธฐํ™”์˜ ๋ฌธ์ œ๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒŒ๋˜์—ˆ๋‹ค.

     

     

     

    ๋ฐฉ๋ฒ•4์˜ ๋ฌธ์ œ์ 

    volatile ํ‚ค์›Œ๋“œ๋ฅผ ์™œ ์‚ฌ์šฉํ•˜๋Š”์ง€, ์ „๋ฐ˜์ ์ธ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ํ•™์Šต๊ณก์„ ์ด ์žˆ๋‹ค

     

     

     

    ๋ฐฉ๋ฒ• 5 : static inner ํด๋ž˜์Šค ์‚ฌ์šฉํ•˜๊ธฐ (๊ฐ€์žฅ ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•โ—)

    ๊ฐ€์žฅ ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ค‘์— ํ•˜๋‚˜์ด๋‹ค.

    ๋˜ํ•œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ฒŒ Thread-safeํ•œ ์‹ฑ๊ธ€ํ†ค์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ์ด๋‹ค.

     

    ํด๋ž˜์Šค์˜ ๋กœ๋”ฉ ๋ฐ ์ดˆ๊ธฐํ™”๋Š” ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์‹œ๋„ํ•ด๋„ ์˜ค์ง ํ•œ๋ฒˆ๋งŒ ์ˆ˜ํ–‰๋œ๋‹ค.

    = ์‹ฑ๊ธ€ํ†ค ๋ณด์žฅ

     

    SettingsHolderํด๋ž˜์Šค๋ฅผ static inner class๋กœ ์„ ์–ธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—

    SettingsHolderํด๋ž˜์Šค๋Š” SettingsHolder.instance๋กœ ํ˜ธ์ถœ๋˜๋Š” ์‹œ์ ์— ์ดˆ๊ธฐํ™”๊ฐ€ ์ผ์–ด๋‚œ๋‹ค.

    = lazy loading ๋ณด์žฅ

    public class Settings {
        
        //private ์ƒ์„ฑ์ž
        private Settings() {}
    
        //private static inner class
        private static class SettingsHolder{    //๐Ÿ”ฅ
            private static final Settings instance = new Settings();
        }
    
        //static getter
        public static Settings getInstance(){   //๐Ÿ”ฅ
            return SettingsHolder.instance;
        }
        
    }

     

     

    ๐Ÿ”ฅํ—ท๊ฐˆ๋ฆฌ์ง€ ๋ง์ž!

    ์ž ๊น.. static์€ jvm์ด ์˜ฌ๋ผ๊ฐˆ๋•Œ ์ „๋ถ€ ์ดˆ๊ธฐํ™”๋˜๋Š”๊ฒƒ์ด ์•„๋‹Œ๊ฐ€?!

    ๋กœ๋”ฉ์™€ ์ดˆ๊ธฐํ™”์˜ ์ฐจ์ด๊ฐ€ ์žˆ๊ธฐ๋•Œ๋ฌธ์ด๋‹ค.
    ๋กœ๋”ฉ ? ํด๋ž˜์Šค ํŒŒ์ผ์„ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ์ฝ์–ด์™€ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค
    ์ดˆ๊ธฐํ™” ? ์Šˆํผ ํด๋ž˜์Šค ๋ฐ ์ •์ ํ•„๋“œ๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค

    ๊ฐ„๋‹จํžˆ ์–˜๊ธฐํ•˜๋ฉด ํด๋ž˜์Šค ๋กœ๋”ฉ์ˆœ์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค 
    1. Settings(outer) ํด๋ž˜์Šค ๋กœ๋”ฉ&์ดˆ๊ธฐํ™”
        SettingsHolder(inner) ํด๋ž˜์Šค ๋กœ๋”ฉ
    2. SettingsHolder.instace ํ˜ธ์ถœํ•˜๋ฉฐ SettingsHolder(inner) ํด๋ž˜์Šค ์ดˆ๊ธฐํ™”O

    (์ฐธ๊ณ  https://kdhyo98.tistory.com/70)

     

     

     

     

    ์‹ฑ๊ธ€ํ†ค์„ ๊นจํŠธ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•

    ์‚ฌ์‹ค.. ์™ธ๋ถ€์—์„œ ์‹ฑ๊ธ€ํ†ค์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์ƒ์„ฑ์ž๋ฅผ privateํ•˜๊ฒŒ ์„ ์–ธํ•˜์—ฌ ๋ง‰๋Š” ๋ฐฉ๋ฒ• ๋ฐ–์—๋Š” ์—†๋‹ค.

    ๋ฆฌํ”Œ๋ ‰์…˜, ์ง๋ ฌํ™”&์—ญ์ง๋ ฌํ™” ํ•œ๋‹ค๋ฉด ์‹ฑ๊ธ€ํ†ค์„ ๊นจํŠธ๋ฆด ์ˆ˜ ์žˆ๋‹ค!

     

    • ์ง๋ ฌํ™”&์—ญ์ง๋ ฌํ™”
      • ์—ญ์ง๋ ฌํ™”๋Š” Object readResolve() ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์‹ฑ๊ธ€ํ†ค์ด ๊นจ์ง€๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค
    • ๋ฆฌํ”Œ๋ ‰์…˜
      • Enum์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค
        • ์ž๋ฐ” ์ž์ฒด์—์„œ Enum์˜ ๋ฆฌํ”Œ๋ ‰์…˜์„ ๋ง‰๊ณ  ์žˆ๊ธฐ๋•Œ๋ฌธ
        • ์ง๋ ฌํ™”&์—ญ์ง๋ ฌํ™” ํ•ด๋„ ๋™์ผํ•œ ์ธ์Šคํ„ด์Šค๋กœ ๊ฐ„์ฃผํ•œ๋‹ค.
        • ์žฅ์  & ๋‹จ์  : ํด๋ž˜์Šค ๋กœ๋”ฉ ์‹œ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ง„๋‹ค๋Š” ๊ฒƒ!

     

     

     

     

     

     

    ๋ฐ˜์‘ํ˜•
    • ๋„ค์ด๋ฒ„ ๋ธ”๋Ÿฌ๊ทธ ๊ณต์œ ํ•˜๊ธฐ
    • ํŽ˜์ด์Šค๋ถ ๊ณต์œ ํ•˜๊ธฐ
    • ํŠธ์œ„ํ„ฐ ๊ณต์œ ํ•˜๊ธฐ
    • ๊ตฌ๊ธ€ ํ”Œ๋Ÿฌ์Šค ๊ณต์œ ํ•˜๊ธฐ
    • ์นด์นด์˜คํ†ก ๊ณต์œ ํ•˜๊ธฐ