* Translate README.md via GitLocalize * Translate README.md via GitLocalize * Update README.md * Translate README.md via GitLocalize * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Translate README.md via GitLocalize * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Translate README.md via GitLocalize * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Translate README.md via GitLocalize * Update README.md Co-authored-by: mt-gitlocalize <mt@gitlocalize.com>
		
			
				
	
	
		
			85 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | |
| layout: pattern
 | |
| title: Singleton
 | |
| folder: singleton
 | |
| permalink: "/patterns/singleton/"
 | |
| categories: Creational
 | |
| tags:
 | |
| - Gang of Four
 | |
| ---
 | |
| 
 | |
| ## 의도
 | |
| 
 | |
| 클래스에 인스턴스가 하나만 있는지 확인하고 이에 대한 전역 access point을 제공합니다.
 | |
| 
 | |
| ## 설명
 | |
| 
 | |
| 예시
 | |
| 
 | |
| > 마법사들이 마법을 연구하는 상아탑은 단 하나뿐입니다. 마법사는 항상 동일한 마법의 상아탑을 사용합니다. 여기서 상아탑은 singleton입니다.
 | |
| 
 | |
| 평범하게 말하자면
 | |
| 
 | |
| > 특정 클래스의 개체가 하나만 생성되도록합니다.
 | |
| 
 | |
| Wikipedia 말에 의하면
 | |
| 
 | |
| > 소프트웨어 엔지니어링에서 singleton 패턴은 클래스의 인스턴스화를 하나의 객체로 제한하는 소프트웨어 디자인 패턴입니다. 이는 시스템 전체에서 작업을 조정하는 데 정확히 하나의 개체가 필요할 때 유용합니다.
 | |
| 
 | |
| **프로그램 코드 예제**
 | |
| 
 | |
| Joshua Bloch, Effective Java 2nd Edition p.18
 | |
| 
 | |
| > 단일 요소 열거형은 singleton을 구현하는 가장 좋은 방법입니다.
 | |
| 
 | |
| ```java
 | |
| public enum EnumIvoryTower {
 | |
|   INSTANCE
 | |
| }
 | |
| ```
 | |
| 
 | |
| 그런 다음 사용하려면 :
 | |
| 
 | |
| ```java
 | |
| var enumIvoryTower1 = EnumIvoryTower.INSTANCE;
 | |
| var enumIvoryTower2 = EnumIvoryTower.INSTANCE;
 | |
| assertEquals(enumIvoryTower1, enumIvoryTower2); // true
 | |
| ```
 | |
| 
 | |
| ## 클래스 다이어그램
 | |
| 
 | |
| 
 | |
| 
 | |
| ## 적용 가능성
 | |
| 
 | |
| 다음과 같은 경우 Singleton 패턴을 사용합니다.
 | |
| 
 | |
| - 정확히 하나의 클래스 인스턴스가 있어야하며 잘 알려진 access point에서 클라이언트에 접근할 수 있어야합니다.
 | |
| - 단일 인스턴스가 서브 클래싱으로 확장 가능해야하고 클라이언트가 코드를 수정하지 않고 확장 인스턴스를 사용할 수 있어야 하는 경우
 | |
| 
 | |
| ## 일반적인 사용 사례
 | |
| 
 | |
| - 로깅 클래스
 | |
| - 데이터베이스에 대한 연결 관리
 | |
| - 파일 관리자
 | |
| 
 | |
| ## 실제 사례
 | |
| 
 | |
| - [java.lang.Runtime#getRuntime()](http://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html#getRuntime%28%29)
 | |
| - [java.awt.Desktop#getDesktop()](http://docs.oracle.com/javase/8/docs/api/java/awt/Desktop.html#getDesktop--)
 | |
| - [java.lang.System#getSecurityManager()](http://docs.oracle.com/javase/8/docs/api/java/lang/System.html#getSecurityManager--)
 | |
| 
 | |
| ## 결과
 | |
| 
 | |
| - 자체 생성 및 수명주기를 제어하여 SRP (Single Responsibility Principle)를 위반합니다.
 | |
| - 이 개체가 사용하는 개체와 리소스가 할당 해제되는 것을 방지하는 전역 공유 인스턴스를 사용하도록 권장합니다.
 | |
| - 밀접하게 연결된 코드를 만듭니다. Singleton의 클라이언트는 테스트하기가 어려워집니다.
 | |
| - Singleton의 하위 클래스를 만드는 것이 거의 불가능합니다.
 | |
| 
 | |
| ## 크레딧
 | |
| 
 | |
| - [Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59)
 | |
| - [Effective Java](https://www.amazon.com/gp/product/0134685997/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0134685997&linkCode=as2&tag=javadesignpat-20&linkId=4e349f4b3ff8c50123f8147c828e53eb)
 | |
| - [Head First Design Patterns: A Brain-Friendly Guide](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b)
 | |
| - [Refactoring to Patterns](https://www.amazon.com/gp/product/0321213351/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0321213351&linkCode=as2&tag=javadesignpat-20&linkId=2a76fcb387234bc71b1c61150b3cc3a7)
 |