자바 Java/문법 - 객체 지향
싱글톤(Singleton Pattern) - 객체를 하나만 생성
하나비 HANABI
2022. 1. 5. 17:13
싱글톤 패턴: 프로그램 내부에서 객체를 단 1개만 생성시킬 수 있도록 클래스 제작
만드는법:
1. 클래스 자신의 타입으로 정적 필드 선언
-> 자신의 객체를 생성해 초기화하고, private 접근 제한자를 붙여서 필드 값 변경 불가하도록
2. 외부에서 new 연산자로 생성자를 호출할 수 없도록 막기
-> private을 생성자 앞에 붙이기
3. 외부에서 호출할 수 있는 정적 메소드인 getInstance() 선언
-> 정적 필드에서 참조하고 있는 자신의 객체 리턴
<Singleton.java>
public class Singleton {
private static Singleton s = new Singleton();
private Singleton() {}
static Singleton getInstance() {
return s;
}
}
<SingletonEx.java>
public class SingletonEx {
public static void main(String[] args) {
// Singleton s1 = new Singleton(); -> private으로 생성자 막혀있어서 오류
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
if(s1 == s2) { // 주소값 비교
System.out.println("s1과 s2는 같은 상글톤 객체입니다."); // -> 출력
} else {
System.out.println("s1과 s2는 다른 상글톤 객체입니다.");
}
// 결론: 싱글톤 객체는 다 같으며 하나 뿐임
}
}
또다른 예제
class Tiger{
static Tiger t = null;
private Tiger() {}
static Tiger getObject() {
System.out.println(1);
if(t == null) {
System.out.println(2);
t = new Tiger();
}
return t;
}
}
public class SingletonPattern {
public static void main(String[] args) {
Tiger t1 = Tiger.getObject(); // 1 2
Tiger t2 = Tiger.getObject(); // 1
System.out.println(t1.hashCode()); // 2111991224
System.out.println(t2.hashCode()); // 2111991224
System.out.println( (t1 == t2)? "O" : "X" ); // O
}
}
t1와 t2는 객체가 똑같으므로 t2를 출력할때는 null 상태가 아님 -> 1만 출력