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