Programming/Java

[Java] Singleton 패턴이란? (개념/ 사용 이유/ 장단점/ 예제)

JeongKyun 2022. 5. 29.

서론


이번 글에서는 스프링 컨테이너를 이용하기 전 원초적인 싱글톤 패턴의 구현과 싱글톤 패턴의 개념/ 사용이유/ 장단점 등에  대해 알아보려한다.

 


 

싱글톤(Singleton) 패턴이란?


클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴을 말한다.

이는 불필요한 인스턴스 생성을 막기 위해 사용한다고 보면 되는데, 메모리 관리에서는 장점이 많아서 가장 많이 쓰이는 디자인 패턴인데 물론 단점도있다. 하나씩 알아보자.

 

 

장점

  • 다른 객체의 요청이 들어왔을 때 이미 처음 생성 때 만들어진 인스턴스로만 재활용을 할 수 있어 불필요한 객체 생성을 안해도된다. --> 메모리 효율성 ↑
  • 하나의 인스턴스를 사용하기 때문에 전역적으로 데이터 공유가 용이하다.
  • 이미 생성해놓았기 때문에 객체 생성 시간이 줄어든다.

 

 

단점

  • 싱글톤 패턴을 구현하는데 꼭 필요한 코드가 꽤 된다. (코드 가시 복잡성)
  • 설계하는데 위험부담이 꽤 있다. 위험 부담은 다음과 같다.
  • 의존 관계 상 클라이언트가 구체 클래스에 의존하게 된다. (DIP 위반)
  • 클라이언트가 구체 클래스에 의존하여 OCP 원칙을 위반할 수 있다.
  • 인스턴스를 하나로 공유하기 때문에 내부 속성을 변경하거나 초기화 하기 어렵다.

 

 


 

Singleton 구현 방법 (Java)


public class SingletonService {

    private static final SingletonService instance = new SingletonService();

    public static SingletonService getInstance() {
        return instance;
    }

    private SingletonService() {

    }

    public void callInstance() {
        System.out.println("인스턴스 호출");
    }

}

싱글톤 패턴을 구성하는 방법은 여러가지가 있지만 기본적으로 안전하게 사용하는 방법중 하나는 위와 같은 방식이다.

 

getInstance함수를 이용하여 static으로 메모리에 올려놓은 해당 인스턴스를 가져오는 방법인데,

 

포인트는 생성자를 private를 하여 외부 클래스에서 new 키워드를 사용하여 인스턴스를 생성하는 것을 막기 위해 사용하는 것이다.

 

 

생성자 private을 하여 위와 같이 에러를 발생시킴

생성자를 private을 사용한 이유는 위와 같이 아예 생성을 못하게 막아버리기 위함이다.

 

생성자를 private으로 안해주면 누군가 또 객체를 생성하려 들 수 있기에 사전에 private으로 설정하여 에러를 표출하는 것이 좋은 방법이다.

 

 

 

jUnit 싱글톤 패턴 적용 테스트

    @Test
    @DisplayName("싱글톤 패턴 적용")
    void singletonServiceTest(){
        SingletonService singletonService1 = SingletonService.getInstance();
        SingletonService singletonService2 = SingletonService.getInstance();

        System.out.println(singletonService1);
        System.out.println(singletonService2);

        Assertions.assertThat(singletonService1).isSameAs(singletonService2);
    }

 

 

 

결과

테스트코드가 정상적으로 실행되었고 콘솔창에 찍힌 값을 보면 동일한 것도 확인할 수 있다.

 

 


 

마무리


이번 글에서는 싱글톤의 개념과 기본적인 사용 이유/ 방법 등에 알아보았는데 사실 스프링을 사용하는 개발자라면 스프링 컨테이너에서 제공하는 기능들을 사용하면 싱글톤 패턴의 제약에서 벗어나 보다 편하게 개발할 수 있다. 해당 관련된 내용은 추 후 시간이 된다면 다뤄볼 예정이다.

반응형

댓글

💲 많이 본 글