STUDY πŸ“š/CS

[λ””μžμΈ νŒ¨ν„΄] 싱글톀 νŒ¨ν„΄(singleton pattern)

daxx0ne 2023. 3. 21. 18:10

πŸ’‘ λ””μžμΈ νŒ¨ν„΄μ΄λž€?: ν”„λ‘œκ·Έλž¨ 섀계할 λ•Œ λ°œμƒν–ˆλ˜ λ¬Έμ œμ λ“€μ„ 객체 κ°„μ˜ μƒν˜Έ 관계 등을 μ΄μš©ν•˜μ—¬ ν•΄κ²°ν•  수 μžˆλ„λ‘ ν•˜λ‚˜μ˜ κ·œμ•½ ν˜•νƒœλ‘œ λ§Œλ“€μ–΄ 놓은 것을 μ˜λ―Έν•œλ‹€!


싱글톀 νŒ¨ν„΄

: ν•˜λ‚˜μ˜ ν΄λž˜μŠ€μ— 였직 ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ§Œ κ°€μ§€λŠ” νŒ¨ν„΄μ΄λ‹€.

  • ν•˜λ‚˜μ˜ 클래슀λ₯Ό 기반으둜 μ—¬λŸ¬ 개의 κ°œλ³„μ μΈ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€ 수 μžˆμ§€λ§Œ, κ·Έλ ‡κ²Œ ν•˜μ§€ μ•Šκ³  ν•˜λ‚˜μ˜ 클래슀λ₯Ό 기반으둜 단 ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€μ–΄ 이λ₯Ό 기반으둜 λ‘œμ§μ„ λ§Œλ“œλŠ” 데 쓰이며, 보톡 λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²° λͺ¨λ“ˆμ— 많이 μ‚¬μš©λœλ‹€!

μž₯점

  • ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€μ–΄ 놓고 ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€λ₯Ό λ‹€λ₯Έ λͺ¨λ“ˆλ“€μ΄ κ³΅μœ ν•˜λ©° μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— 생성할 λ•Œ λΉ„μš©μ΄ 적게 즘

 

단점

  • λͺ¨λ“ˆ κ°„ 결합을 κ°•ν•˜κ²Œ λ§Œλ“€κΈ° λ•Œλ¬Έμ— μ˜μ‘΄μ„±(쒅속성)이 높아짐
  • TDDλ₯Ό ν•  λ•Œ 걸림돌이 됨
    • λ‹¨μœ„ ν…ŒμŠ€νŠΈλŠ” ν…ŒμŠ€νŠΈκ°€ μ„œλ‘œ 독립적이어야 ν•˜λ©° μ–΄λ–€ μˆœμ„œλ‘œλ“  ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•  수 μžˆμ–΄μ•Ό ν•˜μ§€λ§Œ,
    • 싱글톀 νŒ¨ν„΄μ€ 미리 μƒμ„±λœ ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό 기반으둜 κ΅¬ν˜„ν•˜λŠ” νŒ¨ν„΄μ΄λ―€λ‘œ 각 ν…ŒμŠ€νŠΈλ§ˆλ‹€ 독립적인 μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€κΈ°κ°€ 어렀움

 

예제 μ½”λ“œ

class Singleton {
    private static class singleInstanceHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    public static Singleton getInstance() {
        return singleInstanceHolder.INSTANCE;
    }
}

public class HelloWorld{ 
     public static void main(String []args){ 
        Singleton a = Singleton.getInstance(); 
        Singleton b = Singleton.getInstance(); 
        System.out.println(a.hashCode());
        System.out.println(b.hashCode());  
        if (a == b){
         System.out.println(true); 
        } 
     }
}

