http://blog.naver.com/cestlavie_01/220957226360

 

 

디자인패턴을 공부하는 3단계 서적으로 


첫째. JAVA 언어로 배우는 디자인패턴 입문, Gof 디자인패턴 , 헤드퍼스트 디자인패턴

둘째. 실전코드로 배우는 실용주의 디자인패턴

세째. 비 GOF디자인패턴 ( 멀티쓰레드패턴, 리소스패턴, 엔터프라이즈패턴, 서비스패턴, 맵리듀스패턴등등)

Posted by 농부지기
,

[ 2. Singleton - 실무 예제 ]

 

* 선지식 : Singleton. 1. 기본 개념 및 기본 예제

.

1. SingleTonClass.java

    - SingleTon Pattern 을 이용해서 객체를 instance화

    

 

2. FirstJob.java

    - SingleTonClass를 getSingleTonClass()메소드를 호출 해서 첫 instance화 해서 사용

    - 이때 name은 공백, age는 10으로 출력 된다.

     

 

3. SecondJob.java

    - SingleTonClass를 getSingleTonClass()메소드를 호출 해서 instance를 얻어 오지만

       이때 instance는 이미 FirstJob Instance에서 생성했던 SingleTonClass instance를 얻어 온다.

     - 그래서 name, age를 출력 하면 이미 FirstJob instance에서 set한 값이 출력 된다.

      

 

4. Main.java

     

 

5. 최종 결과

---------------------
First Job Class start
name =  :: age = 10
name = farmer :: age = 11
---------------------
Second Job Class start
name = farmer :: age = 11

Posted by 농부지기
,

[ 1. Singleton - 기본 개념 및 기본 예제 ]

 

1. 선지식1

    - 객체(Object)     : Java코드로 작성해서 컴파일 되어진 각각의 .class 파일

    - 개체(Instance) : 컴파일된 .class파일을 new 연산자를 사용해서 메모리에 로딩한 상태

 

    * 그래서 객체는 1개만 존재할 수 있는 개체(Instance)는 new를 이용해서 여러개 생성가능하다.

    * class를 메모리에 올리는 방법(Instance화 하기)은 new 또는 static 두 가지 외에는 없다.

 

2. 선지식2 - Static

    1. 장점

        - 복한 초기화가 필요없는 경우 사용

    2. 단점

        - 여러 클래스가 얽혀 있는 경우에는 지저분 해진다.

        - 초기화 순서와 관련된, 찾아 내기가 아주 어려운 복잡 미묘한 버그가 생길 수 있다.

        - 싱글톤과 비슷한걸 만드러야 하는 특별한 이유가 없는 이상 사용하지 않는게 좋다.

        - 게으른 인스턴수를 생성할 수 없다.

        - 처음부터 끝까지 인스턴스를 가지고 있어야 한다.

        - 전역변수의 사용은 간단한 객체에 대한 전역 레퍼런스를 자꾸 만들게 되면서 네임스페이스를 지저분하게 만드는 경향이 있다.

 

3. Singleton 정의

    - 특정 클래스에 대해서 인스턴수가 하나만 만들어지고, 어디서든지 해당 인스턴스에 접근할 수 있도록 하기 위한 패턴

    - 특정 클래스에 대해서 객체 인스턴스가 하나만 만들어 질 수 있또록 해 주는 패턴.

    - 어디서든지 그 인스턴스에 접근할 수 있도록 하기 위한 패턴

 

3. Singleton 사용 이유 (주 사용처 및 용도)

    - 인스턴스를 두 개 이상 만들게 되면 프로그램이 이상하게 돌아가는 경우에 사용

      여러 thread에 동시에 접근해서 사용해도 동일한 데이터를 읽는것이 보장 되어야 할 때 사용.

    - 프로그램상에서 동일한 커넥션 객체를 만들 경우에 사용됨.

    - 데이터베이스에서 객체를 통해 자료를 가져올때 주로 사용됨.

    - 스레드 풀, 캐시, 대화상자, 사용자설정, 레지스트리 설정을 처리하는 객체, 로그 기록용 객체

       프린터나 그래픽 카드 같은 디바이스를 위한 디바이스 드라이버

 

4. Singleton 단점

    - Instance가 해제 되는 시점을 알기 어렵다.

 

