#1. SingleTon 패턴

1. 객체지향 디자인 패턴

1) 객체지향의 디자인이란?

  • 객체지향에서의 디자인은 설계를 뜻한다.
  • 코드가 얼마나 효율적이고 견고하게 잘 만들어졌냐에 대한 설계와 관련된 얘기이다.

 

2) 객체지향 디자인 패턴

  • 프로그램 소스를 작성하는데 있어 이미 검증된 작성 패턴들을 말한다.
    • 사람들의 경험을 바탕으로 쉽고, 효율적으로 이론화 되었다.
  • 팩토리, 옵저버, 모듈, 프로토타입, 서비스, 싱글톤, mvc, mvvc 등의 종류가 있다.
  • 객체지향 디자인 패턴은 약 30가지 정도 되며, 개발자로서 알고 있어야할 객체지향 디자인 패턴은 10가지 정도가 된다.
  • 자바스크립트는 객체지향이라는 개념을 도입한지 얼마 안되었기 때문에 디자인 패턴에 대한 언급이 상대적으로 낮다.
    • 자바스크립트에서는 3~4가지정도 언급하며, 객체지향을 잘 설명할 수 있는 언어는 자바이다.

 

2. SingleTon 패턴

1) SingleTon 패턴이란?

  • 객체 인스턴스가 오직 1개만 생성되는 클래스 작성 패턴이다.
  • 소프트웨어 디자인 패턴에서 SigleTon pattern을 따르는 클래스는 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고, 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. 
  • 주로 공통된 객체를 여러개 생성해서 사용하는 DBCP(DataBase Connection Pool)와 같은 상황에서 많이 사용된다.
  • 인스턴스가 한 개만 존재하는 것을 보장하고 싶은 경우 싱글톤 패턴을 사용한다.

 

2) SingleTon 패턴을 사용하는 이유

- 메모리 측면

  • 최초 한번의 new 연산자를 통해서 고정된 메모리 영역을 사용하기 때문에 추 후 해당 객체에 접근할 때 메모리 낭비를 방지할 수 있다.
  • 이미 생성된 인스턴스를 활용하니 속도 측면에서도 이점이 있다.

 

- 데이터 공유

  • 싱글톤 인스턴스가 전역으로 사용되는 인스턴스 이기 때문에 다른 클래스의 인스턴스들이 접근하여 사용 할 수 있다.
    • 데이터 공유가 쉽다.

 

3. SingleTon 클래스

1) 싱글톤 클래스 작성 예시

class Foo {
    static current = null;
    static getInstance() {
        if (Foo.current === null) {
            Foo.current = new Foo();
        }
        return Foo.current;
    }
// ... 이 클래스의 일반 생성자와 메서드들을 정의
}
  • getIstance를 호출 후 currnet가 null일 경우 자기 스스로의 객체를 할당한다. (호출하면 더이상 null이 아니게 된다)
  • 또 호출하면 더이상 null이 아니므로 할당된 객체를 다시 리턴한다. (if문을 건너뛴다)
  • 즉, 하나의 객체를 여기저기 리턴한다.

 

2) 싱글톤 객체 사용

f1 = Foo.getInstance();
f2 = Foo.getInstance();
f3 = Foo.getInstance();
  • 위의 코드에서 f1, f2, f3는 모두 Foo.current라는 하나의 객체를 공유해서 참조한다.

 

3) 사용 예시

- 싱글톤 클래스

class Calc {
  // 싱글톤 객체
  static current = null;
  
  static getInstance() {
    if(Calc.current === null) {
      Calc.current = new Calc();
    }
    
    return Calc.current;
  }
  
  plus(x, y) {
    return x + y;
  }
  
  minus(x, y) {
    return x - y;
  }
  times(x, y) {
    return x * y;
  }
  
  div(x, y) {
    return x / y;
  }
};

 

- 객체 사용

c1 = Calc.getInstance();
console.log(c1.plus(10,20));  // 30

c2 = Calc.getInstance();
console.log(c2.minus(10,20));  // -10

// 메서드 체인으로 사용
console.log(Calc.getInstance().times(10,20));  // 200
console.log(Calc.getInstance().div(10,20));    // 0.5

+ Recent posts