[JAVA] 싱글톤 패턴 정리

    싱글톤 패턴이란?

    싱글톤 패턴(Singleton pattern)을 따르는 클래스는, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. 이와 같은 디자인 유형을 싱글턴 패턴이라고 한다. 주로 공통된 객체를 여러 개 생성해서 사용하는 DBCP(DataBase Connection Pool)와 같은 상황에서 많이 사용된다.

    싱글톤 패턴 구현

    public class Singleton {
    
        // static field
        private static Singleton singleton = new Singleton();
        
        // constructor
        private Singleton(){}
        
        //static method
        public static Singleton getInstance(){
            return singleton;
        }
    }

     

    먼저 private static으로 Singleton 객체의 인스턴스를 선언하고 getInstance() 메소드가 처음 실행될 때만 단 하나의 인스턴스가 생성되고 그 후에는 이미 생성된 인스턴스를 리턴한다.

     

    생성자에 private를 붙여 외부에서 생성자를 호출할 수 없어 클래스 new 클래스() 방식으로 외부에서 객체를 얻을 수 없다. 클래스 외부에서 객체를 얻는 유일한 방법은 getInstance() 메소드를 호출하는 방법이다. 

     

    getInstance() 메소드는 단 하나의 객체만 리턴하기 때문에 여러 번 호출하더라도 동일한 객체만 참조한다. 따라서 아래 코드에서 변수 a, b는 동일한 객체를 참조한다.

     

    public class SingletonPrac {
        public static void main(String[] args) {
            Singleton a = Singleton.getInstance();
            Singleton b = Singleton.getInstance();
    
            if (a == b) System.out.println("같은 객체를 참조"); // 같은 객체를 참조
        }
    }

     

    싱글톤 패턴의 장점

    •  static으로 한 개의 인스턴스 만을 고정된 메모리 영역에 생성하여 인스턴스를 사용하기 때문에 메모리 낭비를 방지할 수 있다.
    • 인스턴스는 전역으로 사용 가능하기 때문에 여러 클래스에서 데이터를 공유하며 사용할 수 있다.
    • 이미 생성된 인스턴스를 사용할 때는 객체 로딩 시간이 줄어 성능이 좋아진다.

    싱글톤 패턴의 단점

    • 많은 데이터를 공유할 경우 다른 클래스의 인스턴스 간에 결합도가 높아진다 (객체 지향 설계 원칙에 위배)
    •  매번 인스턴스의 상태를 초기화시켜주어야 하기 때문에 수정과 테스트 하기 어려워진다.
    • 멀티스레드 환경에서 동기화 처리를 안 하면 인스턴스가 2개가 생성 되는 경우가 발생할 수 있다.

     

    728x90

    댓글