λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Java/Java 이둠

μ‹±κΈ€ν„΄ νŒ¨ν„΄ (Singleton pattern)

μ‹±κΈ€ν„΄ νŒ¨ν„΄

μžλ°”λ‘œ κ°œλ°œμ„ ν•  λ•Œ, νŠΉμ • ν΄λž˜μŠ€κ°€ λ‹€μˆ˜μ˜ μΈμŠ€ν„΄μŠ€λ‘œ μ—¬λŸ¬ 번 μƒμ„±λœλ‹€λ©΄, λ¬Έμ œκ°€ 될 수 μžˆλ‹€.
μžλ°”μ—μ„  이λ₯Ό λ””μžμΈ νŒ¨ν„΄ 쀑 ν•˜λ‚˜μΈ μ‹±κΈ€ν„΄ νŒ¨ν„΄(Singleton pattern) 으둜 λ°©μ§€ν•œλ‹€.

μ‹±κΈ€ν„΄ νŒ¨ν„΄μ˜ μ‚¬μš©

컀λ„₯μ…˜ ν’€, μŠ€λ ˆλ“œ ν’€κ³Ό 같은 μžμ›μ„ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” ν΄λž˜μŠ€λ“€μ΄ μΈμŠ€ν„΄μŠ€λ₯Ό μ—¬λŸ¬ 번 λ§Œλ“€λ©΄, μžμ›μ˜ λ‚­λΉ„κ°€ 되고, μ˜ˆμƒν•  수 μ—†λŠ” 였λ₯˜κ°€ λ°œμƒν•  수 μžˆλ‹€.

μ‹±κΈ€ν„΄ νŒ¨ν„΄μ„ μ μš©ν•œ ν΄λž˜μŠ€μ—λŠ”, μƒμ„±μžμ— μ œμ•½μ„ κ±Έμ–΄μ„œ ν•„μš”ν•œ 객체λ₯Ό ν•˜λ‚˜λ§Œ λ§Œλ“€λ„λ‘ ν•˜λŠ” λ””μžμΈ νŒ¨ν„΄μ΄λ‹€.

μ‹±κΈ€ν„΄ νŒ¨ν„΄μ˜ κ·œμΉ™

μ‹±κΈ€ν„΄ νŒ¨ν„΄μ˜ 클래슀λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄μ„œλŠ” λ‹€μŒμ˜ κ·œμΉ™μ΄ μžˆμ–΄μ•Ό ν•œλ‹€.

  • μƒμ„±μžμ˜ μ ‘κ·Όμ œμ–΄μžλ₯Ό private둜 ν•˜μ—¬ μ™ΈλΆ€μ—μ„œ μƒμ„±ν•˜μ§€ λͺ»ν•˜λ„둝 ν•œλ‹€.
  • ν•˜λ‚˜λ§Œ μ‘΄μž¬ν•˜λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•  수 μžˆλŠ” 정적 λ©”μ„œλ“œλ₯Ό λ§Œλ“€μ–΄μ•Ό ν•œλ‹€.
  • ν•˜λ‚˜λ§Œ μ‘΄μž¬ν•˜λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•  수 μžˆλŠ” 정적 μ°Έμ‘° λ³€μˆ˜λ₯Ό λ§Œλ“€μ–΄μ•Ό ν•œλ‹€.

μ‹±κΈ€ν„΄ νŒ¨ν„΄μ„ μ μš©ν•œ 클래슀

데이터 λ² μ΄μŠ€μ™€ μ—°κ²°ν•˜λŠ” κ°€μƒμ˜ 클래슀 SingletonExκ°€ μžˆλ‹€κ³  ν•˜μž.

public class SingletonEx {
    private SingletonEx() {};
    // 1번 κ·œμΉ™

    static SingletonEx SingletonExInstance;
    // 2번 κ·œμΉ™

    public static SingletonEx getInstance() {
    // 3번 κ·œμΉ™
        if(SingletonExInstance == null) {
            SingletonExInstance = new SingletonEx();
        }
        return SingletonExInstance;
    }

}

μ•žμ„œ μ„œμˆ ν•œ μ„Έ 가지 κ·œμΉ™μ— λŒ€ν•œ μ‹±κΈ€ν„΄ νŒ¨ν„΄μ˜ ν΄λž˜μŠ€μ΄λ‹€.

κ·œμΉ™μ— 따라 λ‚΄λΆ€ μ½”λ“œλ₯Ό ν•˜λ‚˜ν•˜λ‚˜ μ‚΄νŽ΄λ³΄μž.

  private SingletonEx() {};
  // 1번 κ·œμΉ™

