[JAVA] 디자인 패턴 - 싱글톤 (SingleTon)

디자인 패턴(Design Pattern)

  • 디자인 패턴이란 기존 환경 내에서 반복적으로 일어나는 문제들을 어떻게
    풀어나갈 것인가에 대한 일종의 솔루션 같은 것이다.
  • 디자인 패턴은 설계자들이 "올바른" 설계를 "빨리" 만들 수 있도록 도와준다.

📝 싱글톤 (SingleTon)

  • JAVA에서 많이 사용되는 디자인 패턴
  • 어떤 클래스가 최초 한번만 메모리를 할당하고(Static) 그 메모리에
    객체를 만들어 사용하는 디자인 패턴
  • 즉 생성자의 호출이 반복적으로 이뤄져도 실제로 생성되는 객체는 최초 생성된
    객체를 반환 해주는 것이다.

SingleTon 객체의 이점

  • 메모리를 효율적으로 사용할 수 있다.

    • 프로그램의 전역에서 활용할 재료로 사용되는 공유 기능을 하나만 생성하여
      여러 곳에서 재사용할 수 있다.
  • 다른 클래스 간에 데이터 공유가 쉽다

    • 싱글톤 객체가 전역으로 사용되는 객체이기 때문에 다른 클래스의
      객체들이 접근하여 사용할 수 있다.
      ❗❗ 단, 여러 클래스의 객체에서 싱글톤 객체의 데이터에 동시에 접근하게
      되면 동시성 문제가 발생할 수 있다.

SingleTon 생성

  • 1. 스스로의 객체를 static으로 선언

    • static이 적용된 자원은 메모리의 고정영역에 생성되기 때문에, 클래스 자체의
      객체나, 그 안에 포함된 멤버변수, 메서드와는 메모리 상에서 구별된다고 볼 수 있다.
// 싱글톤 예시 

public class Calc{
	static Calc current;
}
  • 2. 외부에서 이 객체에 직접적인 접근을 못하도록 은닉시킨다.

public class Calc{
	private static Calc current;
}
  • 3. 외부에서 객체 생성을 못하도록 객체 할당 금지하기

    • 기본 생성자를 private 형태로 정의하면 객체 생성자가 은닉 처리되어 외부에서
      new 연산자를 사용한 객체 할당이 금지된다.
public class Calc{
	private static Calc current;
    
    // 생성자를 private
    private Calc() {}
}
  • 4. 은닉된 객체를 할당하거나 메모리에서 삭제하는 기능 추가

    • current객체를 private으로 지정하였기 때문에 객체를 메모리에서 간접적으로
      할당하고 삭제하기 위한 메서드가 필요하다.
    • 객체를 메모리에서 제어하기 위해서는 null을 사용한다.
public class Calc{
	private static Calc current;
		
    private Calc() {}
    
	// 객체 할당 처리
	// 객체가 할당되지 않은 경우에만 할당하도록 하여 중복 할당을 방지한다.
	public static Calc getInstance() {
		if(current == null) {
			current = new Calc();
		}						
		return current;
	}
	
	// 객체에 null을 대입하면 메모리에서 삭제된다.
	public static void freeInstance() {
		current = null;
	}
}



✍ 코드 예시

public class Calc {
	// ------------------------ 싱글톤 객체 생성을 위한 준비 시작 ----------------------
	private static Calc current;
	
    private Calc() {}
    
	public static Calc getInstance() {
		if(current == null) {
			current = new Calc();
		}
		
		return current;
	}
	
	public static void freeInstance() {
		current = null;
	}
	// ------------------------ 싱글톤 객체 생성을 위한 준비 끝 ----------------------
	
	// 이 클래스가 구현해야 하는 기능
	public void plus(int x, int y) {
		int z = x + y;
		System.out.println(x + " + " + y + " = " + z);
	}
	
	public void minus(int x, int y) {
		int z = x - y;
		System.out.println(x + " - " + y + " = " + z);
	}
	
}
public class Main {

	public static void main(String[] args) {
		// 별도의 객체에 참조시키는 경우
		Calc loader1 = Calc.getInstance();
		loader1.plus(10, 20);
		
		// 참조처리를 생략하고 직접 사용하는 경우
		Calc.getInstance().minus(100, 50);
		Calc.getInstance().plus(100, 50);
	}

}

👉 실행 결과

10 + 20 = 30
100 - 50 = 50
100 + 50 = 150



📙 정리

  • 싱글톤은 getInstance() 메서드를 사용하여 객체를 리턴 받는 형식으로 사용한다.

  • 여러개의 객체를 리턴 받더라도 모두 하나의 static 객체를 참조하게 되기 때문에
    전역 객체 하나만이 메모리에 할당되게 된다.

좋은 웹페이지 즐겨찾기