싱글톤 패턴
[비용 절감 효과를 코드로?]
- 기업 입장에서는 비용 절감이 필요하다 이때 비용 절감의 예로 메모리를 낭비하지 않는 것이 가장 대표적인 예시이다.
- 불필요한 객체를 강제적으로 개수 제한
- 매일 실행되는 서버는 실행 속도 고려 필수
- 설계가 중요하고, 개발 코드 실시간 효율적인 개발 가능한 튜닝이 필요하다.
1. 객체의 수를 강제로 조정하는 구조
- 정형화된 구조 = 패턴
- Singleton design pattern
- 우리가 현재 사용하고 있는 여러 프레임워크들 내부에서는 이미 이 구조를 적용해서 객체를 한정적으로 생성
해 공유하는 로직이 다수 존재한다.
[자바의 싱글톤 패턴]
1. static
- 싱글톤 패턴의 경우엔 자바를 만든 사람들이 이를 기술하고 있을 정도로 중요한 개념이다.
- 이를 이해하기 위해서는 자바에서의
static
키워드를 잘 알아두는 것이 중요하다.
1-1. 변수
- 객체 생성 없이 호출이 가능하다.
Class.변수
구조로 호출한다.
- 생성되는 모든 객체가 공유하는 데이터(변수)이다.
1-2. 메서드
1-3 static{ } (static block)
- 모든 사용자가 공유하는 자원을 한번만 실행(자원 초기화)시에 주로 사용한다.
- java 소스를 컴파일 후 생성되는
*.class
실행 코드인 바이트코드가 생성될 때, 메모리에 할당된다.
2. 싱글톤 패턴의 강제 사항
2-1. 생성자 호출은 외부 클래스에서금지
- 생성사 호출을 외부 클래스에서 절대 금지하고 있는 것이 싱글톤 패턴의 특징이다.
- 객체 생성은 해당 자신의 클래스(= 싱글톤 패턴을 적용한 클래스)에서 하나만 생성해서 해당 객체(싱글톤 패턴을 적용한 클래스)가 필요한 곳에 이미 생성된 객체를 공유하는 방법으로 객체 참조를 진행한다.
2-2. 생성자 호출을 막는 방법
- 생성자의 접근제한자를 private로 범위 제한하여 외부에서 생성자 호출을 막는다.
- 외부에서 해당 클래스를 생성하고 초기화할 때 사용하는 생성자에 접근할 수 없게 된다.
2-3. 싱글톤 패턴을 적용한 클래스의 객체 참조 하는 방법
- public으로 해당 객체를 돌려주는 메서드를 만든다.
- 생성자는 private, 객체를 돌려주는 메서드는 public으로 객체 생성은 막고 이미 생성된 객체를 공유하는 방법으로 진행한다.
[코드로 보는 싱글턴 적용 방법]
1. 코드
public class BizLogin {
private final static BizLogin instance = new BizLogin();
private BizLogin() {
}
public static BizLogin getInstance() {
return instance;
}
}
2. 코드 분석
static
변수로 만들어 사용하는 이유?
- static 키워드가 붙지 않으면 실제 메모리 생성 시점이 객체 생성 시점이 된다. 그러나 우리는 생성자를 private로 막아두었기 때문에 객체 생성전에 이미 생성되는 getInstance()에서 문제가 생기게 된다.
- 이를 해결하기 위해서는 해당 변수 역시 static으로 만들어서 객체 호출 전에도 생성되게 해야 한다.
- private 생성자 메서드
- 외부에서 생성자 호출을 하지 못하게 해서 객체 생성, 초기화를 막는 부분이다.
static
메서드로
- 해당 메서드는 싱글톤 패턴을 적용한 객체를 호출할 때 사용하는 메서드로 public으로 접근제한자를 열어두어야 한다.
- 이때 static 키워드로 해당 메서드를 만든 이유는 생성자를 막아두었기 때문에 객체 생성이 불가해 해당 메서드를 사용하기 위해서는 객체 생성 없이 사용 가능한 static 메서드로 만들어 외부 클래스에서 해당 객체를 참조할 수 있게 하기 위함이다.
3. 정리
- 외부에서 객체 생성을 막아두고 이미 만들어둔 객체를 외부에서 공유해서 사용할 수 있게 한다.
- 이는 메모리 효율 측면에서의 비용 절감을 위한 방법이다.
- 외부 클래스에서 객체 생성을 막아두기 위해서는 생성자의 접근제한자를 private로 막아두어야 한다.
- 그렇다면 해당 객체 생성은 싱글톤 패턴을 적용한 클래스 내부에서 일어나야 한다.
BizLogin instance = new BizLogin();
- 이때