본문 바로가기

Java/문법 및 이해

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

 

1. 싱글톤 패턴

싱글톤(singleton) 패턴이란 

 

객체의 인스턴스가 오직 1개만 생성되는 패턴을 의미한다. 

 

글만 봤을 땐 무슨 의미인지 모를 수 있다.

그래서 코드를 통해 싱글톤 패턴이 무엇인지 볼 것이다.

 

public class Singleton {

    private static Singleton instance = new Singleton();
    
    private Singleton() {
        // 생성자는 외부에서 호출못하게 private 으로 지정해야 한다.
    }

    public static Singleton getInstance() {
        return instance;
    }

    public void say() {
        System.out.println("hi, there");
    }
}

위 코드에서 특이한 부분이 있을 것이다.

(자바를 처음 접해본 사람으로서 다 이상하긴 함;;;)

 

private으로 싱글톤 instance 객체를 생성하였고, 외부에서 Singleton 클래스의 기능을 호출하지 못하게 생성자 또한 private으로 구현을 하였다.

 

외부에서 Singleton 객체를 호출해야할 필요가 있을 경우를 위해 public static으로 getInstance() 메서드로 자기 자신을 리턴하는 기능으로 접근이 가능하게 해준다.

 

 

2. 싱글톤 패턴을 사용하는 이유

위 코드와 같이 인스턴스를 오직 한 개로만 가져가면 어떤 이점이 있을까?

 

첫 번째는, 바로 메모리 측면에서 매우 유리한 이점을 가져온다.

new 연산자를 이용해서 객체를 딱 한번 생성을 하고 static을 이용해서 메모리에 상시 올려두어 고정된 메모리 영역을 사용하기 때문에 접근할 때 메모리 낭비를 방지할 수 있다.

 

두 번째로 데이터 공유가 쉽다.

싱글톤 인스턴스가 전역으로 사용되는 인스턴스이기 때문에 다른 클래스의 인스턴스의 데이터에 동시에 접근하게 되면 동시성 문제가 발생할 수 있다. 동시성 관련한 문제는 유의해서 설계를 해야한다.

 

또한, 도메인 관점에서 인스턴스가 한 개만 존재하는 것을 보증하고 싶은 경우에도 싱글톤 패턴을 사용한다.

 

 

3. 싱글톤 패턴의 문제점

첫 번째, 싱글톤 패턴을 구현하는 코드 자체가 많이 필요하다. 

 

두 번째, 테스트하기가 어렵다.

싱글톤 인스턴스는 자원을 공유하고 있기 때문에 티스트가 결정적으로 격리된 환경에서 수행되려면 매번 인스턴스의 상태를 초기화 시켜주어야 한다.

 

세 번째, 의존 관계상 클라이언트가 구체 클래스에 의존하게 된다.

 

뿐만 아니라 자식 클래스를 만들 수 없다는 것과 내부 상태를 변경하기 어렵다는 점 등 많은 문제점들이 존재한다.