2022-03-18 @이영훈
싱글톤 패턴
오직 한 개의 클래스 인스턴스를 갖도록 보장하고, 이에 대한 전역적인 접근점을 제공합니다.
인스턴스를 하나만 만들기 때문에 메모리를 아낄 수 있습니다.
인스턴스를 하나만 만들어서 사용하기 때문에 데이터 공유가 쉽습니다. 하지만 인스턴스 변수를 다른 곳에서 수정이 가능하기 때문에 불변(immutable)하게 만들거나 잘 관리해서 사용하여야 하는 특징도 있습니다.
싱글톤 이해하기
기존에 만들어진 인스턴스가 있으면 기존의 인스턴스를 반환하고, 없으면 인스턴스를 만들고 private 변수에 저장한 뒤에 반환해 하나의 인스턴스가 보장되게 합니다.
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
Java
복사
싱글톤 패턴을 이해하기 위한 직관적인 방식의 코드입니다. 이 방법은 멀티스레드 환경에서 안전하지 않습니다. 실무에서 사용하시려면 google “singleton pattern multithreading”에서 찾아보시면 됩니다.
싱글톤 예시
싱글톤 인스턴스를 만들 때 변수를 공유할 수 있기 때문에 주의해서 사용해야 합니다.
아래와 같은 Singleton 클래스가 있습니다
number라는 공유 변수를 내부에 두었고, getter와 setter를 두었습니다
public class Singleton {
private static Singleton instance;
// 공유 변수
private int number;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
// 공유 변수의 getter, setter
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
}
Java
복사
하나의 인스턴스를 동시에 다른 곳에서 접근해서 사용할 때 문제가 생기는 경우입니다.
number를 10으로 설정하고 호출했는데 다른 곳에서 20으로 수정했기 때문에 기대값 10이 출력되지 않습니다.
해당 문제를 안 만들기 위해서 immutable하게 만들거나, 공유변수를 잘 관리해서 프로그래밍해야합니다.
public class SingletonPatternApplication {
public static void main(String[] args) {
Singleton instance1 = Singleton.getInstance();
Singleton instance2 = Singleton.getInstance();
System.out.println(instance1 == instance2);
// 인스턴스 변수를 공유하기 때문에 조심해서 불변하게 사용하거나 조심해서 사용해야 한다
// 사용시 주의: instance1에서 사용 중인데 그 사이에 instance2가 동시에 사용하면 예상치 못한 결과가 발생할 수 있다.
instance1.setNumber(10);
// instance2가 동시에 접근해서 사용
instance2.setNumber(20);
// instance1은 숫자 10을 기대
if (instance1.getNumber() == 10) {
System.out.println("👍 기대값 10과 같음");
} else {
System.out.println("👊 기대값 10과 다름");
}
// 👊️ 기대값 10과 다름
}
}
Java
복사