Skip to content

Latest commit

Β 

History

History
138 lines (93 loc) Β· 3.91 KB

Singleton Pattern.md

File metadata and controls

138 lines (93 loc) Β· 3.91 KB

🍐☝️ Singleton Pattern

Assembled by Anna (2019-11-27)


Goal

  • Singleton Pattern 의 κ°œλ…μ„ μ•Œ 수 μžˆλ‹€.
  • Singleton Pattern 을 λ™μž‘μ›λ¦¬λ₯Ό 이해할 수 μžˆλ‹€.
  • Multi-thread ν™˜κ²½μ—μ„œμ˜ Singleton Pattern을 이해할 수 μžˆλ‹€.

What is Singleton?

Creating one-of-a-kind objects for which there is only one instance

단 ν•˜λ‚˜μ˜ 객체 λ₯Ό μƒμ„±ν•˜κ³  μƒμ„±λœ 객체λ₯Ό μ–΄λ””μ„œλ“  μ°Έμ‘°ν•  수 μžˆλ„λ‘ ν•˜λŠ” νŒ¨ν„΄μž…λ‹ˆλ‹€.

μ—¬κΈ°μ„œ μ£Όμ˜ν•  점은 클래슀λ₯Ό static으둜 μ„ μ–Έν•˜λŠ” 것이 μ•„λ‹Œ, λ™μ μœΌλ‘œ μƒμ„±ν•˜κ³  heap μ˜μ—­μ—μ„œ GC둜 κ΄€λ¦¬λ˜λ„λ‘ ν•˜λ˜, 단 ν•˜λ‚˜μ˜ 객체λ₯Ό μƒμ„±ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.


Singleton κ΅¬ν˜„κ³Ό μ‚¬μš©

Singleton κ΅¬ν˜„ 방법

Singleton을 κ°„λ‹¨νžˆ κ΅¬ν˜„ν•˜λ©΄ λ‹€μŒκ³Ό 같이 λ‚˜νƒ€λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

public class Singleton {
    private static Singleton instance; // 2
    private Singleton() {} // 1
    public static Singleton getInstance() // 3
        if(instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
  1. μƒμ„±μž

    μƒμ„±μžλ₯Ό private μ§€μ •μžλ₯Ό μ‚¬μš©ν•˜μ—¬ μ™ΈλΆ€ ν΄λž˜μŠ€μ—μ„œ μƒμ„±ν•˜μ§€ λͺ»ν•˜λ„둝 ν•©λ‹ˆλ‹€.

  2. instance

    Singleton의 κ°μ²΄μž…λ‹ˆλ‹€. μ™ΈλΆ€ ν΄λž˜μŠ€μ—μ„œλŠ” ν•΄λ‹Ή 객체λ₯Ό μ‚¬μš©ν•˜κ²Œ λ©λ‹ˆλ‹€. λ§ˆμ°¬κ°€μ§€λ‘œ private μ§€μ •μžλ₯Ό μ‚¬μš©ν•˜μ—¬ μ™ΈλΆ€ ν΄λž˜μŠ€μ—μ„œ μ§μ ‘μ μœΌλ‘œ μ ‘κ·Όν•˜μ§€ λͺ»ν•˜κ²Œ ν•©λ‹ˆλ‹€.

  3. getInstance()

    μ™ΈλΆ€μ˜ λͺ¨λ“  ν΄λž˜μŠ€μ—μ„œ ν˜ΈμΆœν•˜μ—¬ Singleton 객체λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    1. ν˜ΈμΆœμ„ ν•˜κ²Œλ˜λ©΄, λ¨Όμ € 객체가 μƒμ„±λ˜μ—ˆλŠ” 지λ₯Ό νŒλ³„ν•©λ‹ˆλ‹€.
    2. μƒμ„±λ˜μ§€ μ•Šμ•˜λ‹€λ©΄, instance에 Singleton 객체λ₯Ό μƒμ„±ν•˜μ—¬ λ„£μ–΄μ€λ‹ˆλ‹€.
    3. instanceλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

Singleton μ‚¬μš©

μ™ΈλΆ€ ν΄λž˜μŠ€μ—μ„œ λ‹€μŒκ³Ό 같이 Singleton 객체λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

public class AnotherClass {
    void usingSingleton() {
        Singleton inst = Singleton.getInstance();
    }
}

Multi-Thread ν™˜κ²½μ—μ„œμ˜ Singleton

λ§Œμ•½, Multi-thread ν™˜κ²½μ—μ„œ 두 개 μ΄μƒμ˜ μŠ€λ ˆλ“œκ°€ getInstance() ν•¨μˆ˜μ— μ§„μž…ν•œλ‹€κ³  ν•  λ•Œ 두 개 μ΄μƒμ˜ 객체가 생성될 수 μžˆμŠ΅λ‹ˆλ‹€.

해결방법

  1. 미리 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” 방법.

    public class Singleton {
        private static Singleton instance = new Singleton();
        private Singleton() {}
        public static Singleton getInstance()
            return instance;
        }
    }

    미리 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ²Œ 되면, λΆˆν•„μš”ν•œ μ‹œμŠ€ν…œ λ¦¬μ†ŒμŠ€λ₯Ό λ‚­λΉ„ν•˜κ²Œ 될 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

  2. synchronized λ₯Ό μ‚¬μš©ν•˜λŠ” 방법.

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

    getInstance() λ©”μ†Œλ“œλ₯Ό λ™κΈ°ν™”ν•˜λŠ” λ°©λ²•μœΌλ‘œ, λ™κΈ°ν™”λ‘œ 인해 μˆ˜ν–‰ μ‹œκ°„μ΄ λŠλ €μ§„λ‹€λŠ” 단점이 μžˆμŠ΅λ‹ˆλ‹€.

  3. λ‚΄λΆ€ static 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” 방법.

    public class Singleton {
        private Singleton() {}
        public static Singleton getInstance() {
            return LazyHolder.INSTANCE;
        }
        // LazyHolder 기법 μ‚¬μš©.
    	private static class LazyHolder {
        	private static final Singleton INSTANCE = new Singleton();
    	}
    }

    LazyHolder ν΄λž˜μŠ€λŠ” getInstance() κ°€ ν˜ΈμΆœλ˜λŠ” μˆœκ°„ Classκ°€ λ‘œλ”©λ˜λ©°, 이 μˆœκ°„μ€ thread-safe κ°€ 보μž₯되기 λ•Œλ¬Έμ—, syncronized λ‚˜ volatile λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³ λ„ μ•ˆμ „ν•˜κ²Œ μ‚¬μš©κ°€λŠ₯ν•©λ‹ˆλ‹€.


Reference & Additional Resources