Back-end/CS knowledge

싱글톤 패턴이란? singleton pattern

cheersHena 2022. 7. 27. 02:46
반응형

싱글톤 패턴이란? singleton pattern 

  • 여러 디자인 패턴 종류 중 하나로, 하나의 클래스에 오직 하나의 객체 인스턴스만 가지는 패턴이다. 
    * 디자인 패턴: 프로그램을 설계할때 발생했던 문제점들을 객체 간 상호관계 등을 통해 해결할 수 있도록 하나의 '규약'형태로 만들어 놓은 것.
  • 하나의 인스턴스를 만들어 놓고 해당 인스턴스를 다른 모듈들이 어디에서든 공유하며 접근, 사용할수 있다. 
  • 싱글톤 패턴으로 만들어진 클래스는 생성자가 여러번 호출 되더라도, 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 보낸다. 
  • 주로 공통된 객체를 여러 개 생성해서 사용하는 DBCP (Database Connection Pool)와 같은 데이터베이스 연결 모듈에 많이 사용된다. 

싱글톤 패턴의 장점

  • 인스턴스가 단 하나이기 때문에 인스턴스를 생성할때 드는 비용이 줄어든다.
  • static을 사용하여 별도의 메모리 영역을 얻으면서 한번의 new 연산자로 인스턴스를 사용하기 때문에 메모리 낭비를 방지할수 있다.
  • 싱글톤패턴으로 만들어진 클래스의 인스턴스는 전역 인스턴스이기 때문에 다른 클래스의 인스턴스들이 데이터를 공유할 수 있다. 
  • 예를들어 configration의 설정값인 경우, 객체가 여러개 생성되면 설정값이 변경되어 상이해질 위험이 있는데, 인스턴스가 1개만 생성되는 싱글톤 패턴을 사용하면 하나의 인스턴스를 메모리에 등록해서 여러 스레드가 동시에 해당 인스턴스를 공유하도록 할 수 있다. 

예제소스) 

Settings class (Singleton) 

public class Settings{

private Settings(){}; 
//생성자를 private으로 생성 -> 다른 클래스에서 인스턴스 생성 불가. 즉,new 연산자로 생성할 수 없음.  
//대신 클래스의 method와 field를 static으로 선언하여 외부에서 접근할 수 있도록 한다.

private static Settings settings = null; 
//static 선언으로 별도의 지정된 메모리 공간에만 존재.

    public static Settings getSettings(){
        if(settings == null){ 
        // 초기값이 null이므로 최초로 호출된 경우 
            settings = new Settings(); // 객체 선언 1번! 
        } 
        //초기값인 null이 아니라면 이미 어디선가 호출된 경우 
        return settings; //그대로 반환 
    }

private int fontSize = 10;
private String backgroundColor = "black";


public void setFontSize(int fontSize){ //set method
	this.fontSize = fontSize;
}
public int getFontSize(){ //get method
	return fontSize;
}

public void setFontSize(String backgroundColor){ 
	this.backgroundColor = backgroundColor;
}
public int getBackgroundColor(){
	return backgroundColor;
}




}

other class 

public class Test1{

private Settings settings = Settings.getSettings(); 
//static 메소드이므로 new 연산자 없이 바로 호출가능. new Settings()가 아닌 Settings.getSettings(); 

    public void setSettings(){
        settings.setFontSize(20);
        settings.setBackgroundColor("red");
    }

System.out.println(settings.getFontSize());
System.out.println(settings.getBackgroundColor());

}

//결과
20
red
public class Test2{

private Settings settings = Settings.getSettings();

System.out.println(settings.getFontSize());
System.out.println(settings.getBackgroundColor());

}

//결과
20
red

예제소스처럼 Test1 클래스에서 세팅한 정보가 Test2에서도 세팅을 해주지 않았음에도 적용된것을 확인할 수 있다. 

이미 Test1에서 호출하면서 new연산자로 객체생성을 했기 때문에 (null 이 아니기 때문에 ) 바로 해당값을 반환해준 것. 

 

싱글톤 패턴의 단점

  • 싱글톤 인스턴스를 여러곳에서 많이 공유할 경우 다른 클래스의 인스턴스 간 의존성이 높아질 수 있다.
    (객체간의 독립성을 지향하는 객체지향 원칙에 어긋남) 
  • 의존성이 높아지면 수정작업이나 테스트를 진행하기 어려워진다. 
  • 멀티스레드 환경에서 객체가 1개이상 생성되어 오류 발생의 여지가 있음. (이를 해결할 수 있는 언어별로 다양한 솔루션이 있다)

 

싱글톤 패턴의 기본 구조 

예제소스와 비교하며 이해해보자.

 

 

 

반응형