본문 바로가기
JAVA/객체지향

자바 싱글톤 패턴 의미, static 활용한 구현 (singleton pattern)

by 스코리아 2023. 8. 18.

안녕하세요, 스코리아입니다.

오늘은 자바 static을 활용하여 싱글톤 패턴을 구현해 보겠습니다.

싱글톤 패턴은 자바 스프링의 핵심 기능 중 하나로도 등장하는데요, 싱글톤 패턴은 자바의 다양한 프레임워크에서 사용되고 있는 매우 중요한 개념입니다.

 

 

싱글톤 패턴 (singleton pattern)이란?

  • 프로그램에서 인스턴스가 단 한 개만 생성되어야 하는 경우 사용하는 디자인 패턴
  • 예를 들면 DB 커넥션의 경우 http 호출이 올 때마다 1개씩 생성되는 것은 비효율적이므로, 커넥션이 단 한 개만 생성된 상태로 해당 인스턴스를 공유해야 합니다.
  • 싱글톤 패턴은 static 변수, 메소드를 활용하여 구현할 수 있습니다.

자바의 디자인패턴 - 싱글톤패턴

싱글톤 패턴 구현해 보기

School.java 파일을 만들고, 딱 1개의 인스턴스만 생성될 수 있도록 만들고 그 인스턴스를 가져올 수 있도록 하는 메소드를 만들어봅시다.

public class School {
    private static School instance = new School(); // 인스턴스 만들기 (최초 1회)

    private School() {} // 생성자 - 외부 호출 막기

    public static School getInstance() { // 인스턴스 가져오기
        if(instance == null) {
            instance = new School();
        }
        return instance;
    }
}
  • new School()을 통해 인스턴스를 최초 생성하였고, 이 인스턴스를 static로 선언하여 프로그램이 메모리에 로딩되는 시점에 메모리를 할당합니다. (static에 대한 자세한 내용 참고하기: https://skorea6.tistory.com/12 )
  • 싱글톤 패턴을 지키려면, 인스턴스가 1개만 유지될 수 있도록 해야 하므로, 외부에서 기본 생성자로 호출하지 못하도록 기본 생성자를 private로 막아두었습니다.
  • getInstance() 메소드를 public으로 설정하여, 해당 메소드를 통해서만 인스턴스를 가져올 수 있도록 하였습니다. 메소드를 static으로 설정하여, 클래스이름으로 직접 참조가 가능하게끔 만들었습니다.

 

싱글톤 패턴 사용해 보기

public class SchoolTest {
    public static void main(String[] args) {
        School school1 = School.getInstance();
        School school2 = School.getInstance();

        System.out.println(school1 == school2); // true
    }
}
  • School 클래스에서 getInstance() 메소드를 static으로 선언하였으므로, 클래스이름인 School로 직접 참조가 가능합니다. (School.getInstance() 사용)
  • 싱글톤 패턴은 단 1개의 인스턴스만 유지될 수 있도록 하는 게 핵심입니다.
  • 예제를 보면, new 키워드를 이용하여 School 인스턴스를 별도로 생성하지 않고, getInstance() 메소드를 통해 이미 만들어진 인스턴스를 가져오기만 하였습니다.

  • 출력되는 값은 true입니다. school1과 school2가 동일한 인스턴스로, school1의 인스턴스 메모리 주소와 school2의 인스턴스 메모리 주소가 같기 때문입니다.

싱글톤 구조

  • 정리하자면, 싱글톤의 구조는 위 그림과 같습니다.
  • 한 개의 인스턴스를 private static로 선언한 뒤, getInstance() 메소드를 통해서만 이미 만들어진 인스턴스를 호출하는 방식입니다.

 


지금까지 자바(Java) 싱글톤 패턴의 의미(뜻)와 구현하고 사용하는 방법에 대해서 알아보았습니다.

읽어주셔서, 감사합니다.