[디자인 패턴] 싱글턴 패턴이란?

싱글턴 패턴이란 객체의 인스턴스가 오직 1개만 생성되도록 제한하는 패턴이다.  싱글턴의 장점은 다음과 같다.

  • 하나의 객체만 생성되며 추후 해당 객체에 접근할 때 불필요한 메모리 낭비를 방지 할 수 있다.
  • 전역으로 공유하기 때문에 다른 클래스의 인스턴스들이 데이터를 공유하기 쉽다는 장점이 있다.
  • DBCP, 스레드풀, 캐시, 로그 기록 객체 등에 이용된다.

여기서 DBCP란 DataBase Connection Pool을 의미한다.

Connection Pool이란 DB Connection 객체를 여러개 생성 한 후 Pool에 담아놓고 필요할 경우 불러와서 사용하기 위한 것이다.

 

DB에서 데이터를 가져올 경우 먼저 드라이버를 로드하고 커넥션 객체를 받아오는 일련의 과정이 필요하지만 사전에 만들어 놓는다면 커넥션 객체를 Pool에서 가져오기 때문에  DB 연결 시간이 단축된다.

 

그럼 이제 싱글톤 구현 법을 알아보자.

package pattern.ch1.singleton;

class GPS {

    // instacne를 static으로 선언하여 다른 클래스들 간 공유
    private final static GPS instance = new GPS();

    private GPS() {
        // 외부에서 생성자에 대한 접근을 막기위해 private으로 생성자 선언
    }

    public static GPS getInstance() {
        return instance;
    }
}

public class SingletonEx {
    public static void main(String[] args) {
        GPS gps_1 = GPS.getInstance();
        GPS gps_2 = GPS.getInstance();
        if (gps_1.equals(gps_2)) {
            System.out.println("같은 instance 입니다.");
        }
    }
}

 

출력결과 

같은 instance 입니다.

 

instance를 static으로 선언하는 이유는 크게 2가지다. 

  • 다른 클래스들 간 공유를 하기 위해
  • instance가 오직 하나만 만들어진 다는것을 명시하기 위해

getInstance 메소드에서 객체 생성을 관리하기 때문에 생성자를 private으로 선언하여 외부에서의 생성자에 대한 접근을 막는다. getInstance 메소드에서만 해당 instance를 반환받아서 사용할 수 있다.

 

main문을 살펴보면 getInstance 메소드로 생성한 2개의 인스턴스가 있다.

하지만 gps_1, gps_2는 사실 같은 instance이기 때문에 equals 함수로 비교해보면 같다는 것을 알 수 있을 것이다.