싱글톤 패턴
- 어떤 클래스가 최초 한번만 메모리를 할당하고(static) 그 메모리에 객체를 만들어 사용햐는 디자인 패턴
- 생성자의 호출이 반복적으로 이뤄져도 실제로 생성되는 객체는 최초 생성된 객체를 반환
class C05Company {
int x;
int y;
int z;
//싱글톤 패턴 코드 시작
private static C05Company instance = new C05Company();
private C05Company() {}
public static C05Company getInstance() {
if(instance==null)
instance=new C05Company();
return instance;
}
//싱글톤 패턴 끝
instance라는 전역변수를 선언하는데, static을 줌으로 인스턴스화 하지 않고 사용 할 수 있게 했다.
private라는 접근제어가 걸려 있어서 직접적인 접근은 불가능하다.
생성자 또한 private로 되어 있어 new를 통한 객체 생성도 불가능하다.
getInstance 메서드를 통해 해당 인스턴스를 얻을 수 있다.
싱글톤 패턴 사용하는 이유
한번의 객체 생성으로 재 사용이 가능하기 때문에, 메모리 낭비를 막을 수 있다.
싱글톤으로 생성된 객체는 무조건! 한번 생성으로 전역성을 띄기 때문에 다른 객체와 공유가 가능.
예제
Calculator 클래스
출력 결과
싱글톤 문제점
Multi-Thread 환경에서 안전하지 않다. 여러 쓰레드가 공유되고 있는 상황에서는
아래의 블럭에서 조건문이 동시에 두 번 돌 수 있기 때문에
하나의 인스턴스가 아닌 여러개의 인스턴스가 발생할 위험이 있다.
public static Calculrator getInstance() {
if(calculrator == null) {
calculrator = new Calculrator();
}
return calculrator;
}
인스턴스가 상태를 유지 해야 하는 상황에서 싱글톤은 더 고려 해야 할 점이 많다.
public class Calculrator {
private static Calculrator calculrator = null;
private int count = 0;
private Calculrator(){}
public static Calculrator getInstance() {
if(calculrator == null) {
calculrator = new calculrator();
}
return calculrator;
}
public void calculrator(String input) {
count++;
System.out.println(input + "count : "+ count);
}
}
count 값은 서로 다른 쓰레드에서 공유하고 있고, 서로 다른 프로세스에서 처리하고 있어서
값이 뒤죽박죽일 수도 있다.
적절한 형태로 싱글톤을 활용하면 좋은 경우도 있지만, 남용 하게 될 가능성이 많다.
'Backend > JAVA' 카테고리의 다른 글
[JAVA] chatAt(int i) - '0' (0) | 2022.04.23 |
---|---|
[JAVA] 상속(Inheritance) (0) | 2022.04.22 |
[JAVA] 간단한 도서 관리 프로그램 (0) | 2022.04.20 |
[JAVA] 간단한 커피 자판기 프로그램 (0) | 2022.04.17 |
[JAVA] 간단한 은행 입 출금 프로그램 (0) | 2022.04.17 |