싱글톤
정의
- 특정 클래스에 대해 단 1개의 인스턴스(객체)만 생성하여, 이를 공유하여 사용하기 위한 패턴
싱글톤을 사용하는 경우
- 프로그램에서 1개의 클래스 인스턴스(객체)만 존재해야 하는 경우
- 필요할 때마다 객체를 생성하는 것이 아니고
- 1개의 인스턴스(객체)만 메모리에 생성하여, 전역에서 이를 공유하여 사용할 수 있게 함
싱글톤 클래스를 만드는 방법
싱글톤 패턴을 적용할 경우, 2개 이상의 인스턴스가 존재할 수 없기 때문에 제약 조건이 있음
1. 인스턴스를 생성할 클래스의 생성자와 멤버변수(필드)는 private로 선언
- 싱글톤으로 사용될 클래스의 생성자는 private(접근 제한자)로 선언이 돼 있어서
- 외부 클래스에서 객체를 생성할 수 없음
- 즉, 외부 클래스에서 new 연산자를 통한 인스턴스 생성이 불가함
2. 생성된 인스턴스(객체)를 반환할 수 있는 '정적 메서드'를 public으로 선언
정적 메서드(static method)인 이유
외부 클래스에서 new연산자를 사용하지 않고서(인스턴스를 생성하지 않고서도)
클래스 내의 메서드에 접근하기 위해서 static으로 설정
- 외부 클래스에서 해당 클래스의 인스턴스(객체)를 얻으려면, getInstance() 메서드를 통해야 함
- getInstance() 메서드 내부에서
- instance == null 이면 인스턴스를 생성하고
- instance != null이면 인스턴스를 반환함
- 즉, getInstance() 메서드를 호출 시에
- 생성된 인스턴스(객체)가 없으면, 인스턴스를 새로 생성하고
- 인스턴스가 이미 존재하면, 인스턴스의 위치값(주소값)를 리턴 해줌
3. 유일한 객체를 참조할 수 있는 정적 참조 변수가 필요
- 인스턴스의 위치값(주소값)을 담고 있는 참조변수가 필요
- getInstance() 메서드의 결과로 참조변수를 반환함
[ 참조변수를 통해서 유일한 객체를 참조 ]
public class Singleton { // 싱글톤 객체를 담을 수 있는 변수(정적 참조 변수) private static Singleton object; // private 생성자 private Singleton() { } // getInstance() public static Singleton getInstance() { if (object == null) { object = new Singleton(); } return object; // 객체의 위치값(주소값)을 담고 있는 참조변수 반환 } }
- Singleton 클래스의 생성자 Singleton() 는 private하기 때문에 다른 클래스에서 접근할 수 없어서, new연산자를 통해 해당 클래스의 인스턴스를 생성할 수 없음
- 그런데 싱글톤 패턴의 클래스는 단 하나의 인스턴스만 허용하고, 따라서 이것을 사용하기 위해서는, 해당 클래스의 참조변수(object)를 통해서 유일한 객체를 참조함
예제
public class Earth {
// 싱글톤 객체를 담을 수 있는 변수(정적 참조 변수)
private static Earth object;
// private 생성자
private Earth() {
}
// getInstance()
public static Earth getInstance() {
if (object == null) {
Earth = new Earth();
}
return object; // 객체의 위치값(주소값)을 담고 있는 참조변수 반환
}
}
- object는 단일한 객체를 저장(객체의 주소값을 저장)하기 위한 정적 참조 변수
- getInstance()를 최초로 실행될 때에만 객체가 초기화 됨
장점
1. 유일한 인스턴스
- 싱글톤 패턴이 적용된 클래스의 인스턴스는 애플리케이션 전역에서 단 하나만 존재하도록 보장
- 객체의 일관된 상태를 유지하고, 전역에서 접근이 가능하도록 함
2. 메모리 절약
- 인스턴스가 단 하나뿐이므로 메모리가 절약됨
- 생성자를 여러 번 호출하더라도 새로운 인스턴스를 생성하지 않기 때문
3. 지연 초기화
- 인스턴스가 실제로 사용되는 시점에 생성하기 때문에, 비용을 줄일 수 있음
단점
1. 결합도 증가
- 전역에서 접근이 가능하기 때문에, 해당 인스턴스에 의존하는 경우에 결합도가 증가함
2. 테스트 복잡성
- 싱글톤 클래스를 의존하는 외부 클래스는 결합도 증가로 인해 테스트가 어려울 수 있음
3. 전역에서 접근 가능
- 애플리케이션 내 어디서든 접근이 가능한 경우, 무분별한 사용을 막기 어려움
- 이로 인해 변경에 대한 복잡성이 증가할 수 있음
출처
https://ittrue.tistory.com/563 [IT is True:티스토리]
'JAVA' 카테고리의 다른 글
[JAVA] static 멤버(static 필드, static 메서드) (0) | 2024.04.22 |
---|---|
[JAVA] final 지정자(클래스, 메서드, 변수에 지정하기) (0) | 2024.04.22 |
[JAVA] 메서드 오버라이딩, 오버로딩과 오버라이딩 (0) | 2024.04.21 |
[JAVA] super와 super(), this와 this() (0) | 2024.04.21 |
[JAVA] 다형성, 참조변수의 형변환(업캐스팅, 다운캐스팅) (1) | 2024.04.19 |