※출처
https://fastcampus.co.kr/dev_online_javaend
https://tecoble.techcourse.co.kr/post/2020-11-07-singleton/
https://elfinlas.github.io/2019/09/23/java-singleton/
- 프로그램에서 객체의 인스턴스가 단 한 개만 생성되어야 하는 경우 사용하는 디자인 패턴
static변수, 메서드를 활용하여 구현할 수 있음- 생성자의 호출이 반복적으로 이뤄져도 실제로 생성되는 객체는 최초 생성된 객체를 반환해 주는 것
사용 이유
- 한 번의 객체 생성으로 재 사용이 가능하기 때문에 메모리 낭비를 방지할 수 있다.
- 다른 클래스 간에 데이터 공유가 쉽다.
- 도메인 관점에서 인스턴스가 한 개만 존재하는 것을 보증하고 싶은 경우 사용한다.
문제점
- 객체의 역할이 복잡한 경우 싱글톤 객체를 사용하는 다른 객체 간의 결함도가 높아져서 객체 지향 설계 원칙에 어긋난다.
- 패턴을 구현하는 코드 자체가 많이 필요하다.
- 정적 팩토리 메서드에서 객체 생성을 확인하고 생성자를 호출하는 경우 멀티 스레딩 환경에서 발생할 수 있는 동시성 문제 해결을 위해
syncronized키워드를 사용해야 함.
- 정적 팩토리 메서드에서 객체 생성을 확인하고 생성자를 호출하는 경우 멀티 스레딩 환경에서 발생할 수 있는 동시성 문제 해결을 위해
- 테스트 하기 어렵다.
- 애플리케이션 전역에서 상태를 공유하기 때문에 격리된 환경에서 수행되려면 매번 인스턴스의 상태를 초기화시켜주어야 한다.
- 의존 관계상 클라이언트가 구체 클래스에 의존하게 된다.
new키워드를 직접 사용하여 클래스 안에서 객체를 생성하고 있으므로, 이는SOLID원칙 중DIP를 위반하게 되고OCP원칙 또한 위반할 가능성이 높다.
싱글톤 패턴 예제 1
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
public class Company {
private static Company instance = new Company();
private Company() {
}
public static Company getInstance() {
if (instance == null) {
instance = new Company();
}
return instance;
}
}
-----------------------------------------------------------
public class CompanyTest {
public static void main(String[] args) {
Company company1 = Company.getInstance();
Company company2 = Company.getInstance();
System.out.println(company1);
System.out.println(company2);
// Calendar cal = Calendar.getInstance();
}
}
|
cs |
- 5 : 생성자는
private로 선언 - 3 : 클래스 내부에 유일한
private인스턴스 생성 - 8 : 외부에서 유일한 인스턴스를 참조할 수 있는
public메서드 제공
'Java > 객체지향 프로그래밍' 카테고리의 다른 글
| JAVA / 객체 배열을 구현한 클래스 ArrayList (0) | 2022.06.20 |
|---|---|
| JAVA / 객체 배열 사용하기 (0) | 2022.06.20 |
| JAVA / static 메서드 (0) | 2022.06.17 |
| JAVA / static 변수 (0) | 2022.06.16 |
| JAVA / 객체 간의 협력(Collaboration) (0) | 2022.06.15 |