CodeGym /Java Blog /무작위의 /Java의 패턴 및 싱글톤
John Squirrels
레벨 41
San Francisco

Java의 패턴 및 싱글톤

무작위의 그룹에 게시되었습니다
이 기사는 디자인 패턴의 개념을 처음 접하는 사람, 싱글톤 이라는 용어를 들어 본 적이 있는 사람 또는 어떻게든 싱글톤 패턴을 구현했지만 무슨 일이 일어나고 있는지 이해하지 못하는 사람을 대상으로 합니다. 환영! CodeGym 학생들은 레벨 15에서 처음으로 디자인 패턴을 접하게 되는데, 이때 기장이 예기치 않게 지연 구현으로 Java 싱글톤 패턴을 구현하여 이해를 "강화"하도록 요청합니다. 싱글톤 패턴에 대해 처음 듣는 학생들은 즉각적으로 많은 질문을 하게 됩니다. 도대체 디자인 패턴이 무엇입니까? 왜 필요한가요? 싱글톤 이란 무엇입니까 ? 마지막으로 게으른 구현이란 무엇입니까? 이 질문에 순서대로 답해 봅시다.

세상에 디자인 패턴이란 무엇입니까?

이 질문에 가장 잘 이해하기 위해서는 약간의 역사가 필요하다고 생각합니다. 흥미로운 아이디어를 내놓은 4명의 유명한 프로그래밍 저자(Erich Gamma, John Vlissides, Ralph Johnson, Richard Helm)가 있습니다. 그들은 소프트웨어 개발에서 거의 동일한 문제를 해결하고 동일한 방식으로 구조화된 코드를 작성해야 하는 경우가 많다는 사실을 알게 되었습니다. 그래서 그들은 객체 지향 프로그래밍에서 자주 사용해야 하는 전형적인 패턴을 설명하기로 결정했습니다. 그들의 책은 Design Patterns: Elements of Reusable Object-Oriented Software라는 제목으로 1994년에 출판되었습니다. 그 책의 이름이 너무 길어서 사람들은 단순히 그 책을 4인방의 책이라고 부르기 시작했습니다. 초판에는 23개의 패턴이 포함되었습니다. 그 후 수십 개의 다른 패턴이 발견되었습니다.
디자인 패턴은 일반적인 문제에 대한 표준화된 솔루션입니다.
싱글 패턴은 그 중 하나일 뿐입니다.

디자인 패턴이 필요한 이유는 무엇입니까?

패턴을 몰라도 프로그램을 작성할 수 있습니다. 결국 레벨 15가 되면 CodeGym에 미니 프로그램이 존재한다는 사실조차 모른 채 이미 수백 개의 미니 프로그램을 작성하게 됩니다. 이것은 디자인 패턴이 마스터와 아마추어를 구별하는 일종의 도구임을 시사합니다. 디자인 패턴은 일반적인 문제를 적절하게 해결하는 방법을 설명합니다. 즉, 패턴을 알면 시간이 절약됩니다. 그런 식으로 그들은 알고리즘과 유사합니다. 예를 들어 블랙잭과 숫자로 자신만의 정렬 알고리즘을 만들 수 있습니다.그렇게 하는 데 많은 시간을 할애하거나 오랫동안 이해되고 설명된 것을 구현할 수 있습니다. 디자인 패턴도 마찬가지입니다. 또한 디자인 패턴을 사용하면 코드가 더 표준화되고 적절한 패턴을 사용할 때 패턴의 일반적인 함정이 오래 전에 식별되고 제거되었기 때문에 실수할 가능성이 줄어듭니다. 무엇보다도 패턴에 대한 지식은 프로그래머가 서로를 더 잘 이해하는 데 도움이 됩니다. 동료 프로그래머에게 긴 설명을 제공하는 대신 단순히 패턴의 이름을 말할 수 있습니다. 요약하면 디자인 패턴은 다음과 같은 이점을 제공합니다.
  • 바퀴를 재발명하지 말고 대신 표준 솔루션을 사용하십시오.
  • 코드 표준화;
  • 용어 표준화;
이 섹션을 마무리하기 위해 디자인 패턴의 전체 본문을 세 개의 큰 그룹으로 나눌 수 있습니다. 패턴과 싱글톤 - 처음 접하는 모든 사람을 위한 - 2

마지막으로 싱글톤 패턴

싱글톤은 생성 패턴 입니다 . 이 패턴은 클래스의 인스턴스가 하나만 있는지 확인하고 이 개체에 대한 전역 액세스 지점을 제공합니다. 설명에서 이 패턴이 다음 두 가지 경우에 적용되어야 한다는 것이 명확해야 합니다.
  1. 프로그램에서 특정 클래스의 개체를 하나만 만들도록 요구할 때. 예를 들어 컴퓨터 게임에는 Hero 클래스와 게임의 유일한 영웅을 설명하는 하나의 Hero 개체만 있을 수 있습니다.

  2. 개체에 대한 전역 액세스를 위한 지점을 제공해야 하는 경우. 즉, 프로그램의 어디에서나 개체를 사용할 수 있도록 해야 합니다. 아쉽게도 전역 변수는 쓰기 금지되어 있지 않기 때문에 단순히 전역 변수를 만드는 것만으로는 충분하지 않습니다. 누구나 변수의 값을 변경할 수 있으므로 개체의 전역 액세스 지점이 손실될 수 있습니다. Singleton 의 이러한 속성은 예를 들어 데이터베이스와 함께 작동하는 개체가 있고 프로그램의 다른 부분에서 데이터베이스에 액세스해야 하는 경우에 필요합니다. Singleton 은 아무도 이전에 생성된 인스턴스를 대체하는 코드를 작성하지 않도록 합니다.
