개발
home
🕴️

[디자인 패턴] 싱글톤 패턴

Created
2022/03/18
Tags
Design Pattern
Singleton Pattern
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
복사

Ref.