디자인 패턴; singleton 패턴

로로·2023년 8월 26일

전 시스템에 단 하나의 인스턴스만이 존재하도록 구현하는 방식
여러 개의 instance를 만들면 문제가 되는 경우

  1. Java는 글로벌 변수가 없다
    => static 변수 사용
  2. 생성자가 없으면 public default 생성자가 생성된다
    => 생성자를 private로 생성
  3. 외부에서 생성된 static으로 생성된 객체를 사용할 수 있어야 한다
    => public 으로 선언된 static 메서드 제공

ex)

  • like C의 글로벌 변수
  • 자동차 회사 1개 (단, 1개의 인스턴스)
    직원, 공장, 생산된 자동차, 운반차
  • 날짜, 시간대

🔵 일반적인 class 생성

public class Company {

	// default constructor
	Company() {
	}
}
public class CompanyTest {

    public static void main(String[] args){
    
        Company company1 = new Company();
        Company company2 = new Company();

        System.out.println(c1);
        System.out.println(c2);
    }
}

🔵 static 응용; Singleton 패턴

=> Company 인스턴스를 1개만 생성해야 할 때

public class Company {

    // private : 외부에서 이 constructor를 생성할수 없도록 하기 위함
    private Company(){

    }

    // private : 값이 변경되면 안되기 때문에
    // static : 단 하나만 생성하기 위해
    // insatce는 class 내부에서만 생성
    private static Company instance = new Company();

    // public : 외부에서 instace를 접근 가능
    // static : 객체 생성없이 클래스 이름으로 참조해서 호출 가능
    public static Company getInstance(){
        if (instance == null){
            instance = new Company();
        }
        return instance;
    }
    // 그런데, 이 메서드가 일반 메서드이기 때문에 객체를 생성한 후에 호출이 가능
    // => static 으로 선언하면 가능!
}
  • default 생성자가 아닌 private 로 생성자 선언
  • insatance는 class 내부에서 생성
  • 외부에서 instance에 접근할 메서드 생성
    단, 메서드 역시 객체가 생성된 후에 호출이 가능하기 때문에 static으로 선언
public class CompanyTest {

    public static void main(String[] args){
        // Company company1 = new Company();
        // Company company2 = new Company();

        // 프로그램 내에서 인스턴스를 1개만 생성되도록 하자!

        // Company 를 가져다 쓰기 위해서 Company 내부에 선언
        Company c1 = Company.getInstance();
        Company c2 = Company.getInstance();

        System.out.println(c1);
        System.out.println(c2);
        // 결과 : 동일한 주소값이 출력됨

        Calendar cal = Calendar.getInstance();
        System.out.println(cal.getTime());
    }
}
profile
청로하~🏝️

0개의 댓글