λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
λ””μžμΈνŒ¨ν„΄

싱글톀 νŒ¨ν„΄

by μ„œμ•„λž‘πŸ˜ 2023. 1. 3.
βœ… 싱글톀 νŒ¨ν„΄
μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‹œμž‘λ  λ•Œ μ–΄λ–€ ν΄λž˜μŠ€κ°€ μ΅œμ΄ˆ ν•œλ²ˆλ§Œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•˜κ³ (Static) κ·Έ λ©”λͺ¨λ¦¬μ— μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€μ–΄ μ‚¬μš©ν•˜λŠ” λ””μžμΈνŒ¨ν„΄.

 

μƒμ„±μžκ°€ μ—¬λŸ¬ μ°¨λ‘€ ν˜ΈμΆœλ˜λ”λΌλ„ μ‹€μ œλ‘œ μƒμ„±λ˜λŠ” κ°μ²΄λŠ” ν•˜λ‚˜κ³  졜초 생성 이후에 호좜된 μƒμ„±μžλŠ” μ΅œμ΄ˆμ— μƒμ„±ν•œ 객체λ₯Ό λ°˜ν™˜ν•œλ‹€. (μžλ°”μ—μ„  μƒμ„±μžλ₯Ό private둜 μ„ μ–Έν•΄μ„œ 생성 λΆˆκ°€ν•˜κ²Œ ν•˜κ³  getInstance()둜 받아쓰기도 ν•¨)
=> 싱글톀 νŒ¨ν„΄μ€ 단 ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό 생성해 μ‚¬μš©ν•˜λŠ” λ””μžμΈ νŒ¨ν„΄μ΄λ‹€.
(μΈμŠ€ν„΄μŠ€κ°€ ν•„μš” ν•  λ•Œ λ˜‘κ°™μ€ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€μ–΄ λ‚΄λŠ” 것이 μ•„λ‹ˆλΌ, 동일(κΈ°μ‘΄) μΈμŠ€ν„΄μŠ€λ₯Ό μ‚¬μš©ν•˜κ²Œν•¨)
 

 

βœ… 싱글톀 νŒ¨ν„΄μ„ μ“°λŠ” 이유

 

κ³ μ •λœ λ©”λͺ¨λ¦¬ μ˜μ—­μ„ μ–»μœΌλ©΄μ„œ ν•œλ²ˆμ˜ new둜 μΈμŠ€ν„΄μŠ€λ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬ λ‚­λΉ„λ₯Ό 방지할 수 있음
λ˜ν•œ μ‹±κΈ€ν†€μœΌλ‘œ λ§Œλ“€μ–΄μ§„ 클래슀의 μΈμŠ€ν„΄μŠ€λŠ” μ „μ—­ μΈμŠ€ν„΄μŠ€μ΄κΈ° λ•Œλ¬Έμ— λ‹€λ₯Έ 클래슀의 μΈμŠ€ν„΄μŠ€λ“€μ΄ 데이터λ₯Ό κ³΅μœ ν•˜κΈ° 쉽닀.
DBCP(DataBase Connection Pool)처럼 κ³΅ν†΅λœ 객체λ₯Ό μ—¬λŸ¬κ°œ μƒμ„±ν•΄μ„œ μ‚¬μš©ν•΄μ•Όν•˜λŠ” μƒν™©μ—μ„œ 많이 μ‚¬μš©.
(μ“°λ ˆλ“œν’€, μΊμ‹œ, λŒ€ν™”μƒμž, μ‚¬μš©μž μ„€μ •, λ ˆμ§€μŠ€νŠΈλ¦¬ μ„€μ •, 둜그 기둝 객체등)
μ•ˆλ“œλ‘œμ΄λ“œ μ•± 같은 경우 각 μ•‘ν‹°λΉ„ν‹°λ‚˜ ν΄λž˜μŠ€λ³„λ‘œ μ£Όμš” ν΄λž˜μŠ€λ“€μ„ 일일이 μ „λ‹¬ν•˜κΈ°κ°€ 번거둭기 λ•Œλ¬Έμ— 싱글톀 클래슀λ₯Ό λ§Œλ“€μ–΄ μ–΄λ””μ„œλ‚˜ μ ‘κ·Όν•˜λ„λ‘ μ„€κ³„ν•˜λŠ” 것이 νŽΈν•˜κΈ° λ•Œλ¬Έ...
+ μΈμŠ€ν„΄μŠ€κ°€ μ ˆλŒ€μ μœΌλ‘œ ν•œκ°œλ§Œ μ‘΄μž¬ν•˜λŠ” 것을 λ³΄μ¦ν•˜κ³  싢을 경우 μ‚¬μš©.
+ 두 번째 μ΄μš©μ‹œλΆ€ν„°λŠ” 객체 λ‘œλ”© μ‹œκ°„μ΄ ν˜„μ €ν•˜κ²Œ 쀄어 μ„±λŠ₯이 μ’‹μ•„μ§€λŠ” μž₯점!

 

 
βœ… 싱글톀 νŒ¨ν„΄μ˜ 문제점
싱글톀 μΈμŠ€ν„΄μŠ€κ°€ λ„ˆλ¬΄ λ§Žμ€ 일을 ν•˜κ±°λ‚˜ λ§Žμ€ 데이터λ₯Ό κ³΅μœ μ‹œν‚¬ 경우 λ‹€λ₯Έ 클래슀의 μΈμŠ€ν„΄μŠ€λ“€ 간에 결합도가 λ†’μ•„μ Έ "개방-폐쇄 원칙" 을 μœ„λ°°ν•˜κ²Œ λœλ‹€. (=객체 지ν–₯ 섀계 원칙에 어긋남)
λ”°λΌμ„œ μˆ˜μ •μ΄ μ–΄λ €μ›Œμ§€κ³  ν…ŒμŠ€νŠΈν•˜κΈ° μ–΄λ €μ›Œμ§„λ‹€.
λ˜ν•œ λ©€ν‹°μ“°λ ˆλ“œν™˜κ²½μ—μ„œ λ™κΈ°ν™”μ²˜λ¦¬λ₯Ό μ•ˆν•˜λ©΄ μΈμŠ€ν„΄μŠ€κ°€ λ‘κ°œκ°€ μƒμ„±λœλ‹€λ“ μ§€ ν•˜λŠ” κ²½μš°κ°€ λ°œμƒν•  수 있음
κ°œλ°œμ„ ν• λ•Œ 항상 λ“€μ–΄μ˜¨ gotoλŠ” μ“°λ©΄ μ•ˆλΌ! μ „μ—­ κ°μ²΄λŠ” μ•ˆ 쒋은거야! λΌλŠ” 말 처럼 κΌ­ ν•„μš”ν•œ κ²½μš°μ•„λ‹ˆλ©΄ 지양해야함. // 적절히 잘 μ“°λ©΄ μ•„μ£Ό μ’‹μŒ, (그게 어렡지)
 
 

