본문 바로가기
JAVA

[JAVA] 싱글톤 패턴(만드는 방법, 사용하는 이유, 장단점)

by 정공자씨 2024. 4. 22.

 

싱글톤

정의

  • 특정 클래스에 대해 단 1개의 인스턴스(객체)만 생성하여, 이를 공유하여 사용하기 위한 패턴

 

싱글톤을 사용하는 경우

  • 프로그램에서 1개의 클래스 인스턴스(객체)만 존재해야 하는 경우
  • 필요할 때마다 객체를 생성하는 것이 아니고
  • 1개의 인스턴스(객체)만 메모리에 생성하여, 전역에서 이를 공유하여 사용할 수 있게 함

 

싱글톤 클래스를 만드는 방법

싱글톤 패턴을 적용할 경우, 2개 이상의 인스턴스가 존재할 수 없기 때문에 제약 조건이 있음

 

1. 인스턴스를 생성할 클래스의 생성자멤버변수(필드)private로 선언

  • 싱글톤으로 사용될 클래스의 생성자는 private(접근 제한자)로 선언이 돼 있어서
  • 외부 클래스에서 객체를 생성할 수 없음
  • 즉, 외부 클래스에서 new 연산자를 통한 인스턴스 생성이 불가함

 

2. 생성된 인스턴스(객체)를 반환할 수 있는 '정적 메서드' public으로 선언

정적 메서드(static method)인 이유

외부 클래스에서 new연산자를 사용하지 않고서(인스턴스를 생성하지 않고서도)
클래스 내의 메서드에 접근하기 위해서 static으로 설정
  • 외부 클래스에서 해당 클래스의 인스턴스(객체)를 얻으려면, getInstance() 메서드를 통해야 함
  • getInstance() 메서드 내부에서
    • instance == null 이면 인스턴스를 생성하고
    • instance != null이면 인스턴스를 반환함
  • 즉, getInstance() 메서드를 호출 시에
    • 생성된 인스턴스(객체)가 없으면, 인스턴스를 새로 생성하고
    • 인스턴스가 이미 존재하면, 인스턴스의 위치값(주소값)를 리턴 해줌

 

3. 유일한 객체를 참조할 수 있는 정적 참조 변수가 필요

  • 인스턴스의 위치값(주소값)을 담고 있는 참조변수가 필요
  • getInstance() 메서드의 결과로 참조변수를 반환함
[ 참조변수를 통해서 유일한 객체를 참조 ]
public class Singleton {
    // 싱글톤 객체를 담을 수 있는 변수(정적 참조 변수)
    private static Singleton object;

    // private 생성자
    private Singleton() {
    }
    
    // getInstance()
    public static Singleton getInstance() {
        if (object == null) {
            object = new Singleton();
        }        
        return object;  // 객체의 위치값(주소값)을 담고 있는 참조변수 반환
    }
}​


- Singleton 클래스의 생성자 Singleton() 는 private하기 때문에 다른 클래스에서 접근할 수 없어서, new연산자를 통해 해당 클래스의 인스턴스를 생성할 수 없음
- 그런데 싱글톤 패턴의 클래스는 단 하나의 인스턴스만 허용하고, 따라서 이것을 사용하기 위해서는, 해당 클래스의 참조변수(object)를 통해서 유일한 객체를 참조함

 

 

예제

public class Earth {
    // 싱글톤 객체를 담을 수 있는 변수(정적 참조 변수)
    private static Earth object;

    // private 생성자
    private Earth() {
    }
    
    // getInstance()
    public static Earth getInstance() {
        if (object == null) {
            Earth = new Earth();
        }        
        return object;  // 객체의 위치값(주소값)을 담고 있는 참조변수 반환
    }
}
  • object는 단일한 객체를 저장(객체의 주소값을 저장)하기 위한 정적 참조 변수
  • getInstance()를 최초로 실행될 때에만 객체가 초기화 됨

 

 

장점

 

1. 유일한 인스턴스

  • 싱글톤 패턴이 적용된 클래스의 인스턴스는 애플리케이션 전역에서 단 하나만 존재하도록 보장
  • 객체의 일관된 상태를 유지하고, 전역에서 접근이 가능하도록 함

2. 메모리 절약

  • 인스턴스가 단 하나뿐이므로 메모리가 절약됨
  • 생성자를 여러 번 호출하더라도 새로운 인스턴스를 생성하지 않기 때문

3. 지연 초기화

  • 인스턴스가 실제로 사용되는 시점에 생성하기 때문에, 비용을 줄일 수 있음

 

 

단점

1. 결합도 증가

  • 전역에서 접근이 가능하기 때문에, 해당 인스턴스에 의존하는 경우에 결합도가 증가함

2. 테스트 복잡성

  • 싱글톤 클래스를 의존하는 외부 클래스는 결합도 증가로 인해 테스트가 어려울 수 있음

3. 전역에서 접근 가능

  • 애플리케이션 내 어디서든 접근이 가능한 경우, 무분별한 사용을 막기 어려움
  • 이로 인해 변경에 대한 복잡성이 증가할 수 있음

 

 

 

 

 

 

 

 

출처

https://ittrue.tistory.com/563 [IT is True:티스토리]