5. 전역클래스와의 차이점

    - 전역    클래스 : 어플리케이션이 시작 시 항상 객체가 생성되어 로딩 됨

                              이 객체가 자원을 많이 찾이한다. 이유는 사용하지 않아도 메모리에 계속유지 되므로.

    - 싱클톤 클래스 : 시작점을 지정할 수 있다.

                               필요할 때만 객체를 생성한다.

 

6. 작성방법

    UML

 https://media.licdn.com/mpr/mpr/AAEAAQAAAAAAAAgRAAAAJGI0MjFiM2U0LWQ3MmEtNDA4Ny1iNzhjLWIyY2Q4OGE3MzgxNg.png

 

    http://www.topjavatutorial.com/wp-content/uploads/2016/02/Singleton.png

 

    1. 생성자를 private으로 선언하여, 임의 생성과 상속을 통한 추가 구현을 제한한다.
        (예, private static Singleton uniqueInstance;)

    2. 자기 자신을 멤버 변수로 보관하며, 이는 private static 속성으로, 하나의 객체만 유효하게하여 객체의 중복생성을 막고, 외부에서 임의 접근을 하지 못하도록 한다.
       (예, private Singleton(){};)

    3. Singleton 객체에 접근할 때는 public static으로 허용된 getInstance method를 통해서만 가능하게 한다.

 

7. 구현예제1 - 고전적인 싱글톤 패턴 구현법

    

     * 문제점 : 멀티스레딩에 의해 2개의 인스턴스가 생기는 경우가 발생할 수 있다.

     * 이유 : 멀티스레딩으로 구현 시 첫 번째 스레드에서

                 if (uniqueInstance == null)이 비교구문까지 처리되고

                 다음 줄을 실행하기 전에 두 번째 스레드가 동일한 비교구문을 처리하면

                 uniqueInstance에 인스턴스가 로드되기 전이므로

                 두 스레드가 모두 uniqueInstance = new SingleTon();을 처리하는 상황이 발생할 수 있다.

 

8. 구현예제2 - 멀티스레딩 문제 해결1

    

    * 설명 : getInstance()를 synchroized 함으로써 해당 method가 처리완료 되기 전까지 다른 스레드에서 실행할 수 없게 만든다.

    * 문제점 : 동기화로 인해 불필요한 오버헤드 발생으로 100배 정도 성능 저하.

                    해당 method가 처리 완료 되기 전까지 다른 스레드가 대기하므로 성능저하가 심각.

    * getInstance()의 속도가 중요하지 않다면 사용

 

9. 구현예제3 - 멀티스레딩 문제 해결2

    - 어플리케이션에서 반드시 Singleton의 인스턴수를 생성하고, 그 인스턴스를 항상사용하는 경우

    - 또는 인스턴스를 실행중에 수시로 만들고 관리하기가 성가신 경우 

    

    * 클래스가 로딩될 때 JVM에서 Singleton의 유일한 인스턴스를 생성

    * JVM에서 유일한 인스턴스를 생성하기 전에는 그 어떤 스레드도 uniquInstance정적 변수에 접근 불가

    * private static Singleton uniquInstance = new Singleton();으로 로딩 시 객체를 미리 생성한다.

       application클래스를 사용하는 것과 비슷한 효과라고 이해하면 된다.

 

10. 구현예제4 - DCL(Double-Checking Locking)을 써서 getInstance()에서 동기화되는 부분을 축소하는 방법

    - DCL을 사용하면 인스턴스 생성여부를 확인한 다음, 생성되어 있지 않을 때만 동기화 할 수 있다.

    - 이 경우 처음에만 동기화를 하고 나중에는 동기화를 하지 않아도 된다. 

      

      * valatile : CPU가 객체 참조시에 캐시된 메모리를 사용하지 않고 직접메모리에서 값을 가져오도록 보장한다.

                      (보통 Thread는 Cache Memory를 참조해서 값을 읽어온다.)

      * volatile 참고 URL : http://blog.naver.com/jwmoon74/100157579221

'자바(Pattern&자료구조) > Singleton Pattern' 카테고리의 다른 글

2. Singleton - 실무 예제  (0) 2017.03.15
Posted by 농부지기
,