class Connection {
    private static Connection _inst;
    private int count;
    
    private Connection(){
    	count = 0;
    }
    
    public static Connection getInstance(){
    	if(_inst == null){
        	_inst = new Connection();
        }
        return _inst;
    }
    public void count(){
    	count++;
    }
    public int getCount(){
    	return count;
    }
}

public class BB {
	public static void main(String[] args){
		Connection conn1 = Connection.getInstance();
		conn1.count();
		Connection conn2 = Connection.getInstance();
		conn2.count();
		Connection conn3 = Connection.getInstance();
 		conn3.count();
		conn1.count();
		System.out.print(conn1.getCount());
    }
}

 

 

이 코드는 Singleton pattern을 사용하여 프로그램 전역에서 단 하나의 Connection 객체만 생성되도록 구현한 것

앱 내에서 특정 클래스의 인스턴스가 오직 하나만 존재하도록 보장하고, 어디서든 접근할 수 있도록 하기 위한 것  

싱글턴 패턴은 프로그램에서 모든 클라이언트가 사용할 수 있는 단일 인스턴스가 있어야 할 때 사용할 것 

(단일 책임 원칙 위반, 멀티스레드 환경에서 동기화 처리, 메서드 이름 선택으로 인한 혼동 등 주의점들 있음)

 

1. 싱글턴 구현 

- 클래스 내의 private static Connection _inst; 선언에서 _inst 변수는 클래스 내에서 단 하나의 인스턴스만 저장함
   : 멤버 변수 중 static정적 변수 _inst. 이 변수는 클래스가 메모리에 로드될 때 한 번만 할당(생성)되며, 모든 호출자가 공유하는 유일한 인스턴스를 저장함(한 번 생성된 _inst 변수에 저장된 인스턴스가 프로그램 내 모든 곳에서 동일하게 사용됨.). Java에서 static 변수는 클래스 로딩 시점에 메모리에 할당되고, 클래스 전체에서 그 이름으로 단 하나만 존재함. 

   : 멤버 변수 중 인스턴스 변수 count 선언. 변화값을 담는 용도. 

- private Connection() 생성자를 통해 외부에서 직접 인스턴스 생성을 막음 

    : 비공개 생성자. 생성자를 private로 선언하여 외부에서 직접 인스턴스를 생성하는 것을 막음. 이는 외부 코드가 new Connection()을 호출하지 못하게 하여 오직 클래스 내부의 메서드에서면 인스턴스를 생성할 수 있도록 함 

- public static Connection getInstance() 메서드는 _inst가 null일 때만 새로운 Connection 객체를 생성하고, 그 이후에는 이미 생성된 객체를 반환하여 항상 동일한 객체를 사용하게 됨. 즉 _inst를 통해 클래스 전체에서 유일한 Connection 인스턴스만 존재/공유하게 하며 객체 생성이 여러번 이루어지는 것을 방지함 

    : 정적 팩토리 메서드. 이 메서드는 최초 호출 시 인스턴스가 없으면 새로 생성하고 이후 호출부터는 이미 생성된 인스턴스를 반환함. 즉 인스턴스 생성은 지연 초기화(lazy initialization) 방식으로 이루어짐 

 

2. 메서드들 

- public void count()는 인스턴스 변수 count 값을 1 증가 시킴

- public int getCount()는 현재 count의 값을 반환함 

 

3. main 메서드의 실행 흐름 

- Connection conn1 = Connection.getInstance();

    : 첫 호출이니까 null이라서 새로운 Connection 객체 생성함. count는 0이 됨 

- conn1.count();

    : count가 ++ 증가하여 1이 됨 

- Connection conn2 = Connection.getInstance(); 

    : 이미 생성된 동일한 객체를 반환받음 

- conn2.count(); 

    : count가 1에서 1 증가하여 2가 됨 

- Connection conn3 = Connection.getInstance();

    : 다시 동일한 객체를 반환받음 

- conn3.count(); 

    : count가 또 증가하여 3이 됨 

- conn1.count(); 

    : 동일 객체의 count가 1 증가하여 4가 됨 

- System.out.print(conn1.getCount());

    : 최종적으로 count의 값인 4를 출력함  

 

 

 

https://refactoring.guru/ko/design-patterns/singleton

 

싱글턴 패턴

/ 디자인 패턴들 / 생성 패턴 싱글턴 패턴 다음 이름으로도 불립니다: Singleton 의도 싱글턴은 클래스에 인스턴스가 하나만 있도록 하면서 이 인스턴스에 대한 전역 접근​(액세스) 지점을 제공하

refactoring.guru

 

+ Recent posts