따라서 Singleton 은 다음 두 가지 요구 사항을 충족했습니다. 프로그램에는 특정 종류의 개체 중 하나만 있어야 하고 전역적으로 액세스할 수 있어야 합니다. 레벨 15의 예에서 선장은 다음 작업에 대해 이 패턴을 구현하도록 요청합니다.
  1. 지연 초기화가 있는 싱글톤 의 예를 찾으십시오 .

  2. 동일한 원칙을 사용하여 별도의 파일에 세 개의 싱글톤 클래스(Sun, Moon, Earth)를 만듭니다.

  3. 구현하다행성Sun , MoonEarth 클래스 의 인터페이스 .

  4. 솔루션 클래스 의 정적 블록에서readKeyFromConsoleAndInitPlanet방법.

  5. 구현readKeyFromConsoleAndInitPlanet메소드 기능:

    • 5.1. 콘솔에서 하나 의 문자열 매개변수 읽기

    • 5.2. 매개변수가 다음 중 하나와 같으면행성인터페이스의 상수, 적절한 thePlanet 개체를 만듭니다.

작업 조건을 주의 깊게 읽은 후 여기에서 Singleton이 필요한 이유를 명확하게 알 수 있습니다. 실제로 Sun , Moon , Earth 클래스 각각의 인스턴스를 생성하라는 요청을 받았습니다 . 태양/달/지구를 하나만 만들어야 한다고 가정하는 것이 이치에 맞습니다. 그렇지 않으면 물론 당신이 당신의 스타워즈 버전을 작성하지 않는 한 우리는 터무니없는 상황에 빠지게 됩니다. 세 단계로 Java에서 Singleton 패턴 구현하기 Java에서는 생성자가 항상 새 객체를 반환하기 때문에 일반 생성자를 사용하여 Singleton 동작을 구현할 수 없습니다. 따라서 Singleton 의 모든 구현은생성자를 숨기고 싱글톤 개체의 수명을 제어하는 ​​공개 정적 메서드를 만들고 새로 나타나는 모든 개체를 "파기"하는 것으로 요약됩니다. Singleton 에 액세스 하면 새 객체를 생성하거나(프로그램에 이미 존재하지 않는 경우) 기존 객체를 반환해야 합니다. 이를 달성하려면 다음을 수행하십시오.
  1. 클래스에 단일 개체를 저장하는 전용 정적 필드를 제공해야 합니다.

    
    public class LazyInitializedSingleton {
    	private static LazyInitializedSingleton instance; // #1
    }
    
  2. (기본) 생성자를 비공개로 만듭니다. 이는 클래스 외부에서 액세스할 수 없으며 새 객체를 반환할 수 없음을 의미합니다.

    
    public class LazyInitializedSingleton {
    	private static LazyInitializedSingleton instance;
    private LazyInitializedSingleton(){} // #2
    } 
    
  3. 싱글톤을 가져오는 데 사용할 정적 생성 방법을 선언합니다.

    
    public class LazyInitializedSingleton {
        private static LazyInitializedSingleton instance;
            private LazyInitializedSingleton() {}
            public static LazyInitializedSingleton getInstance() { // #3
            if (instance == null) { // If the object has not yet been created
                instance = new LazyInitializedSingleton(); // Create a new object
            }
            return instance; // Return the previously created object
        }
    }
    
위의 예제는 생성자를 숨기고 표준 생성자 대신 자체 메서드를 제공하기 때문에 다소 서투릅니다. 이 기사는 CodeGym 학생들이 이 패턴(및 일반적인 디자인 패턴)과 접촉하도록 하는 것을 목표로 하기 때문에 더 복잡한 싱글톤 구현의 뉘앙스는 여기에서 설명하지 않습니다. 프로그램의 복잡성에 따라 이 패턴을 더 다듬어야 할 수도 있습니다. 예를 들어 다중 스레드 환경(스레드에 대한 기사 참조)에서 여러 다른 스레드가 싱글톤 메서드에 동시에 액세스할 수 있으며 각각의 개별 스레드가 클래스의 인스턴스를 만들 수 있으므로 위에서 설명한 코드가 작동을 멈춥니다. 결과적으로 적절한 스레드로부터 안전한 싱글톤을 생성하는 데에는 여전히 여러 가지 접근 방식이 있습니다. 그러나 그것은 또 다른 이야기입니다 =)

그리고 마지막으로... 기장이 물어본 이 게으른 초기화는 무엇입니까?

지연 초기화는 지연 초기화라고도 합니다. 이것은 리소스 집약적인 작업(및 개체 생성은 리소스 집약적인 작업)이 사전이 아닌 요청에 따라 수행되는 프로그래밍 트릭입니다. 그렇다면 Singleton Java 코드에서 실제로 어떤 일이 발생할까요? 즉, 우리의 객체는 미리 생성되는 것이 아니라 액세스되는 시점에 생성됩니다. 게으른 초기화가 싱글톤 패턴 에 단단히 묶여 있다고 가정해서는 안 됩니다 . Lazy initialization은 Proxy나 Factory Method와 같은 다른 생성 디자인 패턴에서도 사용되지만 이것도 또 다른 이야기입니다 =)
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION