👩🏻‍💻 Programming/Java

Static과 싱글톤 패턴 (Singleton Pattern)

한국의 메타몽 2021. 6. 9. 15:21

 

싱글톤 패턴이란? 

 

  • 프로그램에서 인스턴스가 단 한 개만 생성되어야 하는 경우 사용하는 디자인 패턴
    (ex : 서울-도쿄시 타임존, 회사.. 등등 단 1개만 존재할 수 있는 경우)
  • 주로 서로 자원을 공유할 때 사용되는데, TCP Socket 통신에서 서버와 연결된 connect 객체에 주로 사용
  • Static 변수와 getInstance()를 구현하여 싱글톤 패턴 제작 가능
디자인 패턴이란?
자주 사용하는 설계 패턴을 정형화해서 이를 유형별로 분리한 설계
GOF(Gang of four)의 디자인 패턴에서 소개되었으며,
생성 / 구조 / 행위 3가지 항목으로 나누어진 총 23개의 디자인 패턴이 존재한다.

 

 

싱글톤 패턴으로 객체 구현하기

 

  • 객체는 private static으로 선언해서 오로지 한 번만 생성하도록 구현 (private static Company instance = new Company())
  • 생성자는 private로 선언 (private Compnay())

 

static로 선언

  • 객체를 생성해서 결과를 테스트

 

몇번을 출력해도 같은 주소를 출력한다

 

  • 결론적으로 어떤 클래스에서 사용하더라도 getInstance()을 했을 때 동일한 객체를 얻는다.

 

 

싱글톤 패턴의 또다른 예제

 

Car, CarFactory. 2개의 클래스를 활용하여 아래와 같이 구현한다.

CarFactory는 유일한 객체이고, 이 공장에서 생산되는 자동차는 제작될때마다 고유한 번호가 부여된다.
자동차번호는 10000부터 시작되어 자동차가 생산될때마다 +1씩 번호가 더해진다.
이렇게 번호가 부여되도록 CarFactory 클래스, Car 클래스, CarFactoryTest.java 클래스를 구현하라.

 

[ Car.java ]

package ch19;

public class Car {

    private static int serialNumber = 10000;
    private int carNumber;

    public Car(){
        serialNumber++;
        carNumber = serialNumber;
    }

    public int getCarNum(){
        return carNumber;
    }
}

 

[ CarFactory.java ]

package ch19;

public class CarFactory {
    private static CarFactory carFactory = new CarFactory();

    private CarFactory(){};

    public static CarFactory getInstance(){
        if(carFactory==null) carFactory = new CarFactory();
        return carFactory;
    }

    public Car createCar(){
        Car car = new Car();
        return car;
    }
}

 

[ CarFatoryTest.java ]

package ch19;

public class CarFactoryTest {
    public static void main(String[] args){
        CarFactory factory = CarFactory.getInstance();
        Car mySonata = factory.createCar();
        Car yourSonata = factory.createCar();

        System.out.println(mySonata.getCarNum());
        System.out.println(mySonata.getCarNum());
        System.out.println(yourSonata.getCarNum());
    }
}

 

[ Result ]

10001
10001
10002