싱글톤 패턴이란, 객체의 인스턴스가 오직 1개만 생성되는 패턴을 의미한다. 그리고 이 생성된 객체를 프로그램 어디서나 접근하여 사용할 수 있는 패턴이다.
여러개의 인스턴스를 생성하지 않고 위험한 전역변수를 사용하지 않고도 전역적인 접근이 가능한 객체를 생성할 수 있다.
싱글톤 패턴을 사용하는 이유
1. 자원의 낭비를 막는다.
2. 전역 변수의 오용을 막는다. 전역변수는 어디서든 접근할 수 있다.
3. 동기화 문제를 해결한다.
단점
1. 커플링이 높아져 객체지향을 해칠수있다.
2. 테스트하기 어렵다.
싱글톤 패턴의 3가지 스텝
1. 생성자를 private로 선언
2. 클래스 내부에서 유일한 인스턴스 생성 private static
3. 유일한 인스턴스에 접근할 수 있는 메서드 제공
그렇다면, 전역변수와 싱글톤 패턴의 차이는 무엇일까?
클래스 내부에서만 유일한 인스턴스에 접근할 수 있으므로 다른 클래스와 결합도를 낮출 수 있다.
전역변수는 클래스 외부에서도 직접접근이 가능하다.
public class Singleton {
private static Singleton instance;
private String str = "Hello World";
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
public void showMessage() {
System.out.println(this.str);
}
public void setMessage() {this.str = "Bye World";}
}
public class TestSingle {
Singleton singleton;
TestSingle() {
Singleton singleton = Singleton.getInstance();
this.singleton = singleton;
}
void testSet() {
this.singleton.setMessage();
}
void print() {
singleton.showMessage();
}
}
public class SoftwareProject {
public static void main(String[] args) {
Singleton singleton = Singleton.getInstance(); // 싱글톤 객체 선언
singleton.showMessage(); // 메인에서 선언한 싱글톤 객체의 print
TestSingle testSingle = new TestSingle();
testSingle.testSet();
singleton.showMessage(); // 메인의 싱글톤 객체를 건드리지 않았는데 결과가 바뀜
}
}
위 코드를 살펴보자, 싱글톤 클래스에는 싱글톤 규칙에 맞춰 생성자를 private , 클래스 내부에서 유일한 인스턴스를 생성하고 메서드를 제공한다. 여기서는 간단하게 메세지 출력과 메세지를 바꾸는 것 만 있다.
이후 두번째 코드를보자 , 메인에서 먼저 싱글톤 객체를 선언하고 메세지를 출력해봤다. 당연히 지정해준 헬로 월드가 나왔다. 그 다음, 다른 클래스인 테스트싱글에서 선언하고 테스트싱글에서 세팅을 해봤다. 싱글톤 객체는 유일한 인스턴스를 가진다. 때문에 메인의 싱글톤 객체를 건드리지 않았는데 결과가 바뀐것을 볼 수 있다.
이게 어떻게 가능한 걸까? Singleton 클래스를 다시 한 번 보자 .
먼저 private static Singletone singletone 으로 선언되어있다. static 은 공유변수가된다. 그러므로 유일한 객체가된다.
생성자를 private로 설정한다. 즉 외부에서의 new를 차단한다.
그러므로 어느곳에서 한 번 선언하면 항상 같은 객체가 공유된다. 그렇다고 전역변수처럼 아무나 접근할 수 있는 것도 아니기 때문에 싱글톤객체는 잘 만 사용하면 굉장히 유용하게 사용할 수 있다.
'CS > OOP' 카테고리의 다른 글
객체지향 프로그래밍 - 상속 (java) (0) | 2023.04.19 |
---|---|
객체지향 프로그래밍 - Object, Class (0) | 2023.04.11 |
객체지향 프로그래밍 (0) | 2023.04.04 |
C/C++ 포인터와 참조 : 화살표 -> 과 점 . 의 차이 (0) | 2022.10.20 |
C++ : In-line function 이란 무엇인가 (0) | 2022.10.18 |