프로그래밍을 하다 보면 싱글톤의 유혹을 뿌리칠 수 없을 때가 있습니다. 싱글톤 자체의 의도는 메모리를 절약하는 좋은 이유가 될 수 있지만 이로 인해 발생하는 많은 문제도 있습니다.
따라서 이 글에서는 싱글톤의 장단점과 어떤 상황에서 안티패턴으로 작용할 수 있는지 살펴보겠습니다.
안티패턴?
디자인 문제로 인해 소프트웨어 시스템이 예상대로 작동하지 않거나 유지 관리하기 어려운 디자인 패턴입니다.
싱글톤 패턴이란?
Singleton은 객체 지향 프로그래밍(OOP)에서 사용되는 디자인 패턴 중 하나입니다. 이 패턴은 Application에서 하나의 인스턴스만 생성하고 해당 인스턴스를 전역적으로 노출합니다.
public class Singleton {
private static String instance = null;
private Singleton() {
this.instance = "Singleton";
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
싱글톤 패턴을 구현하는 가장 간단한 방법이며 가장 일반적으로 사용되는 코드이기도 합니다. 위의 코드에서 기본 생성자의 액세스 한정자는 Singleton 클래스의 고유한 인스턴스를 보장하도록 설정됩니다. 사적인캐릭터다
또한 그렇게 구현된 싱글톤 인스턴스에 액세스하기 위해 getInstance라는 정적 팩토리 메서드가 구현되었습니다.
싱글톤 패턴의 이점
그렇다면 싱글톤 패턴을 사용하면 어떤 이점이 있을까요? 싱글톤 패턴은 다음과 같은 이유로 많은 경우에 유용합니다.
접근성
싱글톤은 전역적으로 액세스할 수 있는 고유한 인스턴스를 제공하여 개체를 만들고 관리하는 데 필요한 코드의 양을 줄입니다. 개체를 만드는 데 필요한 코드는 모든 클라이언트 클래스에서 구현될 필요가 없습니다.
예를 들어 여러 스레드에서 공유하는 리소스를 처리하는 경우 Singleton 패턴을 사용하면 리소스에 대한 액세스를 동기화하고 쉽게 관리할 수 있습니다. 이러한 방식으로 구현된 싱글톤 패턴은 코드를 단순화하고 복잡성을 줄일 수 있습니다.
메모리 절약
여러 인스턴스를 만들면 메모리와 CPU 리소스가 사용됩니다. 싱글톤 패턴은 하나의 인스턴스만 생성하므로 리소스를 효율적으로 사용할 수 있습니다.
데이터 일관성 보장
여러 인스턴스를 생성할 경우 각 인스턴스마다 다른 데이터를 가질 수 있지만 싱글톤 패턴을 사용하여 인스턴스를 생성하면 하나의 인스턴스만 생성되므로 인스턴스 데이터의 일관성을 보장할 수 있습니다.
싱글톤 패턴의 단점
난이도 테스트
싱글톤 인스턴스는 어디에서나 액세스할 수 있는 객체입니다. 해당 인스턴스에 다른 개체에 대한 종속성이 있는 경우 해당 개체를 테스트하기 어렵습니다. 이는 싱글톤 인스턴스에 상태가 있을 때 특히 문제가 될 수 있습니다.
상태가 있다는 것은 인스턴스 내에서 데이터가 변경될 수 있음을 의미합니다. 각 테스트 케이스에 대한 인스턴스의 상태가 변경되므로 다음 테스트에 영향을 줄 수 있습니다.
다중 스레드 환경의 문제
다중 스레드 환경에서 여러 스레드가 동시에 싱글톤 인스턴스에 액세스하면 인스턴스가 두 번 이상 생성될 수 있습니다. 이를 해결하기 위해서는 동기화 처리가 필요하지만, 이 처리 자체가 성능에 영향을 미칠 수 있다.
Q. Java에서 동기화를 처리하는 방법은 무엇입니까?
ㅏ 다중 스레드 환경에서 동기화 처리를 수행하려면 동기화 키워드로 해결할 수 있습니다. 다음은 synced를 사용하여 싱글톤 객체를 생성하는 코드의 예입니다.public class Singleton { private static Singleton instance; private Singleton() { // private constructor } public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }그러나 “synced” 키워드의 원칙을 고려하면 한 스레드가 메서드에 액세스하면 다른 스레드가 해당 메서드를 사용하기 위해 대기합니다. 점유 및 대기라고 불리는, 잠금 획득은 성능에 영향을 미칩니다.
객체 지향이 아닌
싱글톤 패턴은 객체 지향 프로그래밍(SOLID)의 원칙 중 하나입니다. DIP(종속 역전 원리)이는 싱글톤 패턴을 사용하면 싱글톤 클래스와 다른 클래스 간의 결합이 증가하여 하나의 싱글톤 클래스를 변경하면 다른 클래스에도 영향을 미치기 때문입니다.
싱글톤 패턴이 안티패턴이 될 수 있는 상황
싱글톤 패턴은 모든 상황에 장단점이 있기 때문에 항상 안티 패턴인 것은 아닙니다. 따라서 안티패턴 여부를 분류하기보다는 안티패턴으로 작용할 수 있는 상황을 고려한다.
상속이 필요한 경우
싱글톤에는 생성자가 있으므로 객체만 생성할 수 있습니다. 사적인그러나 상속을 통한 다형성 적용으로 제한되지만 다른 기본 생성자가 필요하므로 객체 지향의 이점을 적용할 수 없습니다.
테스트의 완전한 격리가 필요한 경우
싱글톤 패턴은 글로벌 상태 유지할 수 있지만 전역 상태를 사용하면 다른 모듈과의 종속성이 증가하여 테스트 및 코드를 이해하기 어렵게 만듭니다.
다중 스레드 환경에서 확실하지 않은 경우
위에서 언급했듯이 싱글톤 패턴은 다중 스레드 환경에서 안전하지 않을 수 있습니다. 단일 개체에 동시에 액세스하는 여러 스레드는 의도하지 않은 결과를 초래할 수 있습니다. 이러한 문제를 해결하려면 동기화 또는 휘발성 물질 키워드로 동기화를 수행해야 합니다.
개체의 수명 주기가 통제 불능 상태가 될 때
싱글톤 패턴은 개체의 수명 주기를 제어하기 어렵게 만듭니다. 개발자가 객체의 생성과 소멸을 직접 제어할 수 없기 때문에, 객체가 생성되고 소멸되는 시점의 유연성이 떨어집니다.
개인 책임 원칙 위반
싱글톤 패턴은 여러 책임이 있는 단일 클래스입니다. 단일 책임 원칙(SRP)싱글톤 클래스를 위반할 수 있음 전역 상태 생성, 관리 및 유지 여러 책임을 맡는 경우(예: 나. 수업, 수업의 규모가 커지고 유지보수가 어려워진다.
종속성 주입을 사용하는 경우
의존성 주입 패턴은 외부에서 개체 간의 종속성을 도입하여 개체 간의 결합 정도를 줄이는 패턴입니다.오전. 싱글톤 패턴은 종속성 주입 패턴과 호환되지 않습니다. Singleton 클래스를 사용하는 다른 클래스는 Singleton 객체에 직접 의존하므로 결합도가 높아집니다.
싱글톤 패턴 도입을 고민하다가 위와 같은 상황에 처하게 된다면 다른 방법으로 해결을 고민해보세요.