
어떤 클래스가 최대 한 번의 인스턴스를 가지고, 그 인스턴스에 대한 전역적인 접근을 제공하는 디자인 패턴으로, 이 패턴을 사용하면 어플리케이션 내에서 해당 클래스의 인스턴스가 오직 하나 뿐이고, 그 인스턴스에 대한 접근은 어디서든지 가능하다.
인스턴스는 객체 지향 프로그래밍에서 클래스의 구조를 바탕으로 실제로 메모리에 할당된 개별적인 실체를 나타낸다. 여러 클래스를 정의하고 있다고 할때, 각 클래스로부터 생성된 실제 데이터를 갖는 것이 인스턴스이다. 예로 자동차 클래스가 있다면 실제 생성되는 자동차는 산타페, 봉고차가 실제 인스턴스가 된다.
// 자동차 클래스 정의
public class Car {
String model;
String carNumber;
}
// Car 클래스를 기반으로 한 인스턴스 생성
Car myCar = new Car();
myCar.model = "소나타";
myCar.carNumber = "23가 1234";
public class Logger {
private static Logger instance;
private StringBuilder logBuffer;
// private 생성자로 외부에서 인스턴스 생성을 막음
private Logger() {
logBuffer = new StringBuilder();
}
// 싱글톤 인스턴스 얻기
public static Logger getInstance() {
if (instance == null) {
instance = new Logger();
}
return instance;
}
// 로그 추가 메서드
public void log(String message) {
logBuffer.append(message).append("\n");
}
// 현재 로그 출력 메서드
public void printLog() {
System.out.println(logBuffer.toString());
}
}
public class Example {
public static void main(String[] args) {
// Logger 싱글톤 인스턴스 얻기
Logger logger = Logger.getInstance();
// 로그 추가
logger.log("프로그램 시작");
// 다른 부분에서도 같은 로거 인스턴스를 이용하여 로그 추가
someOtherMethod();
// 현재까지의 로그 출력
logger.printLog();
}
public static void someOtherMethod() {
// 다른 메서드에서도 같은 로거 인스턴스를 이용하여 로그 추가
Logger logger = Logger.getInstance();
logger.log("다른 메서드에서 로그 추가");
}
}