이번 시간에는 디자인 패턴 중 하나인 싱글톤 패턴에 대해 정리한다.
1. 싱글톤 패턴이란
우선 영어단어의 뜻은 다음과 같다.

단어의 뜻을 자바와 연관지어 풀어본다면 "단독으로만 존재할 수 있는 객체" 를 말한다.
즉, 같은 클래스의 인스턴스를 2개 이상 생성할 수 없도록 하는 것이다.
2. 싱글톤 패턴 구현 하기
코드로 보자면 디자인 패턴 중 아마 가장 심플하지 않을 까 싶다.
public class SingletonTest {
private static SingletonTest instance;
private SingletonTest() {
System.out.println("싱글톤 클래스 생성자");
}
public static SingletonTest getInstance() {
if(instance == null) {
instance = new SingletonTest();
}
return instance;
}
}
위와 같이 코드를 작성하면 SingletonTest 클래스의 인스턴스는 단 1개만 생성될 수 있다.
싱글톤 패턴을 만들기 위한 방법은 다음과 같다.
1) SingletonTest 인스턴스에 접근하기 위한 SingletonTest 클래스형 참조변수인(instance)를 생성한다.
2) 생성자를 private 로 선언하여 외부에서 생성자를 호출할 수 없도록 막는다. (즉, new 를 통해 생성 불가)
3) 싱글톤 클래스에 접근(사용)하기 위한 getter 메소드를 생성한다.
4) getter 메소드를 static 으로 선언하여 참조변수(instance)에 접근할 수 있도록 한다.
(이 때 메소드가 static 이므로 참조변수 또한 static 으로 선언되어야 한다.)
5) 참조변수가 null 인 경우에만 new 가 가능하다. (최초 1회만 new 가능하다.)
6) 참조변수가 null 이 아니라면 참조변수를 리턴한다.
3. 싱글톤 인스턴스 사용하기.
싱글톤으로 생성한 인스턴스를 사용하는 방법은 static 으로 선언된 클래스 변수/메소드 와 사용 방법은 유사하다.
package com;
public class SingletonTest {
private static SingletonTest instance;
private int a = 0;
private SingletonTest() {
System.out.println("싱글톤 클래스 생성자");
}
public static SingletonTest getInstance() {
if(instance == null) {
instance = new SingletonTest();
}
return instance;
}
public void printNum() {
System.out.println(instance.a);
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
}
위의 코드에서 보면 멤버변수 a 에 값을 읽고 쓰는 getter / setter 메소드와 출력하는 printNum 메소드가 있다.
이제 외부에서 메소드에 접근하여 보자.
package com;
public class MainClass {
public static void main(String[] args) {
SingletonTest.getInstance().setA(10);
System.out.println(SingletonTest.getInstance().getA());
SingletonTest.getInstance().printNum();
}
}

우선 static으로 선언된 클래스 메소드를 사용하는 방법처럼 클래스의 이름으로 접근을 시작한다.
그리고 getInstance() 메소드를 통해 싱글톤클래스의 멤버에 접근하는 것을 볼 수 있다.
4. 싱글톤을 사용하는 이유
단 하나의 인스턴스만 만들 수 있는 클래스가 무슨 의미가 있나 싶지만, 실제로는 매우 유용하게 사용이 가능하다.
예를 들어 어떤 데이터들을 저장하는 자료구조(여기선 ArrayList 라고 생각하자.)를 가진 클래스가 있다고 한다면,
해당 클래스를 new 를 통해 여러번 생성한다면 ArrayList 또한 여러 개가 생성된다.
이 때, 새로운 데이터가 추가되어 ArrayList 에 넣는 다면 어느 인스턴스의 ArrayList에 넣어야 할까?
반대로 출력을 위해 ArrayList에서 값을 꺼내온다면 어느 ArrayList에서 값을 가져와야 할까?
이러한 문제는 여러개의 ArrayList가 생기지 않는다면 근본적으로 발생하지 않는 문제이다. 즉, 싱글톤으로 생성된
인스턴스라면 충분히 해결할 수 있는 문제이다.
개인적인 경험담으로 서버를 구현하면서 여러 명의 접속자(세션)를 관리하기 위한 매니져(세션 매니져) 클래스에서 주로 발생했다. 접속자는 데이터처럼 어느 곳에 접속자의 정보(소켓 정보 등)를 저장해야하는데 저장 및 관리를
담당해주는 매니져가 여러개가 존재한다면 어느 매니져에서 접속자를 관리해야할지 문제가 발생하였다.
그 후 싱글톤 패턴을 알게되어 매니져를 단일로 만들 수 있는 싱글톤으로 구현하여 쉽게 문제를 해결할 수 있었다.
하지만 싱글톤 패턴을 너무 남용한다면 일명 '스파게티 코드' 가 되어 버린다.
스파게티 코드란 실제 스파게티 면처럼 코드가 서로 얽혀있어 풀어낼 수 없는 모습을 말한다.
즉, 편리하더라도 남용하는 것은 절대 올바르지 않기에 정말 필요한 때인지 고민해보고 사용해야 한다.
요약 1. 싱글톤이란 클래스의 인스턴스를 단 한 개만 생성할 수 있게 구현한 패턴.
요약 2. 데이터를 저장하기 위해 구현된 클래스 등에서 유용하게 사용이 가능.
요약 3. 남용하면 큰일 남.
'JAVA' 카테고리의 다른 글
| String 클래스 문자열 메소드 (0) | 2022.08.28 |
|---|---|
| JAVA - ORACLE 연동 (0) | 2022.08.28 |
| 인터페이스 (0) | 2022.08.28 |
| 추상화 (0) | 2022.08.28 |
| 다형성과 instanceof (0) | 2022.08.28 |