[자바] 싱글톤 디자인 패턴

Gammi·2022년 10월 20일
0

JAVA

목록 보기
14/35
post-thumbnail

📓 싱글톤 디자인 패턴(Singleton Design Pattern)


  • 단 하나의 유일한 인스턴스만을 생성하여 공유하도록 하는 기법

  • 외부에서 인스턴스 생성을 하지 못하도록 차단

  • 클래스 내에서 직접 인스턴스를 생성 후 외부로 리턴

  • 누구나 단 하나의 인스턴스만을 공유하여 사용해야함

    -> 외부에서 new 키워드를 사용한 새 인스턴스 생성 불가능


✔ 패턴 규칙


  1. 생성자에 private 접근제한자 선언하여 정의

    -> 외부에서 인스턴스 생성 불가능해짐


  2. 자신의 클래스에서 직접 인스턴스 생성하여 참조변수에 저장

    -> 외부에서 인스턴스 생성없이도 접근할 수 있게 static 키워드 사용

    -> 외부에서 함부로 접근하지 못하도록 private 접근제한자 선언


  3. 생성된 인스턴스를 외부로 리턴하는 Getter 메서드 정의

    -> private 접근제한자로 선언된 멤버변수 인스턴스에 접근하여 생성된 인스턴스를 리턴하는 용도로 정의

    -> 인스턴스 생성없이 호출해야하므로 static 키워드 사용



public static void main(String[] args) {
  Singleton s = Singelton.getInstance();
  // 인스턴스 생성 불가능하기 때문에
  // getInstance() 메서드 호출을 통해 가져오기
  // getInstance() 메서드는 static 메서드이므로 
  // 클래스명.메서드() 형태로 호출 가능
  
  System.out.println(s.str);
  // 리턴받은 인스턴스는 참조변수를 통해 접근 가능
  
  Singleton s2 = Singleton.getInstance();
  
  if(s == s2) {
    System.out.println("s와 s2는 같은 인스턴스");
  } else {
    System.out.println("s와 s2는 다른 인스턴스");
  }
  // 같은 인스턴스라고 출력됨
  // 둘 다 null 값 가짐
}
class Singleton {
  String str; // 임시 확인용 변수
  private Singleton() {}
  // 외부에서 호출이 불가한 private 접근제한자로 기본 생성자 만들었음
  private static Singleton instance = new Singelton();
  // 본인 클래스 내에서 인스턴스 생성해야함
  // 외부에서 호출할 수 없도록 private 접근제한자,
  // 외부에서 인스턴스 생성 없이도 접근 가능하도록 static 
  
  public static Singleton getInstance() {
    return instance;
    // instance 변수가 private이므로 Getter 생성
    // 인스턴스 없이 외부에서 접근 가능해야 하므로 static
  }
}





➕ 싱글톤 디자인 패턴 실습


public static void main(String[] args) {
  Account acc = Account.getInstance();
  // 인스턴스 생성 불가하기 때문에 getInstance를 통해 리턴받아야 함
  
  acc.setAccountNo("111-1111-111");
  // 계좌번호 저장
  acc.showAccountNoInfo();
  // 계좌번호 출력
}

class Account {
  private static Account instance = new Account();
  // 자신의 클래스 내에서 인스턴스 생성
  private Account() {}
  // private 기본 생성자
  
  private static getInstance() {
    return instance;
  }
  
  private String accountNo;
  // private accountNo 변수 선언
  
  public String getAccountNo() {
    return accountNo;
  }
  public String setAccountNo(String accountNo) {
    this.accountNo = accountNo;
  }
  public void showAccountNoInfo() {
    System.out.println("계좌번호 : " + accountNo);
  }
}
profile
개발자가 되었어요⭐️

0개의 댓글