디자인 패턴

전영덕·2023년 2월 1일
0

Java Study

목록 보기
26/36

1 .디자인 패턴이란?

  • 방청소를 할 때, 여러방 법들을 시도해보고 제일 효율적인 방법을 찾고 루틴화시킬수 있다. 이것을 코딩에 적용한 일종의 기법이다.
  • 디자인 패턴이란 기존 환경 내에서 반복적으로 일어나는 문제들을 어떻게 풀어갈 것인가에 대한 일종의 솔루션 같은 것이다.
  • 디자인 패턴은 설계자들이 "올바른 설계를 빠르게 만들 수 있도록 도와준다."
  • Headfirst(전문서적 중 유명함) 생각을 먼저하라는 것이고, 딱딱하지않은 전문 서적
    수업시간에도 싱글톤 하나만 배울 것인데, 나중에 3년 후쯤 필요할테니 이 책으로 스터디하는 것을 추천. 좋은 중고서적이 많다

2. Singleton 패턴

  • 프로그래밍 내의 여러 곳에서 사용되어야 하는 객체에 대해 전역적인 범위를 갖도록 객체를 생성하고, 이 객체를 여러 곳에서 공유하기 위한 클래스 작성 패턴
  • 이런 패턴을 통해 생성된 객체를 Singleton객체라고 한다.

3. Singleton 객체의 이점

  • 프로그램의 번역에서 활용할 재료로 사용되는 고유 기능을 하나만 생성하여 여러 곳에서 재사용 함으로써 메모리를 효율적으로 사용할 수 있다.
  • 단 한번만 객체를 생성하면 다시 객체를 생성할 필요가 없기 때문에, 해당 기능을 사용할 때마다 객체를 일일이 생성해야 하는 번거로움을 피할 수 있다.
  • 싱글톤에서는 동시성의 이유가 있어서(즉 사용자들여럿이 변수를 바꿔버릴 수가 있어서) 변수는 선언은 하지않는다. 가능은 하다. 상수는 바뀌지않으니 선언해도 된다.
public class Main01 {

	public static void main(String[] args) {
		// getInstance()메서드를 사용하여 객체를 리턴받는 형식
		Calc c1 = Calc.getInstance();

		//여러 개의 객체를 리턴 받더라고 모두 하나의 static객체를
        //참조하기 때문에 전역 객체 하나만이 메모리에 할당하게 된다.
		System.out.println(c1.plus(10, 5));
        
        // 참조처리를 생략하고 직접사용하는 경우
		System.out.println(Calc.getInstance().minus(20, 10));
	}
}
public class Calc {
	//static이 적용된 자원은 메모리의 고정영역에 생성 되기 때문에,
    //클래스 자체의 객체나 그 안에서 포함된 멤버변수, 메서드와는 메모리상에서 구별된다고 볼 수 있다.
    //그러므로 Calc클래스 안에 static형태로 Calc클래스의 객체를 정의하더라도 코드상의 논리적인
    //연관관계를 위해 하나의 파일에서 정의하는 것일 뿐, 실제로는 Calc클래스 자체에서 독립된 객체가 되는 것이다.
    //Calc클래스 이외의 여러 곳에서 new연산자를 사용하여 객체 할당이 가능하다면
    //SingleTon이라는 개념 자체가 성립되지않으므로, 외부에서 이 객체를
	//직접적인 접근을 못하도록 은닉시킨다.
    
	// 싱글톤 객체를 생성하기 위한 준비 시작
    
    // 메서드로 간접적으로 접근할 것임.
	private static Calc current;

//current객체를 private로 지정했기 때문에
//객체를 메모리에서 간접적으로 할당하고 삭제하기 위한 메서드가 필요하다.
                                                       
	public static Calc getInstance() {
		if (current == null) {
			current = new Calc();
		}
		return current;
	}
	// 객체를 메모리에서 제어하기 위해서는 null을 사용. 객체에 null을 대입하면 메모리에서 삭제된다.
	public static void freeInstance() {
		current = null;
	}

	// 기본 생성자를 private 형태로 정의하면 객체 생성자가 은닉처리되어
    // 외부에서의 new연산자를 사용할 객체 할당이 금지된다.
	private 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; // y == 0인 경우생략}
}
  • 내가 계발하고있는 것이 계산기라면 이것을 자주 쓰게 된다. static영역을 쓰려면 타당한 이유가 있어야 한다.
  • 기능은 그대로 두고 코드만 추가한다.

0개의 댓글