자바 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만 출력