BackEnd/Java

[Java] 싱글톤(Singleton)이란?

꾹꾹이 2022. 10. 10. 16:59
728x90

싱글톤 패턴이란?

 

객체의 인스턴스가 오직 1개만 생성되는 패턴

 

생성자가 여러번 호출되어도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최로에 생성한 객체를 리턴한다.

 

아래는 예시이다.

1
2
3
4
5
6
7
8
9
10
11
public class SingleTonEX{
    private static SingleTonEx instance;  //singleTonEx클래스를 static으로 선언하여 다른곳에서 사용할 수 있게 함
    private SingleTonEx(){}  //생성자를 외부에서 호출 못하게 private으로 생성
 
    public static SingleTonEx getInstance(){
        if(instance==null){
            SingleTon = new SingleTonEx();  
        }
        return instance;
    }
}
cs

 

 

아래는 더 직관적인 예시이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class CarClass {
    
    private static ClarClass car = new CarClass();    //자기 자신을 멤버로 선언해서 메모이레 올림(static)
 
    private CarClass() {}
 
    //외부에서 멤버로 선언된 car를 가져올 수 있는 메소드를 생성
    public static CarClass getInstance() {
        return car;
    }
 
    private static boolean isUse = false;
 
    //차 사용 시작
    public static void drive() {
        isUse = true;
        System.out.println("start driving");
    }
 
    //차 사용 종료
    public static void parking() {
        isUse = false;
        System.out.println("parking");
    }
 
    public static boolean isEnableUseCar() {
        return !isUse;
    }
}
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
CarClass car = CarClass.getInstance();
 
//사용
if (car.isEnableUseCar()) {
    car.drive();
}
 
//사용요청
if (car.isEnableUseCar()) {
    car.drive();
else {
    System.out.println("WAIT!")
}
cs

 

싱글톤 패턴의 장점

  • 고정된 메모리 영역을 얻으면서 한 번의 new로 인스턴스를 사용하기 때문에 메모리 낭비를 방지할 수 있다.
  • 싱글톤으로 만들어진 클래스의 인스턴스는 전역이기 때문에 다른 클래스의 인스턴스들이 데이터를 공유하기 쉽다.
  • 인스턴스가 절대적으로 한 개만 존재하는 것을 보증하고 싶을 경우 사용한다.
  • 두 번째 이용시 부터는 객체 로딩 시간이 줄어 성능이 좋아지는 장점이 있다.

 

싱글톤 패턴의 단점

  • 싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우, 다른 클래스의 인스턴스들 간에 결합도가 높아져 "개방-폐쇄 원칙"을 위배하게 된다.
  • 이는 수정을 어렵게 만들고 객체 지향 설계 원칙에 어긋나며 유지보수 비용이 높아진다.
  • 멀티쓰레드 환경에서 동기화 처리를 안하면 인스턴스가 2개 생성될 수 있다.