전역적인 접근점을 제곡

λ‘œκΉ…, μ½˜ν…μΈ  λ‘œλ”©, κ²Œμž„ μ €μž₯ λ“± μ—¬λŸ¬ λ‚΄λΆ€ μ‹œμŠ€ν…œμ—μ„œ 파일 μ‹œμŠ€ν…œ 래퍼 클래슀λ₯Ό μ‚¬μš©ν•  것이닀. 이듀 μ‹œμŠ€ν…œμ—μ„œ 파일 μ‹œμŠ€ν…œ 클래슀 μΈμŠ€ν„΄μŠ€λ₯Ό λ”°λ‘œ 생성할 수 μ—†μœΌλ―€λ‘œ μ‹±κΈ€ν„΄ νŒ¨ν„΄μ€ ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ§Œ μƒμ„±ν•˜λŠ” 것에 λ”ν•΄μ„œ, κ·Έ μΈμŠ€ν„΄μŠ€λ₯Ό μ „μ—­μ—μ„œ μ ‘κ·Όν•  수 μž‡λŠ” λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•œλ‹€.

 

class FileSystem {
public:
    static FileSystem& instance() 
    {
        // 게으λ₯Έ μ΄ˆκΈ°ν™”
        if(instance_ NULL) {
        instance_ = new FileSystem();
    }

    return *instance_;
    }

private:
    FileSystem() {}
    static FileSystem* instance_;
}​
instance_ 정적 멀버 λ³€μˆ˜λŠ” 클래슀 μΈμŠ€ν„΄μŠ€λ₯Ό μ €μž₯ν•œλ‹€. μƒμ„±μžκ°€ private이기 λ•Œλ¬Έμ— λ°–μ—μ„œλŠ” 생성할 수 μ—†λ‹€. instance() 정적 λ©”μ„œλ“œλŠ” μ½”λ“œ μ–΄λ””μ—μ„œλ‚˜ μ‹±κΈ€ν„΄ μΈμŠ€ν„΄μŠ€μ— μ ‘κ·Όν•  수 있게 ν•˜κ³ , 싱글턴을 μ‹€μ œλ‘œ ν•„μš”λ‘œ ν•  λ•ŒκΉŒμ§€ μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™”λ₯Ό λ―Έλ£¨λŠ” μ—­ν• (게으λ₯Έ μ΄ˆκΈ°ν™”)도 ν•œλ‹€.
μš”μ¦˜μ—λŠ” μ΄λ ‡κ²Œλ„ λ§Œλ“ λ‹€.
class FileSystem 
{
public:
    static FileSystem& instance() 
    {
        static FileSystem* instance = new FileSystem();
        return *instance;
    }

private:
    FileSystem() {}
}
C++ 11μ—μ„œλŠ” 정적 지역 λ³€μˆ˜ μ΄ˆκΈ°ν™” μ½”λ“œκ°€ λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œλ„ λ”± ν•œλ²ˆ μ‹€ν–‰λ˜μ–΄μ•Ό ν•œλ‹€. 즉, μ΅œμ‹  C++ 컴파일둜 μ»΄νŒŒμΌν•˜λ©΄ 이 μ½”λ“œλŠ” 이전 μ˜ˆμ œμ™€λŠ” 달리 μŠ€λ ˆλ“œ μ•ˆμ „ν•˜λ‹€.
 
 
좜처: https://boycoding.tistory.com/109 [μ†Œλ…„μ½”λ”©]

 

λŒ“κΈ€