개발자 HOON
πŸ› HOON DEVLog
개발자 HOON
전체 방문자
였늘
μ–΄μ œ
  • 😎 전체 μΉ΄ν…Œκ³ λ¦¬ (137)
    • πŸ“ μ‹ μž… 인터뷰 μ€€λΉ„ (7)
    • πŸ¦” μ·¨μ—…μ€€λΉ„ 기둝 (7)
    • β˜• μžλ°” : JAVA (5)
    • 🐍 μ½”λ”©ν…ŒμŠ€νŠΈ λŒ€λΉ„ : PS (80)
    • 🌱 λ°±μ—”λ“œ : Backend (13)
    • πŸ§ͺ 컴퓨터과학 : CS (11)
    • πŸ—‚ λ°μ΄ν„°λ² μ΄μŠ€ : DB (1)
    • πŸƒ‍♂️ DEVLOG (8)
    • βš™οΈ Trouble Shooting (5)

λΈ”λ‘œκ·Έ 메뉴

  • ν™ˆ
  • GitHub
  • Resume

곡지사항

인기 κΈ€

졜근 κΈ€

ν‹°μŠ€ν† λ¦¬

hELLO Β· Designed By μ •μƒμš°.
개발자 HOON

πŸ› HOON DEVLog

πŸ§ͺ 컴퓨터과학 : CS

[λ””μžμΈνŒ¨ν„΄] λ””μžμΈ νŒ¨ν„΄(2) - 싱글톀 νŒ¨ν„΄(Singleton Pattern)

2022. 12. 27. 00:54

 

🏝 1. 싱글톀 νŒ¨ν„΄(Singleton Pattern)μ΄λž€?

 

싱글톀 νŒ¨ν„΄μ€, μ–΄λ– ν•œ 클래슀(객체)κ°€ μœ μΌν•˜κ²Œ 단 ν•œ 개만 μ‘΄μž¬ν•΄μ•Ό ν•  λ•Œ μ‚¬μš©ν•˜κ²Œ λ©λ‹ˆλ‹€. 주둜 μ„œλ‘œ μžμ›μ„ κ³΅μœ ν•  λ•Œ μ‚¬μš©ν•˜λ©°, μƒμ„±λœ 단 ν•˜λ‚˜μ˜ 객체λ₯Ό κ³΅μœ ν•˜λ©° μ‚¬μš©ν•˜κ²Œ λ©λ‹ˆλ‹€.

 

싱글톀 νŒ¨ν„΄μ€ λ””μžμΈ νŒ¨ν„΄ 쀑에, '생성' νŒ¨ν„΄μ— μ†ν•©λ‹ˆλ‹€. 싱글톀 νŒ¨ν„΄μ„ 톡해 단 ν•œ 번의 생성을 보μž₯ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

 

ν”„λ‘œκ·Έλž˜λ°μ—μ„œμ˜ μ˜ˆμ‹œλ‘œλŠ” TCP socket ν†΅μ‹ μ—μ„œ μ„œλ²„μ™€ μ—°κ²°λœ connect 객체에 주둜 μ‚¬μš©ν•΄μ„œ ν•œ μ†ŒμΌ“μ—μ„œλ§Œ μ‚¬μš©ν•˜λŠ” 것듀이 μžˆμŠ΅λ‹ˆλ‹€. TCP 연결을 ν•  λ•Œ μ„œλ‘œ μ—°κ²°ν•˜λŠ” λΉ„μš©μ΄ λ°œμƒν•˜κΈ° λ•Œλ¬Έμ— 이미 ν•œ 번 μ—΄λ €μžˆλŠ” μ†ŒμΌ“μ„ μž¬ν™œμš©ν•˜λŠ” 것이 μ’‹μ§€, μš”μ²­λ§ˆλ‹€ 계속 connection을 맺을 ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

 

μŠ€ν”„λ§μ—μ„œ 'Bean'이라고 λΆˆλ¦¬λŠ” 객체 μ—­μ‹œ μ΄λŸ¬ν•œ μ‹±κΈ€ν„΄ λ°©μ‹μœΌλ‘œ κ΄€λ¦¬λ˜λ©°, 이 λ‚΄μš©μ€ λ‹€λ₯Έ κΈ€μ—μ„œ μ •λ¦¬ν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

싱글톀 νŒ¨ν„΄μ˜ ν•΅μ‹¬μœΌλ‘œ, getInstanceλΌλŠ” λ©”μ†Œλ“œλ₯Ό κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€.

