강의 수강 중 작성한 노트에서 내용을 발췌, 이응수 강사님 강의 의 노트와 이미지를 참조하고 있습니다.
싱글턴 패턴
📌 싱글턴 패턴
- 애플리케이션이 실행되는 동안 객체의 인스턴스가 오직 1개만 생성되고 사용되도록 하는 패턴
- 이러한 패턴으로 만들어진 객체를 싱글턴 객체라고 한다.
📌 싱글턴 객체
- 프로그램이 실행되는 동안 클래스당 객체가 하나만 생성되는 객체다.
- 다른 객체에서 사용하는 기능이 정의되어 있는 클래스들이 싱글턴 객체로 만들어야할 대표적인 예다.
xxxDao.java
, xxxService.java
, xxxController.java
등
- 싱글턴 객체의 사용 이유
- 값을 담는 용도의 객체(VO객체, Form객체, DTO객체)는 정보의 개수만큼 객체가 필요하다. 그러나, 기능 수행을 목적으로 하는 객체는 그 객체를 여러 개 생성할 필요가 없다.
- 프로그램이 실행되는 동안 클래스당 객체가 하나만 생성되기 때문에 메모리 효율측면에서 좋다.
📌 싱글턴 객체의 정의
- 객체를 자유롭게 생성하지 못하도록 생성자를 은닉화시킨다.
- 생성자 메소드의 접근제한자를 private으로 하여 외부 클래스에서 같은 객체를 생성하지 못하게 한다.
public class UserDao {
private UserDao() {}
}
- 클래스가 로딩될 때 객체를 만들어서 정적변수에 저장한다.
- 정적변수를 사용하면 클래스가 로딩될 때 객체가 생성된다.
- 정적변수는 클래스가 로딩될 때 오직 한번 초기화되고, 프로그램이 종료될 때까지 유지되기 때문에 정적변수를 사용한다.
- private 접근제한자를 사용한 이유는 외부에서 userDao변수에 접근하지 못하게 하기 위해서다.
public class UserDao {
private UserDao() {}
private static UserDao userDao = new UserDao();
}
- 정적변수에 저장된 객체를 제공하는 정적메소드 정의
- 정적메소드를 사용하면, 객체 생성없이도 외부에서
클래스이름.getInstance()
와 같이 작성하여 실행할 수 있다.
- public 접근제한자를 사용하는 이유는 이 객체가 필요한 곳에서는 어느 곳에서나
클래스이름.getInstance()
를 실행해서 객체를 제공받을 수 있도록 하기 위해서다.
public class UserDao {
private UserDao() {}
private static UserDao userDao = new UserDao();
public static UserDao getInstance() {
return userDao;
}
}