Notice
Recent Posts
Recent Comments
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

충분히 쌓여가는

6.15 싱글톤 패턴 본문

이것이 자바다/06 클래스

6.15 싱글톤 패턴

빌드이너프 2024. 4. 2. 06:37

애플리케이션 전체에서 단 한개의 객체만 생성해서 사용하고 싶다면 싱글톤 Singleton 패턴을 적용할 수 있다

 

싱글톤 패턴의 핵심

생성자를 private 접근 제한해서 외부에서 new 연산자로 생성자를 호출할 수 없도록 막는 것

private 클래스() {}

 

생성자를 호출할 수 없으니 외부에서 마음대로 객체를 생성하는 것이 불가능해진다

대신 싱글톤 패턴일 제공하는 정적 메소드를 통해 간접적으로 객체를 얻을 수 있다

public class 클래스 {
  //private 접근 권한을 갖는 정적 필드 선언과 초기화
  private static 클래스 singleton = new 클래스(); //1
  
  //private 접근 권한을 갖는 생성자 선언
  private 클래스() {}
  
  //public 접근 권한을 갖는 정적 메소드 선언
  public static 클래스 getInstance() { //2
    return singleton;
  }
}

1: 자신의 타입으로 정적 필드를 선언하고 미리 객체를 생성해서 초기화 시킨다. 그리고 private 접근 제한자를 붙여 외부에서 정적 필드값을 변경하지 못하도록 막는다

2: 정적 필드값을 retrun하는 getInstance() 정적 메소드를 public으로 선언

 

외부에서 객체를 얻는 유일한 방법은 getInstance() 메소드를 호출하는 것이다

getInstance() 메소드가 return하는 객체는 정적 필드가 참조하는 싱글톤 객체이다

따라서 밑의 변수1과 변수2가 참조하는 객체는 동일한 객체가 된다

클래스 변수1 = 클래스.getInstance();
클래스 변수2 = 클래스.getInstance();

 

예시

package ch06.sec15;

public class Singleton {
	private static Singleton singleton = new Singleton();
	
	private Singleton() {}
	
	public static Singleton getInstance() {
		return singleton;
	}
}
package ch06.sec15;

public class SingletonExample {
	public static void main(String[] args) {
		// Singleton obj1 = new Singleton(); //컴파일 에러
		// Singleton obj2 = new Singleton(); //컴파일 에러
		
		Singleton obj1 = Singleton.getInstance();
		Singleton obj2 = Singleton.getInstance();
		
		if(obj1 == obj2) {
			System.out.println("같은 객체");
		} else {
			System.out.println("다른 객체");
		}
	}
}
같은 객체