쀑첩 클래슀λ₯Ό μ΄μš©ν•΄μ„œ λ§Œλ“œλŠ” 방법이 κ°€μž₯ λŒ€μ€‘μ μž„

  • singleInstanceHolder 클래슀λ₯Ό 기반으둜 객체λ₯Ό μ„ μ–Έν–ˆκΈ° λ•Œλ¬Έμ— ν•œ 번만 λ‘œλ“œλ¨
    • 싱글톀 클래슀의 μΈμŠ€ν„΄μŠ€λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‹Ή ν•˜λ‚˜λ§Œ 쑴재
    • ν΄λž˜μŠ€κ°€ λ‘λ²ˆ λ‘œλ“œλ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 두 μŠ€λ ˆλ“œκ°€ λ™μΌν•œ JVMμ—μ„œ 2개의 μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 있음
  • 싱글톀 ν΄λž˜μŠ€κ°€ λ‘œλ“œλ  λ•Œ ν΄λž˜μŠ€κ°€ λ©”λͺ¨λ¦¬μ— λ‘œλ“œλ˜μ§€ μ•Šκ³  μ–΄λ– ν•œ λͺ¨λ“ˆμ—μ„œ getInstance() λ©”μ„œλ“œκ°€ ν˜ΈμΆœν•  λ•Œ 싱글톀 객체λ₯Ό 졜초 생성 및 λ¦¬ν„΄ν•˜κ²Œ 됨

μ˜μ‘΄μ„± μ£Όμž…

  • μœ„μ˜ 단점과 같이 싱글톀 νŒ¨ν„΄μ€ 결합도가 λ†’λ‹€λŠ” 단점을 ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ˜μ‘΄μ„± μ£Όμž…μ„ 톡해 λͺ¨λ“ˆ κ°„μ˜ 결합을 쑰금 더 λŠμŠ¨ν•˜κ²Œ λ§Œλ“€ 수 있음
  • 메인 λͺ¨λ“ˆμ΄ 직접 λ‹€λ₯Έ ν•˜μœ„ λͺ¨λ“ˆμ— λŒ€ν•œ μ˜μ‘΄μ„±μ„ μ£ΌκΈ°λ³΄λ‹€λŠ”
    • 쀑간에 μ˜μ‘΄μ„± μ£Όμž…μžκ°€ 이 뢀뢄을 κ°€λ‘œμ±„ 메인 λͺ¨λ“ˆμ΄ κ°„μ ‘μ μœΌλ‘œ μ˜μ‘΄μ„±μ„ μ£Όμž…ν•˜λŠ” 방식

μž₯점

  • λͺ¨λ“ˆλ“€μ„ μ‰½κ²Œ ꡐ체할 수 μžˆλŠ” ꡬ쑰가 λ˜μ–΄ ν…ŒμŠ€νŒ…ν•˜κΈ° 쉽고 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ν•˜κΈ°λ„ μˆ˜μ›”ν•΄μ§
  • κ΅¬ν˜„ν•  λ•Œ 좔상화 λ ˆμ΄μ–΄λ₯Ό λ„£κ³  이λ₯Ό 기반으둜 κ΅¬ν˜„μ²΄λ₯Ό λ„£μ–΄ μ£ΌκΈ° λ•Œλ¬Έμ— μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ˜μ‘΄μ„± λ°©ν–₯이 일관됨
  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‰½κ²Œ μΆ”λ‘ ν•  수 있음
  • λͺ¨λ“ˆ κ°„μ˜ 관계듀이 쑰금 더 λͺ…확해짐

 

단점

  • λͺ¨λ“ˆλ“€μ΄ λ”μš± 더 λΆ„λ¦¬λ˜λ―€λ‘œ 클래슀 μˆ˜κ°€ λŠ˜μ–΄λ‚˜ λ³΅μž‘μ„±μ΄ 증가될 수 있음
  • μ•½κ°„μ˜ λŸ°νƒ€μž„ νŒ¨λ„ν‹°κ°€ 생기기도함

 

μ˜μ‘΄μ„± μ£Όμž… 원칙

“μƒμœ„ λͺ¨λ“ˆμ€ ν•˜μœ„ λͺ¨λ“ˆμ—μ„œ μ–΄λ– ν•œ 것도 κ°€μ Έμ˜€μ§€ μ•Šμ•„μ•Ό ν•˜κ³  λ‘˜ λ‹€ 좔상화에 μ˜μ‘΄ν•΄μ•Ό ν•˜λ©°, μΆ”μƒν™”λŠ” μ„ΈλΆ€ 사항에 μ˜μ‘΄ν•˜μ§€ 말아야 ν•œλ‹€”