μƒμ„±μžμ˜ μ ‘κ·Όμ œμ–΄μžλ₯Ό private둜 ν•˜μ—¬ μ™ΈλΆ€μ—μ„œ μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 없도둝 막아놨닀.

  static SingletonEx SingletonExInstance;
  // 2번 κ·œμΉ™

μ „μ—­μœΌλ‘œ μœ μΌν•˜κ²Œ μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•  수 μžˆλŠ” μ°Έμ‘° λ³€μˆ˜μ΄κΈ° λ•Œλ¬Έμ— μ •μ μœΌλ‘œ μ„ μ–Έν–ˆλ‹€.

    public static SingletonEx getInstance() {
    // 3번 κ·œμΉ™
        if(SingletonExInstance == null) {
            SingletonExInstance = new SingletonEx();
        }
        return SingletonExInstance;
    }

정적 μ°Έμ‘° λ³€μˆ˜λ₯Ό λ°˜ν™˜ν•  정적 λ©”μ„œλ“œμ΄λ‹€.

if문을 μ„€λͺ…ν•˜μžλ©΄, 졜초둜 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν–ˆμ„ 땐 λ‹Ήμ—°νžˆ μ‹±κΈ€ν„΄ νŒ¨ν„΄μ˜ μΈμŠ€ν„΄μŠ€λ„ 없을 것이기 λ•Œλ¬Έμ—,

SingletonExInstance이 null인지?둜 κ·Έ 유무λ₯Ό νŒλ‹¨ν•˜κ³  μΈμŠ€ν„΄μŠ€κ°€ μ—†λ‹€λ©΄, privateν•œ μƒμ„±μžλ₯Ό 톡해 μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€μ–΄μ€€λ‹€.

μœ μΌν•œ μΈμŠ€ν„΄μŠ€κ°€ μ‘΄μž¬ν•˜λŠ” μƒνƒœλΌλ©΄ 정적 μ°Έμ‘° λ³€μˆ˜λ₯Ό return으둜 λ°˜ν™˜ν•œλ‹€.

Test μ½”λ“œ

public class SingletonTest {

    public static void main(String[] args) {
        //SingletonEx exam1 = new SingletonEx();
        //The constructor SingletonEx() is not visible

        SingletonEx exam2 = SingletonEx.getInstance();
        SingletonEx exam3 = SingletonEx.getInstance();
        SingletonEx exam4 = SingletonEx.getInstance();

        System.out.println(exam2);
        System.out.println(exam3);
        System.out.println(exam4);
    }

}

 

        //SingletonEx exam1 = new SingletonEx();
        //The constructor SingletonEx() is not visible

SingletonEx exam1 = new SingletonEx(); λΌλŠ” μ½”λ“œλŠ”,

The constructor SingletonEx() is not visible 라고 λ‚˜μ˜¨λ‹€.

μ‹±κΈ€ν„΄ νŒ¨ν„΄ μ μš©μ„ μœ„ν•΄ μƒμ„±μžλ₯Ό private으둜 λ§‰μ•„λ‘μ—ˆκΈ° λ•Œλ¬Έμ΄λ‹€.

        SingletonEx exam2 = SingletonEx.getInstance();
        SingletonEx exam3 = SingletonEx.getInstance();
        SingletonEx exam4 = SingletonEx.getInstance();

        System.out.println(exam2);
        System.out.println(exam3);
        System.out.println(exam4);

getInstance() λŠ” 정적 λ©”μ„œλ“œμž„μœΌλ‘œ, 클래슀λͺ….getInstance()둜 ν˜ΈμΆœν•˜μ˜€κ³ ,

System.out.println(...) 에 λŒ€ν•œ κ²°κ³ΌλŠ” λͺ¨λ‘ λ™μΌν•œ 클래슀의 해쉬 μ½”λ“œκ°’μ΄ λ‚˜μ˜€λŠ” κ±Έ μ•Œ 수 μžˆλ‹€.

μ£Όμ˜μ‚¬ν•­

μ‹±κΈ€ν„΄ νŒ¨ν„΄μœΌλ‘œ λ§Œλ“€μ–΄μ§„ 단일 κ°μ²΄λŠ” μ „μ—­μ—μ„œ κ³΅μœ ν•  수 μžˆλŠ” λ³€μˆ˜μ΄κΈ° λ•Œλ¬Έμ—, 속성을 갖지 μ•ŠλŠ” 것이 μ’‹λ‹€.

ν•˜μ§€λ§Œ 읽기 μ „μš©μœΌλ‘œ 속성을 κ°–λŠ” 것은 λ¬Έμ œκ°€ λ˜μ§€ μ•ŠλŠ”λ‹€.