이 λ©”μ†Œλ“œμ˜ 역할은 첫 호좜 μ‹œ 객체 생성과, 두 번째 μ΄ν›„λΆ€ν„°λŠ” 첫 번째 μƒμ„±ν•œ 객체λ₯Ό λ¦¬ν„΄ν•˜λŠ” μš©λ„μž…λ‹ˆλ‹€.

이λ₯Ό κ³ λ €ν•˜μ—¬ 싱글톀 νŒ¨ν„΄μ„ κ΅¬ν˜„ν•˜λ©΄ λ©λ‹ˆλ‹€. 

 

싱글톀 νŒ¨ν„΄μ„ κ΅¬ν˜„ν•˜λŠ” 방식은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. 

1. 싱글톀 νŒ¨ν„΄μ„ μ μš©ν•  클래슀λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
    1-1. ν•„λ“œλŠ” private static으둜 클래슀 자기 μžμ‹ μ˜ μ „μ—­ λ³€μˆ˜λ₯Ό μƒμ„±ν•˜κ³ , 값을 null둜 μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€.
    1-2. κΈ°λ³Έ μƒμ„±μžλ₯Ό 막기 μœ„ν•΄μ„œ private둜 접근을 μ œμ–΄ν•©λ‹ˆλ‹€.
2. getInstance λ©”μ†Œλ“œλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
    2-1. public static으둜 μ§€μ •ν•˜κ³ , 자기 μžμ‹ μ„ λ¦¬ν„΄ν•©λ‹ˆλ‹€.
    2-2. λ‘œμ§μœΌλ‘œλŠ” μ „μ—­λ³€μˆ˜λ‘œ μƒμ„±ν•œ 자기 μžμ‹ μ˜ 객체가 null 인지 ν™•μΈν•˜κ³ , null 이라면 μƒˆλ‘œμ΄ 객체λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
    2-3. null이 μ•„λ‹ˆλΌλ©΄, μ „μ—­λ³€μˆ˜λ₯Ό λ¦¬ν„΄ν•©λ‹ˆλ‹€.
3. ν•΄λ‹Ή 객체가 μ‚¬μš©ν•˜λŠ” λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•©λ‹ˆλ‹€.

이와 같은 κ΅¬ν˜„ λ°©μ‹μœΌλ‘œ μ–΄λ– ν•œ ν΄λž˜μŠ€μ—μ„œλ„ ν•΄λ‹Ή static λ©”μ†Œλ“œμΈ getInstanceλ₯Ό 톡해 λ™μΌν•œ 객체λ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

μ’€ 더 μžμ„Ένžˆ μ•Œμ•„λ³΄κΈ° μœ„ν•΄μ„œ 직접 κ΅¬ν˜„ν•΄λ³΄λ €κ³  ν•©λ‹ˆλ‹€.

 

 

🏝 2. 싱글톀 νŒ¨ν„΄(Singleton Pattern) κ΅¬ν˜„ν•΄λ³΄κΈ°

 

싱글톀 νŒ¨ν„΄μ€ 'μ†ŒμΌ“'μ—μ„œ 많이 μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— μ˜ˆμ œμ—μ„œλ„ socket을 μƒμ„±ν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

public class SocketClient{
	private static SocketClient socketClient = null;
    
    private SocketClient(){}
    
    public static SocketClient getInstance(){
    	if(socketClient == null){
        	socketClient = new SocketClient();
        } // μ—†λŠ” κ²½μš°μ—λŠ” μƒˆλ‘œμ΄ 생성
        
        return socketClient; // μžˆλŠ” κ²½μš°μ—λŠ” 처음 ν•œ 번 μƒμ„±λœ 객체 λ°˜ν™˜
    }
    
    public void connect(){
    	System.out.println("연결됨!");
    }
}

μœ„μ—μ„œ μ„€λͺ…ν•œ 싱글톀 νŒ¨ν„΄μ„ κ΅¬ν˜„ν•˜λŠ” λ°©μ‹μ²˜λŸΌ,

자기 μžμ‹ μ„ private static λ³€μˆ˜λ‘œ κ°–κ³  null둜 μ΄ˆκΈ°ν™” ν–ˆμŠ΅λ‹ˆλ‹€.

 

κΈ°λ³Έ μƒμ„±μžλŠ” private둜 막고, getInstance λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.

