단 하나의 유일한 인스턴스만을 생성하여 공유하도록 하는 기법
외부에서 인스턴스 생성을 하지 못하도록 차단
클래스 내에서 직접 인스턴스를 생성 후 외부로 리턴
누구나 단 하나의 인스턴스만을 공유하여 사용해야함
-> 외부에서 new 키워드를 사용한 새 인스턴스 생성 불가능
생성자에 private 접근제한자 선언하여 정의
-> 외부에서 인스턴스 생성 불가능해짐
자신의 클래스에서 직접 인스턴스 생성하여 참조변수에 저장
-> 외부에서 인스턴스 생성없이도 접근할 수 있게 static
키워드 사용
-> 외부에서 함부로 접근하지 못하도록 private 접근제한자 선언
생성된 인스턴스를 외부로 리턴하는 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);
}
}