티스토리 뷰
특징
싱글톤(Singleton) 패턴은 객체 지향 프로그래밍에서 특정 클래스의 인스턴스가 오직 하나만 생성되도록 보장하는 디자인 패턴입니다. 싱글톤의 주요 특징은 다음과 같습니다:
- 단일 인스턴스: 싱글톤 클래스는 전체 시스템에서 오직 하나의 인스턴스만 생성되어 사용됩니다. 이 인스턴스는 전역적으로 접근 가능하며, 동일한 리소스에 대한 중복 생성을 방지합니다.
- 전역 접근: 싱글톤 인스턴스는 전역적으로 접근 가능한 공유 리소스를 제공합니다. 이를 통해 여러 컴포넌트에서 동일한 리소스를 공유하고 사용할 수 있습니다.
- 생성 제어: 싱글톤 패턴은 인스턴스 생성을 클래스 내에서 관리하고, 외부에서 인스턴스를 임의로 생성할 수 없도록 합니다. 이를 통해 리소스의 중복 생성 및 충돌을 방지할 수 있습니다.
- 지연 초기화 (Lazy Initialization): 일반적으로 싱글톤 패턴은 처음 인스턴스에 접근할 때까지 인스턴스 생성을 지연합니다. 이를 통해 불필요한 리소스 낭비를 줄일 수 있습니다. 하지만, 싱글톤 패턴에도 즉시 초기화(Eager Initialization)를 사용하는 경우가 있습니다.
싱글톤 패턴은 다양한 상황에서 사용할 수 있습니다. 예를 들어, 데이터베이스 연결 관리, 로깅, 설정 파일 관리 등 공유 리소스에 대한 중앙 집중화된 관리가 필요한 경우에 싱글톤 패턴을 사용할 수 있습니다. 하지만, 싱글톤 패턴이 항상 최선의 해결책은 아닙니다. 멀티스레딩 환경에서 동기화 문제가 발생할 수 있으며, 객체 지향 원칙에 어긋날 수도 있기 때문입니다. 따라서 상황에 따라 적절한 디자인 패턴을 선택하는 것이 중요합니다.
사용하는 이유
싱글톤 패턴은 전역적으로 접근 가능한 단일 인스턴스를 가지는 클래스가 필요할 때 사용하는 것이 좋습니다. 싱글톤 패턴은 다음과 같은 상황에서 유용하게 사용할 수 있습니다:
- 공유 리소스 관리: 여러 객체들이 공유해야 하는 리소스가 있는 경우, 싱글톤을 통해 리소스 관리를 일관성 있게 할 수 있습니다. 예를 들어, 데이터베이스 연결이나 설정 파일 관리 등이 해당됩니다.
- 중복 생성 방지: 시스템 내에서 특정 클래스의 인스턴스가 단 하나만 존재해야 할 때 싱글톤 패턴을 사용하여 중복 생성을 방지할 수 있습니다. 예를 들어, 로그 관리, 스레드 풀, 캐시 관리 등이 해당됩니다.
- 글로벌 액세스 포인트 제공: 싱글톤 객체는 전역 액세스 포인트를 제공하므로, 어플리케이션의 어느 곳에서든 해당 객체에 접근할 수 있습니다. 이로 인해 모듈 간의 의존성이 줄어들고, 코드의 유지보수가 용이해집니다.
싱글톤 패턴을 사용할 때 주의할 점은 다음과 같습니다:
- 전역 상태 관리: 싱글톤이 전역 상태를 관리하게 되면, 코드의 의존성이 높아져 테스트와 유지보수가 어려워질 수 있습니다. 가능한 경우 의존성 주입(Dependency Injection)과 같은 기법을 사용하여 전역 상태를 관리하는 것이 좋습니다.
- 멀티스레딩 환경: 싱글톤 패턴을 멀티스레딩 환경에서 사용할 때는 동기화 문제를 주의해야 합니다. 인스턴스 생성 시 동기화를 적절하게 처리해야 여러 스레드에서 동시에 인스턴스를 생성하는 문제를 방지할 수 있습니다.
싱글톤 패턴은 특정 상황에서 매우 유용할 수 있지만, 위에서 언급한 주의사항을 고려하여 적절한 경우에만 사용해야 합니다.
사용 예시
// 싱글톤 클래스
package singleTon;
public class SingleTon1 {
// 단일 인스턴스를 공유하기위해 static으로 선언
private static SingleTon1 instance;
// static이어야 객채 생성없이 사용가능
public static SingleTon1 getInstance() {
// instance가 생성되지 않아서 null일때만 생성
// 즉 처음에만 생성이됌
if (instance == null) {
instance = new SingleTon1();
}
return instance;
}
}
// 메인문
package singleTon;
public class Main {
public static void main(String[] args) {
// 각자 다른객체
SingleTon1 s1 = SingleTon1.getInstance();
SingleTon1 s2 = SingleTon1.getInstance();
SingleTon1 s3 = SingleTon1.getInstance();
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
// 출력결과
// singleTon.SingleTon1@3ac3fd8b
// singleTon.SingleTon1@3ac3fd8b
// singleTon.SingleTon1@3ac3fd8b
// 다 다른 객체로 선언했지만 같은 곳을 바라보고 있음(같은 객체를 바라본다)
}
}
'JAVA > java 기초' 카테고리의 다른 글
쓰래드(Thread) 와 러너블(runnarble) 정리 (0) | 2023.04.14 |
---|---|
JAVA예외처리(Exception) (0) | 2023.04.14 |