java - singleton

imjingu·2023년 8월 16일
0

개발공부

목록 보기
381/481

싱글톤 singleton
'전체 프로그램에서 단 하나의 객체만 만들어서 보장해야하는 경우'에 사용
생성자를 호출한 만큼 객체가 생성되기 때문에

1) 싱글턴을 만들려면 클래스 외부에서 new 연산자로 생성자를 호출할 수 없도록 막아야 함
외부에서 생성자를 호출할 수 없도록 생성자 앞에 private 접근제한자를 붙여줌

2) 그리고 자신의 타입인 정적 필드를 하나 선언하고 자신의 객체를 생성해 초기화함
생성자가 private 이지만 클래스 내부에서는 호출이 가능
정적 필드도 private 접근 제한자를 붙여 외부에서 필드값을 변경하지 못하도록 막음

3) 대신 외부에서 호출할 수 있도록 정적 메소드인 getInstance()를 선언하고
정적 필드에서 참조하고 있는 자신의 객체를 리턴

package chapter20230816.Singleton1;

public class Singleton {
	
	
	private static Singleton singleton = new Singleton();
	
	private Singleton() {}
	
	static Singleton getInstance() {
		return singleton;
	}
	
	public static void main(String[] args) {

	}
}

package chapter20230816.Singleton1;

public class SingletonTest {

	public static void main(String[] args) {
		/*
		 생성자의 접근제한자가 private에서 실행이 안됨
		 Singleton singleton1 = new Singleton(); // 컴파일에러
		 Singleton singleton2 = new Singleton(); // 컴파일에러
		 */
		Singleton singleton1 = Singleton.getInstance();
		Singleton singleton2 = Singleton.getInstance();
		
		if(singleton1 == singleton2) {
			System.out.println("같은 Singleton 객체입니다.");
		}
		else {
			System.out.println("다른 Singleton 객체입니다.");
			// 어차피 Singleton 은 하나의 객체만 만들어 사용하기 때문에 다른 값이 나올수가 없음
		}

	}

}


'객체 중에는 전체 시스템을 통틀어서 딱 하나만 존재해야하는 것' 들이 있음
예를 들어 환경설정 클래스나 혹은 네트워크 연결 풀pool을 관리하는 클래스 이 경우에 사용할 수 있는 디자인 패턴이 싱글턴 singleton design pattern
하나의 프로그램 내에서 하나의 인스턴스만을 생성해야 하는 경우에 사용

package chapter20230816.Singleton1;

/*
 
 */

class Single {
	private static Single instance = null;
	// 클래스 외부에서는 객체의 값을 변경 못하게 private 사용
	
	private Single() {
	// 클래스 외부에서는 객체 생성을 할 수 없도록 private 사용
	}
	
	public static Single getInstance() {
		/*
		 클래스 외부에서는 getInstance() 메서드를 통해서만 객체에 접근
		 getInstance()가 여러번 호출되더라도 동일한 객체를 반환
		 */
		if(instance == null) {
			instance = new Single();
		}
		return instance;
	}
}
public class test04 {

	public static void main(String[] args) {
		Single obj1 = Single.getInstance();
		Single obj2 = Single.getInstance();
		System.out.println(obj1); // chapter20230816.Single@251a69d7
		System.out.println(obj2); // chapter20230816.Single@251a69d7

	}

}

0개의 댓글