싱글톤 클래스는 클래스의 객체 생성을 Java 가상 머신에서 하나만으로 제한합니다. 또한 개체에 대한 전역 액세스 지점을 제공하는 데에도 도움이 됩니다. 이 디자인 패턴은 캐싱, 추상 팩토리, 로깅, 프로토타입 등에 일반적으로 사용됩니다. 또한 java.awt.Desktop, java.lang.Runtime과 같은 핵심 Java 클래스에서도 사용됩니다. java.lang.Runtime에서 Java는 애플리케이션이 실행 중인 현재 런타임 환경을 나타내는 런타임 클래스를 제공합니다. 이는 애플리케이션과 런타임 환경을 인터페이스하는 데 도움이 됩니다. JRE는 고유하므로 하나의 객체가 있어야 합니다. java.awt.Desktop에서 Desktop 클래스를 사용하면 애플리케이션이 사용자의 기본 브라우저, 메일 클라이언트 등을 사용하여 URI 또는 파일을 시작할 수 있습니다. 여기에도 클래스 인스턴스가 하나만 있어야 합니다.
싱글톤 클래스는 두 가지 방법으로 생성할 수 있습니다.
무료 소프트웨어 개발 과정 시작
웹 개발, 프로그래밍 언어, 소프트웨어 테스팅 등
이제 싱글톤 클래스의 클래스 UML(Unified Modeling Language) 다이어그램을 살펴보겠습니다.
클래스 UML 다이어그램에서 첫 번째 파티션은 클래스 이름을 나타내고, 두 번째 파티션은 속성을 나타내고, 세 번째 파티션은 메서드를 나타냅니다. 또한 +는 공용 속성 또는 메소드를 나타내고 –는 전용 속성 또는 메소드를 나타냅니다. 예를 들어, Singleton 클래스 UML 다이어그램에서 클래스 이름은 Singleton이고 기본 메서드가 있습니다. 기본 메소드인 getInstance 메소드와 SampleMethod는 위 다이어그램에서 공개된 유일한 메소드입니다. 생성자와 인스턴스 속성은 구현의 일부로 비공개로 설정됩니다. 이 공개 Main 메소드는 인스턴스를 요청하고 getInstance는 이를 기본 메소드에 반환합니다.
인스턴스화를 기준으로 일반 Java 클래스와 싱글톤 클래스의 유일한 차이점은 Java 클래스에서는 생성자를 사용하는 반면, 싱글톤에서는 getInstance() 메서드를 사용한다는 것입니다.
싱글턴의 디자인 패턴은 두 가지 형태로 구성됩니다.
1. 지연 인스턴스화
지연 인스턴스화에서는 필요할 때 클래스 인스턴스가 생성됩니다. 멀티스레드 환경에서 발생할 수 있는 Race Condition을 피하기 위해 동기화된 방식이나 블록으로 생성됩니다.
2. 조기 인스턴스화
조기 인스턴스화에서는 로드 시 인스턴스가 생성됩니다. 가장 간단한 접근 방식임에도 불구하고, 접속 여부에 관계없이 인스턴스 생성이 이루어지지 않는다는 단점이 있습니다.
다음 섹션에서는 지연 인스턴스화와 조기 인스턴스화의 예를 설명합니다.
위에서 설명한 것처럼 Singleton 클래스는 Early Instantiation 또는 Lazy Instantiation으로 생성될 수 있습니다.
다음은 지연 인스턴스화를 구현하는 단계입니다.
1. 생성자를 비공개로 설정하세요.
예를 들어 LazyClass라는 클래스를 만듭니다. 생성자는 아래와 같습니다.
private LazyClass () { }
2. 생성된 클래스에 대한 전용 정적 인스턴스를 생성합니다.
private static LazyClass instance;
3. 클래스 인스턴스를 생성하는 정적 동기화 메서드를 만듭니다.
public static synchronized LazyClass getInstance() { }
4. getInstance() 메서드에서 먼저 인스턴스가 있는지 확인합니다. 찾을 수 없으면 새로 만듭니다. 그렇지 않으면 인스턴스를 반환합니다.
if(instance == null) { instance = new LazyClass (); } return instance;
이제 샘플코드를 이용하여 살펴보겠습니다.
//Java Program for Lazy Instantiation public class LazyClass { private static LazyClass instance; //set the constructor as private private LazyClass () {} //Checks whether an instance is already in the getInstance method public static synchronized LazyClass getInstance() { //if instance is not present already, create a new one if(instance == null) { instance = new LazyClass (); } // if an instance is present, then return it return instance; } //Sample method that is protected from more than one object creation public void sampleMethod( ) { System.out.println("sampleMethod for lazy singleton"); } public static void main(String[] args) { LazyClass temp=LazyClass.getInstance(); temp.sampleMethod(); } }
출력:
여기에서는 로드 시 인스턴스를 생성하는 대신 동기화된 블록 내부에 생성됩니다. 더 나은 이해를 위해 둘 이상의 객체 생성으로부터 보호되는 샘플 방법도 제공됩니다.
이제 조기 인스턴스화 단계를 살펴보겠습니다. 동기화된 메서드나 블록을 사용하지 않는다는 점을 제외하면 지연 인스턴스화와 유사합니다.
1. 생성자를 비공개로 설정하세요.
예를 들어 EarlyClass라는 클래스를 만듭니다. 생성자는 아래와 같습니다.
private EarlyClass () () { }
2. 생성된 클래스에 대한 전용 정적 인스턴스를 생성합니다.
private static EarlyClass <em>ins</em>= new EarlyClass();
3. 생성된 클래스 인스턴스를 가져오는 정적 메서드를 만듭니다.
public static EarlyClass getInstance() { }
다음은 Early Instantiation에 대한 샘플 코드입니다.
//Java Program for Early Instantiation public class EarlyClass { //Create an instance of the class at load time private static EarlyClass <em>ins</em>= new EarlyClass(); //set the constructor as private private EarlyClass () {} //A static method to get the instance public static EarlyClass getInstance() { return ins; } //A sample method that is protected from more than one object creation public void sampleMethod() { System.out.println("sampleMethod for Early singleton"); } //Main method public static void main(String[] args) { EarlyClass tmp = getInstance(); tmp.sampleMethod(); } }
출력:
위 프로그램에서는 로드 시간에 인스턴스가 생성되고 getInstance() 메서드를 사용하여 반환됩니다. 또한 생성자는 싱글톤 인스턴스화의 일부로 비공개로 설정됩니다.
객체를 재사용하고 다시 생성하지 않기 때문에 메모리 절약이 가장 큰 장점입니다.
이 문서에서는 클래스 UML 다이어그램, 알고리즘 및 샘플 코드를 사용하여 싱글톤 클래스가 작동하는 방식을 다루었습니다. 싱글톤 클래스는 클래스에 대해 하나의 객체와 해당 객체에 대한 전역 액세스 지점이 필요할 때 사용됩니다. 요구사항에 따라 Early Instantiation과 Lazy Instantiation 두 가지 형태를 사용할 수 있습니다.
위 내용은 Java의 싱글톤 클래스의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!