싱글톤 디자인 패턴(Singleton Design pattern)
- 단 하나의 유일한 인스턴스만을 생성하여 공유하도록 하는 기법
- 외부에서 인스턴스 생성을 하지 못하도록 차단하고 클래스 내에서 직접 인스턴스를 생성 후 외부로 리턴하는 기법
- 누구나 단 하나의 인스턴스만을 공유하여 사용해야함 ( => 즉, 외부에서 new를 통한 새 인스턴스 생성 불가능!)
패턴규칙
- 외부에서 인스턴스 생성이 불가능하도록 생성자에 private 접근제한자를 선언하여 정의
- 자신의 클래스에서 직접 인스턴스를 생성하여 참조변수에 저장 => 외부에서 인스턴스 생성 없이도 접근할 수 있도록 static 키워드 사용 => 외부에서 함부로 접근하지 못하도록 private 접근제한자 선언
- 생성된 인스턴스를 외부로 리턴하는 Getter 메서드 정의 => private 접근제한자로 선언된 멤버변수 instance에 접근하여 생성된 인스턴스를 리턴하는 용도로 정의 => 인스턴스 생성없이 호출해야하므로 static 키워드 사용
package static_member;
public class Ex4 {
public static void main(String[] args) {
SingletonClass sc = SingletonClass.getInstance();
// 리턴받은 인스턴스는 참조변수(sc)를 통해 접근 가능함
sc.str="싱글톤 패턴으로 생성한 인스턴스의 str!";
System.out.println(sc.str);
} //main() 메서드 끝
} // Ex4 클래스 끝
class SingletonClass {
String str; // 임시 확인용 변수
// 기본 생성자 정의
// public SingletonClass() { }
// 1. 외부에서 생성자 호출이 불가능하도록 private 접근제한자 선언
private SingletonClass() { } // 나혼자 쓸랭
// 2. 자신의 클래스 내에서 인스턴스를 직접 생성 후 참조변수에 저장
// => 인스턴스 생성없이 접근해야하므로 static 키워드 사용해야함
// => 외부에서 함부로 접근하지 못하도록 private 접근제한자 선언
private static SingletonClass instance = new SingletonClass();
// private을 붙이니 -> instance에 빨간줄. 접근을 할 수 없게됨
// 3. 생성된 인스턴스를 외부로 리턴하는 Getter 메서드 정의
// => 인스턴스를 저장하는 변수 instance가 private 접근제한자이므로
// 접근이 불가능한 대신 인스턴스 주소를 리턴하는 목적으로 정의
// => 인스턴스 생성 없이 접근해야하므로 static 키워드 사용
public static SingletonClass getInstance() {
return instance;
}
} //SingletonClass 클래스 끝
Account 클래스를 싱글톤 디자인 패턴을 적용하여 설계
- 멤버변수 :accountNo, ownerName, balance 모두 private 설정
- 메서드 : showAccountInfo(); 멤버변수에 대한 Getter/Setter 정의
package static_member;
public class Test4 {
public static void main(String[] args) {
// 생성된 인스턴스 주소를 리턴
Account acc = Account.getInsAccount();
// Setter() 호출하여 111-1111-111, 땅콩이, 10000 입력
acc.setAccountNo("111-1111-111");
acc.setOwerName("땅콩");
acc.setBalance(10000);
// showAccountInfo() 메서드로 정보 출력
acc.showAccountInfo();
}
}
/*
* Account 클래스를 싱글톤 디자인 패턴을 적용하여 설계
* - 멤버변수 :accountNo, ownerName, balance 모두 private 설정
* - 메서드 : showAccountInfo(); 멤버변수에 대한 Getter/Setter 정의
*/
class Account {
// =============== Account 클래스에 대한 싱글톤 패턴 구현 ===============
// 1. 자신의 인스턴스를 생성하여 자신의 클래스 타입 변수 instance에 저장
// => private static 선언
private static Account instance = new Account();
// 2. 기본생성자 정의 => private 선언
private Account() { }
// 3. Getter 정의 => public static 선언
public static Account getInsAccount() {
return instance;
} // Account 클래스 끝
// ============================================================
// 멤버변수 선언
private String accountNo;
private String owerName;
private int balance;
// alt shift s -> r
public String getAccountNo() {
return accountNo;
}
public void setAccountNo(String accountNo) {
this.accountNo = accountNo;
}
public String getOwerName() {
return owerName;
}
public void setOwerName(String owerName) {
this.owerName = owerName;
}
public int getBalance() {
return balance;
}
public void setBalance(int balance) {
this.balance = balance;
}
public void showAccountInfo() {
System.out.println("계좌번호 : " + accountNo);
System.out.println("예금주명 : " + owerName);
System.out.println("현재잔고 : " + balance);
}
}
'JAVA' 카테고리의 다른 글
[JAVA] has-a 관계(포함) vs is-a 관계(상속) (0) | 2023.09.18 |
---|---|
[JAVA] 상속(inheritance) (0) | 2023.09.18 |
[JAVA] static 키워드 (0) | 2023.09.13 |
[JAVA] import 키워드 (1) | 2023.09.13 |
[JAVA] package(패키지) (0) | 2023.09.13 |