티스토리 뷰

JAVA/java 기초

JAVA 싱글톤이란?(Singleton)

svdjcuwg4638 2023. 4. 14. 16:33

 

특징

싱글톤(Singleton) 패턴은 객체 지향 프로그래밍에서 특정 클래스의 인스턴스가 오직 하나만 생성되도록 보장하는 디자인 패턴입니다. 싱글톤의 주요 특징은 다음과 같습니다:

 


  • 단일 인스턴스: 싱글톤 클래스는 전체 시스템에서 오직 하나의 인스턴스만 생성되어 사용됩니다. 이 인스턴스는 전역적으로 접근 가능하며, 동일한 리소스에 대한 중복 생성을 방지합니다.

  • 전역 접근: 싱글톤 인스턴스는 전역적으로 접근 가능한 공유 리소스를 제공합니다. 이를 통해 여러 컴포넌트에서 동일한 리소스를 공유하고 사용할 수 있습니다.

  • 생성 제어: 싱글톤 패턴은 인스턴스 생성을 클래스 내에서 관리하고, 외부에서 인스턴스를 임의로 생성할 수 없도록 합니다. 이를 통해 리소스의 중복 생성 및 충돌을 방지할 수 있습니다.
  • 지연 초기화 (Lazy Initialization): 일반적으로 싱글톤 패턴은 처음 인스턴스에 접근할 때까지 인스턴스 생성을 지연합니다. 이를 통해 불필요한 리소스 낭비를 줄일 수 있습니다. 하지만, 싱글톤 패턴에도 즉시 초기화(Eager Initialization)를 사용하는 경우가 있습니다.



싱글톤 패턴은 다양한 상황에서 사용할 수 있습니다. 예를 들어, 데이터베이스 연결 관리, 로깅, 설정 파일 관리 등 공유 리소스에 대한 중앙 집중화된 관리가 필요한 경우에 싱글톤 패턴을 사용할 수 있습니다. 하지만, 싱글톤 패턴이 항상 최선의 해결책은 아닙니다. 멀티스레딩 환경에서 동기화 문제가 발생할 수 있으며, 객체 지향 원칙에 어긋날 수도 있기 때문입니다. 따라서 상황에 따라 적절한 디자인 패턴을 선택하는 것이 중요합니다.

 

사용하는 이유

싱글톤 패턴은 전역적으로 접근 가능한 단일 인스턴스를 가지는 클래스가 필요할 때 사용하는 것이 좋습니다. 싱글톤 패턴은 다음과 같은 상황에서 유용하게 사용할 수 있습니다:

 

  1. 공유 리소스 관리: 여러 객체들이 공유해야 하는 리소스가 있는 경우, 싱글톤을 통해 리소스 관리를 일관성 있게 할 수 있습니다. 예를 들어, 데이터베이스 연결이나 설정 파일 관리 등이 해당됩니다.

  2. 중복 생성 방지: 시스템 내에서 특정 클래스의 인스턴스가 단 하나만 존재해야 할 때 싱글톤 패턴을 사용하여 중복 생성을 방지할 수 있습니다. 예를 들어, 로그 관리, 스레드 풀, 캐시 관리 등이 해당됩니다.
  3. 글로벌 액세스 포인트 제공: 싱글톤 객체는 전역 액세스 포인트를 제공하므로, 어플리케이션의 어느 곳에서든 해당 객체에 접근할 수 있습니다. 이로 인해 모듈 간의 의존성이 줄어들고, 코드의 유지보수가 용이해집니다.

 

싱글톤 패턴을 사용할 때 주의할 점은 다음과 같습니다:

 

  • 전역 상태 관리: 싱글톤이 전역 상태를 관리하게 되면, 코드의 의존성이 높아져 테스트와 유지보수가 어려워질 수 있습니다. 가능한 경우 의존성 주입(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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함