디자인 패턴(Design Pattern) & 싱글톤

치로·2024년 7월 24일
post-thumbnail

1. 디자인 패턴이란?

: 기존 환경 내에서 반복적으로 일어나는 문제들을 어떻게 풀어날갈 것인가에 대한 일종의 솔루션

  • 디자인 패턴은 설계자들이 "올바른" 설계를 "빨리" 만들 수 있도록 도와줌

2. Singleton 패턴

  • 프로그램 내의 여러 곳에서 반복적으로 사용되어야 하는 객체에 대해 전역적인 범위를 갖도록 객체를 생성하고, 이 객체를 여러 곳에서 공유하기 위한 클래스 작성 패턴
  • 이러한 패턴을 통해 생성된 객체를 싱글톤 객체라고 함

3. Singleton 객체의 이점

  • 프로그램의 전역에서 활용할 재료로 사용되는 공유 기능을 하나만 생성하여 여러 곳에서 재사용함으로 해서 메모리를 효율적으로 사용 가능
  • 단 한번만 객체를 생성하면 다시 객체를 생성할 필요가 없기 때문에, 해당 기능을 사용할 때마다 객체를 일일이 생성해야 하는 번거로움을 피할 수 있음

예시 코드

package singleton;

public class Calc {
	public int plus(int x, int y) {
		return x+y;
	}
	public int minus(int x, int y) {
		return x-y;
	}
	public int times(int x, int y) {
		return x*y;
	}
	public int divide(int x, int y) {
		return x/y;
	}
}
package singleton;

public class Main01 {

	public static void main(String[] args) {
		Calc c1 = new Calc();
		int a = c1.plus(100, 200);
		System.out.println(a);
		
		//Calc c2 = new Calc();
		int b = c1.minus(200, 100);
		System.out.println(b);
	}

}
package singleton;

public class Calc2 {
	// 공통 기능을 포함할 클래스 안에 스스로의 객체를 static 선언
	
	// static이 적용된 자원은 메모리의 고정 영역에 생성되기 때문에,
	// 클래스 자체의 객체나 그 안에 포함된 멤버변수, 메모리상에서 구별됨
	
	// 그러므로 Calc2 클래스 안에 static 형태로 Calc2 클래스의 객체를 정의하더라도,
	// 코드 상의 논리적인 연관관계를 위해 하나의 클래스 파일에 정의하는 것일 뿐, 
	// 실제로는 Calc 클래스 자체에서 독립된 객체가 되는 것
	
	// Calc2 클래스 이외의 여러 곳에서 new 연산자를 사용하여 객체 할당이 가능하다면,
	// SingleTon이라는 개념 자체가 성립되지 않으므로,
	// 외부에서 이 객체에 직접적인 접근을 못하도록 은닉시킴
	
	private static Calc2 current;
	
	// current 객체를 private으로 지정하였기 때문에 객체를 메모리에서 간접적으로 할당하고 삭제하기 위한 메서드가 필요
	// 객체가 할당되지 않은 경우에만 할당하도록 하여 중복 할당을 방지
	public static Calc2 getInstance() {
		if(current == null) {
			current = new Calc2();
		}
		return current;
	}
	
	// new 연산자를 사용한 객체 할당 금지
	// 기본 생성자를 private  형태로 정의하는 객체 생성자가 은닉 처리되어 외부에서 new 연산자를 사용한 객체 할당이 금지
	private Calc2() {
		super();
	}
	
	// 객체에 null을 대입하면 메모리에서 삭제+	
	public static void freeInstance() {
		current = null;
	}
	
	public int plus(int x, int y) {
		return x+y;
	}
	public int minus(int x, int y) {
		return x-y;
	}
	public int times(int x, int y) {
		return x*y;
	}
	public int divide(int x, int y) {
		return x/y;
	}
}
package singleton;

public class Main02 {

	public static void main(String[] args) {
		Calc c2 = new Calc();
		int b = c2.minus(200, 100);
		System.out.println(b);
	}

}
package singleton;

public class Main03 {

	public static void main(String[] args) {
	// 싱글톤 객체 사용하기
	// - getInstance() 메서드를 사용하여 객체를 리턴 받는 형식으로 사용
	// - 여떤 객체를 리턴 받더라도 모두 하나의 static 객체를 참조하게 되기 때문에 전역 객체 하나만이 메모리를 할당되게 함
		
		Calc2 c = Calc2.getInstance();
		Calc2 c2 = Calc2.getInstance();
		Calc2 c3 = Calc2.getInstance();
		Calc2 c4 = Calc2.getInstance();
		
		System.out.println(c.plus(100, 2000));
		System.out.println(c2.plus(100, 2000));
		System.out.println(c3.plus(100, 2000));
		System.out.println(c4.plus(100, 2000));
	}

}
package study.java.helper;

// 기본적인 공통 기능들을 묶어놓은 클래스
public class Util {
	
	// --- 싱글톤 객체 생성 시작 ---
	private static Util current;
	
	public static Util getInstance() {
		if(current == null) {
			current = new Util();
		}
		return current;
	}
	public static void freeInstance () {
		current = null;
	}
	private Util() {
	}	
	// --- 싱글톤 객체 생성 끝 ---
	
	// 범위를 갖는 랜덤값을 생성하여 리턴하는 메서드
	// @param min - 범위 안에서의 최소값
	// @param max - 범위 안에서의 최대값
	// @return - min~max 안에서의 랜덤값
	public static int random (int min, int max) {
		int num = (int)((Math.random() *  (max - min + 1)) + min);
		return num;		}
}

0개의 댓글