Purple Bobblehead Bunny

Backend/JAVA

[JAVA] Singleton Pattern

준영어린이 2022. 4. 21. 12:27

 

싱글톤 패턴

  • 어떤 클래스가 최초 한번만 메모리를 할당하고(static) 그 메모리에 객체를 만들어 사용햐는 디자인 패턴            
  • 생성자의 호출이 반복적으로 이뤄져도 실제로 생성되는 객체는 최초 생성된 객체를 반환
class C05Company {
	int x;
	int y;
	int z;
	
	//싱글톤 패턴 코드 시작
	private static C05Company instance = new C05Company(); 
	private C05Company() {}
	public static C05Company getInstance() {
		if(instance==null) 
			instance=new C05Company();
		return instance;
	}
        //싱글톤 패턴 끝

instance라는 전역변수를 선언하는데, static을 줌으로 인스턴스화 하지 않고 사용 할 수 있게 했다.

private라는 접근제어가 걸려 있어서 직접적인 접근은 불가능하다.

생성자 또한 private로 되어 있어 new를 통한 객체 생성도 불가능하다.

getInstance 메서드를 통해 해당 인스턴스를 얻을 수 있다.

 

싱글톤 패턴 사용하는 이유

 

한번의 객체 생성으로 재 사용이 가능하기 때문에, 메모리 낭비를 막을 수 있다.

싱글톤으로 생성된 객체는 무조건! 한번 생성으로 전역성을 띄기 때문에 다른 객체와 공유가 가능.

 

예제

 

 

 

Calculator 클래스

 

 

출력 결과

 

 

싱글톤 문제점

 

Multi-Thread 환경에서 안전하지 않다. 여러 쓰레드가 공유되고 있는 상황에서는

아래의 블럭에서 조건문이 동시에 두 번 돌 수 있기 때문에

하나의 인스턴스가 아닌 여러개의 인스턴스가 발생할 위험이 있다.

public static Calculrator getInstance() {
     if(calculrator == null) {
         calculrator = new Calculrator();
         }
      return calculrator;
}

 

인스턴스가 상태를 유지 해야 하는 상황에서 싱글톤은 더 고려 해야 할 점이 많다.

 

 

    public class Calculrator {
    	private static Calculrator calculrator = null;
    	private int count = 0;
    
    	private Calculrator(){}
    
    	public static Calculrator getInstance() {
    		if(calculrator == null) {
    			calculrator = new calculrator();
    		}
    		return calculrator;
    	}
    
    	public void calculrator(String input) {
    		count++;
    		System.out.println(input + "count : "+ count);
    	}
    }

count 값은 서로 다른 쓰레드에서 공유하고 있고, 서로 다른 프로세스에서 처리하고 있어서

값이 뒤죽박죽일 수도 있다.

 

적절한 형태로 싱글톤을 활용하면 좋은 경우도 있지만, 남용 하게 될 가능성이 많다.