티스토리 뷰

DesignPattern

[ 생성 패턴 ] Singleton 패턴

tbMaster 2021. 12. 14. 22:58
반응형

본 내용은 "박은종의 객체지향 설계를 위한 디자인패턴 with 자바" 강의를 듣고 나름대로 정리한 내용이다. 

 


 

Singleton 패턴

클래스에 대한 인스턴스가 단 하나만 존재하며, 해당 인스턴스에 접근할 수 있도록 제공하는 패턴

 

 

Singleton 패턴 적용 가능한 상황

- 인스턴스가 여러 개일 경우에 문제가 발생할 수 있는 것은 인스턴스를 하나만 생성하여 공유할 수 있도록 함.

 

- 각기 다른 값을 가질 필요가 없을 때

( Ex. new A("james"), new A("albert") 등 property 값이 여러개일 필요가 없을 때 )

 

- 개수가 정해져 있는 경우

( Ex. db connection pool ...   )

 

Singleton 패턴 특징  

- 유일하게 존재하는 인스턴스로, 접근을 통제할 수 있다.

 

 

Singleton의 클래스 다이어그램

 

 

SingleThread 일 때,

    public void main(String[] args){
        Singleton instance1 = Singleton.getInstance();
        Singleton instance2 = Singleton.getInstance();

        System.out.println(instance1 == instance2); //가져온 두 객체가 같은지 확인
    }
    
    ...


	//Singleton 패턴
    public class Singleton{
        private static Singleton instance;

		//외부에서 new 를 통한 객체를 생성하지 못하게 해야 하므로 construct는 "private" 로 선언
        private Singleton(){}
		
        //외부에서 new 를 통해 생성되지 않고 해당 instance 객체에 접근해야 하므로 "static" 이어야 함
        public static Singleton getInstance(){ 
            if(instance  == null){
                instance = new Singleton();
            }
            return instance; //생성되어 있는 객체 반환
        }
    }

 

위에 있는 Singleton 생성 코드는 Multi Thread 환경에서는 정상동작 하지 않을 수 있다. 하나의 thread에서 instance를 생성하는 중에 다른 thread에서 instance를 호출한다면 아직 instance 생성이 완료되지 않았기 때문에 또 하나의 instance를 생성할 수 있기 때문이다. 

 

 

Multi Thread 환경일 때,

static 은 클래스가 loading 될 때, 한 번 실행되며, thread-safe 하다. 따라서, 멀티 스레드 환경에서 singleton을 구현할 때 static을 이용하여 객체를 생성한다. 또한, LazyHolder를 이용하여, instance를 사용하는 시점에서 instance가 생성되게 하면, 사용하지 않을 수도 있는 환경에서 미리 instance 객체를 만들어 메모리를 잡아 먹지 않아도 된다.

 

 

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함