public class Singleton {
//정적필드
private static Singleton instance= new Singleton );
//생성자
private Singleton {
// 생성자는 외부에서 호출하지 못하도록 private으로 지정
}
//정적메소드
static Singleton getInstance( ) {
return instance;
}
}
클래스 외부에서 new연산자를 통해 생성자 호출하는 것이 불가하도록 private접근 제한자 사용한다.
→ 전체에서 하나만 만들어야되기 때문에 새로운 객체를 만들지 못하도록 해야 함
자신의 타입인 정적 필드 선언 후 자신의 객체 생성해 초기화
필드 영역에: private static 클래스 singleton = new 클래스( );
생성자 영역에: private 클래스( ) { }
외부에서 호출할 수 있는 getInstance( ) 선언
메소드 영역에
static 클래스 getInstance( ) {
return.sigleton;
}
외부에서 클래스 변수1 = 클래스.getInstnace();로 호출할 수 있음
정적 필드에서 참조하는 자신의 객체 리턴
getInstance();로 호출하면 모두 new클래스(); 객체를 참조하기 때문에 새로운 getInstnace();를 만들어도 같은 객체를 참조함
현재 가장 많이 사용되고 있는 싱글톤 구현 방법이다.
public class Singleton {
private Singleton(){}
private static class SingletonHelper{
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance(){
return SingletonHelper.INSTANCE;
}
}
메모리 측면
최초 한 번의 new연산자를 통해 고정된 메모리 영역을 사용하기 때문에 추후 해당 객체의 접근할 때 메모리 낭비를 방지할 수 있다. 또한 이미 생성된 인스턴스를 활용하므로 속도측면에서도 이점이 있다.
데이터 공유
싱글톤 인스턴스가 전역으로 사용되는 인스턴스이므로 외부 클래스의 인스턴스들이 접근하여 사용할 수 있다.
그러나 여러 클래스의 인스턴스에서 싱글톤 인스턴스의 데이터를 동시에 접근하면 동시성의 문제가 발생할 수 있으므로 유의해서 사용해야 한다.