connect() ν•¨μˆ˜λŠ” μ‹€μ œ κ΅¬ν˜„ν•˜μ§€ μ•Šμ•˜μ§€λ§Œ, ν•΄λ‹Ή 싱글톀 객체가 μ‚¬μš©ν•˜λŠ” λ©”μ†Œλ“œλ‘œ νŒλ‹¨ν•˜λ©΄ λ©λ‹ˆλ‹€.

 

 

public class AExample{
	private SocketClient socketClient;
    
    public Example(){
    	this.socketClient = SocketClient.getInstance();
    }
    
    public SocketClient getSocketClient(){
    	return this.socketClient;
    }
}

public class BExample{
	private SocketClient socketClient;
    
    public Example(){
    	this.socketClient = SocketClient.getInstance();
    }
    
    public SocketClient getSocketClient(){
    	return this.socketClient;
    }
}


public class Main{
	public static void main(String args[]){
    	AExample a = new AExample();
        BExample b = new BExample();
        
        SocketClient aClient = a.getSocketClient();
        SocketClient bClient = b.getSocketClient();
        
        System.out.println(aClient.equals(bClient)); // true!!
    }
}

AExampleμ—μ„œλ„, BExampleμ—μ„œλ„ getInstanceλ₯Ό ν†΅ν•΄μ„œ SocketClient 객체λ₯Ό λ°›μ•˜μŠ΅λ‹ˆλ‹€. 

κΈ°λ³Έ μƒμ„±μžκ°€ λ§‰ν˜€μžˆμœΌλ―€λ‘œ, SocketClientκ°€ 생성될 수 μžˆλŠ” 방법은, 였직 getInstance λ©”μ†Œλ“œλ₯Ό ν†΅ν•΄μ„œ κ°€λŠ₯ν•©λ‹ˆλ‹€.

 

κ°€μž₯ ν•˜λ‹¨μ˜ Main 클래슀λ₯Ό 보면, AExampleμ—μ„œ μƒμ„±λœ SocketClient와 BExampleμ—μ„œ μƒμ„±λœ SocketClientκ°€ 동일함을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

이와 같이 싱글톀 νŒ¨ν„΄μ„ ν†΅ν•΄μ„œ 객체가 μœ μΌν•¨μ„ 보μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ €μž‘μžν‘œμ‹œ λΉ„μ˜λ¦¬ 동일쑰건 (μƒˆμ°½μ—΄λ¦Ό)

'πŸ§ͺ 컴퓨터과학 : CS' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[λ””μžμΈνŒ¨ν„΄] λ””μžμΈ νŒ¨ν„΄ (3) - μ–΄λŒ‘ν„° νŒ¨ν„΄ (Adatper Pattern)  (0) 2022.12.27
[λ””μžμΈνŒ¨ν„΄] λ””μžμΈ νŒ¨ν„΄(1) - λ””μžμΈ νŒ¨ν„΄μ€ 무엇인가?  (0) 2022.12.27
[자료ꡬ쑰] Priority Queue (μš°μ„ μˆœμœ„ 큐) 인터뷰 λŒ€λΉ„  (0) 2022.10.23
[자료ꡬ쑰] Stackκ³Ό Queue의 비ꡐ (인터뷰 λŒ€λΉ„)  (0) 2022.10.23
[자료ꡬ쑰] Array와 LinkedList의 차이 (인터뷰 λŒ€λΉ„)  (0) 2022.10.23
    'πŸ§ͺ 컴퓨터과학 : CS' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • [λ””μžμΈνŒ¨ν„΄] λ””μžμΈ νŒ¨ν„΄ (3) - μ–΄λŒ‘ν„° νŒ¨ν„΄ (Adatper Pattern)
    • [λ””μžμΈνŒ¨ν„΄] λ””μžμΈ νŒ¨ν„΄(1) - λ””μžμΈ νŒ¨ν„΄μ€ 무엇인가?
    • [자료ꡬ쑰] Priority Queue (μš°μ„ μˆœμœ„ 큐) 인터뷰 λŒ€λΉ„
    • [자료ꡬ쑰] Stackκ³Ό Queue의 비ꡐ (인터뷰 λŒ€λΉ„)
    개발자 HOON
    개발자 HOON
    쒋은 λ°±μ—”λ“œ μ—”μ§€λ‹ˆμ–΄κ°€ 되기 μœ„ν•œ 기둝을 λͺ¨μ•˜μŠ΅λ‹ˆλ‹€. # μ£Όλ‹ˆμ–΄ # λ°±μ—”λ“œ # 개발자

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”