DAY08(1) - 디자인 패턴

은나현·2023년 2월 1일
0

📌 1. 디자인 패턴

📍 1-1. 디자인 패턴이란

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

📍 1-2. Singleton 패턴

  • 프로그램 내의 여러 곳에서 반복적으로 사용되어야 하는 객체에 대해 전역적인 범위를 갖도록 객체를 생성하고, 이 객체를 여러 곳에서 공유하기 위한 클래스 작성 패턴
  • 이러한 패턴을 통해 생성된 객체를 싱글톤 객체라고 한다.
    • 프로그램의 전역에서 활용할 재료로 사용되는 공유 기능을 하나만 생성하여 여러 곳에서 재사용함으로써 메모리를 효율적으로 사용할 수 있다.
    • 단 한번만 객체를 생성하면 다시 객체를 생성할 필요가 없기 때문에, 해당 기능을 사용할 때마다 객체를 일일이 생성해야 하는 번거로움을 피할 수 있다.

📍 1-3. Singleton 패턴 작성 예시

  • 정수 파라미터를 2개 받는 간단한 사칙연산 계산기를 싱글톤 패턴으로 작성해 본다.

    public class Calc {

    • static이 적용된 자원은 메모리의 고정영역에 생성되기 때문에 클래스 자체의 객체나, 그 안에서 포함된 멤버변수,메서드와는 메모리 상에서 구별된다고 볼 수 있다.
    • 그러므로 Calc 클래스 안에 static 형태로 Calc 클래스의 객체를 정의하더라도 코드상의 논리적인 연관관계를 위해 하나의 파일에서 정의하는 것일 뿐, 실제로는 Calc 클래스 자체에서 독립된 객체가 되는 것이다.
    • Calc 클래스 이외의 여러 곳에서 new 연산자를 사용하여 객체 할당이 가능하다면 Singleton이라는 개념 자체가 성립되지 않으므로, 외부에서 이 객체에 직접적으로 접근하지 못하도록 은닉시킨다.

    private static Calc current;

    • 외부에서 접근할 수 없는 private static Calc 객체를 하나 선언한다.
    	public static Calc getInstance() {
    		if(current == null) {
    			current = new Calc();
    		}return current;
    	}
    • current 객체를 private로 지정하였기 때문에 객체를 메모리에서 간접적으로 할당하고 삭제하기 위한 메서드가 필요하다.
    • current가 아직 생성되지 않았을 경우 생성 후 리턴하고, 생성되어 있을 경우 그대로 리턴한다.
    	public static void freeInstance() {
    		current = null;
    	}
    • 객체를 메모리에서 제거하기 위해 null을 사용하는 메서드

    private Calc(){}

    • 기본 생성자를 private 형태로 정의해 두면 객체 생성자가 은닉 처리되어 외부에서의 new연산자를 사용한 객체 할당이 금지된다.
    	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)throws ArithmeticException {
    		if(y == 0) {
    			throw new ArithmeticException();
    		}
    		else return x / y;
    	}
    • 계산기가 가져야 할 기능을 정의한 메서드들을 이어서 작성한다.
  • 이하 이 Singleton 패턴으로 만들어진 계산기를 main에서 사용하는 예시이다.

    		// Calc c1 = new Calc(); 
    		Calc c1 = Calc.getInstance();
    • 생성자가 숨겨져 있으므로 new를 사용한 객체 생성은 불가하다. getInstance() 메서드를 사용하여 객체를 리턴받는 형식으로 할당받는다.
    • 여러 개의 객체를 리턴받더라도 모두 하나의 static 객체를 참조하게 되기 때문에 전역 객체 하나만이 메모리에 할당되게 된다.
    		System.out.println(c1.plus(20, 10));				 // 참조처리
    		System.out.println(Calc.getInstance().minus(20,10)); // 참조처리 생략
    • 각각 참조처리하여 사용하는 경우 / 참조처리를 생략하고 직접 사용하는 경우의 예시이다.

0개의 댓글