singleton 패턴이란?
인스턴스 생성 패턴 중 하나로 인스턴스로 한 번 생성하고 인스턴스의 내용을 여러 메서드에서 공유하여 사용할 수 있는 패턴이다.
public class Configuration {
private static Configuration configuration;
private Configuration() {
}
public static Configuration getInstance() {
if (null == configuration) {
configuration = new Configuration();
}
return configuration;
}
}
//출처 : codelatte
singleton 패턴은 new 키워드로 인스턴스를 생성하지 못하게 함과 동시에 인스턴스를 생성할 수 있는 특정 정적 메서드를 통해서만 인스턴스를 생성하도록 한다.
쉽게 생각하면 new 키워드 사용해서 남발로 만드는게 아니라 정적 메서드로 만들어둔 Configuration getInstance() 통해서만 만들 수 있다고 생각하면 된다.
조건문을 추가하여 configuration이 null 일 때만 생성자를 통하여 인스턴스를 생성해 준다.
얻는 이점
Configuration configuration1 = Configuration.getInstance();
System.out.println(configuration1);
// 동일한 해시코드 Configuration@610455d6
Configuration configuration2 = Configuration.getInstance();
System.out.println(configuration2);
// 동일한 해시코드 Configuration@610455d6
메모리를 절약하기 위해서다.
여러 번의 configuration.getInstance() 호출해도 동일한 인스턴스의 참조값을 반환하기 때문에 메모리를 절약할 수 있는 것이다.
궁금증
그러면 싱글톤 패턴이 아니라 정적 변수랑 정적메서드랑 사용해서 만들면 같은 거 아냐? 라고생각이 들었는데 강의 밑 부분에 나의 궁금증에 대해서 얘기를 해주셨다.
차이점 : 인스턴스 지연 생성 (Lazy Load)
자바 메모리 구조에 대해 얘기하자면 메모리 구조안에는 Method Area라는 구역이 존재하고 정적변수와 정적 메서드는 프로그램 실행 시 Method Area 구역에 적재하여 프로그램이 실행된다.
그 말은 즉 슨, 프로그램을 실행하자마자 메모리를 깎아먹고 시작한다고 생각하면 된다.
그러나 singleton 패턴은 호출하지 않는다면 최소 인스턴스 참조 값을 저장하는 정적 변수와 인스턴스 생성을 위한 configuration.getInstance() 정적 메서드만 메모리에 할당된다.
그래서 내가 필요할 때만 가져오면 되기 때문에 지연생성(Lazy Load)이라는 차이점이 있다고 생각하면 된다.
'JAVA' 카테고리의 다른 글
| Optional 더 잘 사용해보기 (0) | 2023.04.10 |
|---|---|
| Java8 : Stream 사용법 (0) | 2023.03.31 |
| Garbeage Collection 이란? (0) | 2023.03.31 |
| JAVA 동작원리 그리고 JVM (0) | 2023.03.30 |
| Comparable 과 Comparator 차이점 (0) | 2023.03.30 |