본문 바로가기

백엔드 기술/Java

SingleTon 디자인 패턴

[싱글톤 패턴]

소프트웨어 디자인 패턴 중 하나인 #싱글톤 패턴 은,
생성자가 여러차례 호출되어도 실제로 생성되는 객체는 하나이며,
최초 생성 이후 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴하는 것.
즉, 하나의 클래스에 하나의 객체를 생성하도록 하는 패턴.

 

[장점]

1. 메모리 측면의 이점
> 1개의 인스턴스만을 고정 메모리 영역에 생성하므로, 메모리 낭비를 방지 가능

2. 객체의 유일성을 보장

3. 속도 측면의 이점
> 생성된 인스턴스를 사용할 때는 이미 생성된 인스턴스를 활용하므로 속도에 있어서 빠르다.

4. 데이터 공유의 이점
> 싱글톤이 적용된 클래스의 인스턴스는 #전역 인스턴스라 다른 클래스의 인스턴스들과 데이터 공유가 쉽다.

 

[단점]

1. #전역 인스턴스 이므로 다른 클래스의 인스턴스와 의존성이 높아진다.
2. 수정, 테스트가 어렵고, 유지보수 비용이 높아진다.
3. 멀티쓰레드 환경에서 동시성 문제가 발생할 수 있다.
> 대비책
A. static을 사용하여 싱글톤 인스턴스 및 메서드 생성.

public class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton() {
    }

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

위의 예제 코드처럼 static 을 사용하여 변수를 생성하고 static 메서드를 생성하면
static 변수는 객체가 생성되기 전, 클래스가 메모리에 로딩될 때 생성되어
프로그램이 종료될 때 까지 유지되어 모든 객체에서 참조할 수 있기 때문에

#멀티쓰레드 환경에서도 다른 객체를은 getInstance() 메서드를 통해 동일한 인스턴스를 공유할 수 있다.

B. synchronized 처리

public class Singleton {
        private static Singleton instance;

        private Singleton() {}
        
        public static synchronzied Singleton getInstance() {
            if(instance  == null) {
                instance  = new Singleton();
            }
            return instance;
    }
}

1. private static으로 인스턴스 변수를 생성.
2. private으로 생성자를 만들어 외부에서의 생성을 방지.
3. static 메서드를 생성할 때 synchronized 동기화를 활용해 스레드를 안전하게 만듬.
하지만 동기화의 경우 Thread-safe를 보장하기 위해 성능 저하를 유발하여 권장되지 않음.

 

[결론]

#싱글톤 패턴의 경우 메모리, 속도, 데이터 공유 측면에서의 이점이 있지만,
#멀티쓰레드 환경에서는 동시성 문제가 발생할 수 잇기 때문에,
#싱글톤 패턴을 적용하기 전,
"해당 객체의 인스턴스는 반드시 1개만 존재해야하나?" 와 "사용했을 때, 동시성 문제가 발생하지 않는가?"
를 잘 체크해보고 사용을 해야한다.

 

'백엔드 기술 > Java' 카테고리의 다른 글

Optional<T> 클래스란 ?  (0) 2023.04.21
Multi-Thread & Multi Process  (0) 2023.04.20
컴파일(Compile)과 런타임(Runtime)  (0) 2023.04.20
Java - Generic 제네릭이란 ?  (0) 2023.04.20
컬렉션과 스트림의 차이  (0) 2023.04.19