JAVA/JAVA

Java | Singleton Pattern 싱글톤 패턴

pathas 2020. 2. 11. 17:19

Singleton Pattern 싱글톤 패턴

객체 지향 프로그램에서 인스턴스를 단 하나만 생성하는 디자인 패턴

  • 객체를 하나만 생성한 뒤 공유해서 사용
  • 웹에서 자주 사용되는 기법
    동시접속을 효율적으로 처리할 수 있음
  • 메모리 절약 목적

Design Pattern 디자인 패턴

객체 지향 프로그램을 어떻게 구현해야
좀 더 유연하고 재활용성이 높은 프로그램으로 만들 수 있는지를 정리한 내용

  • 프로그램 특성에 따른 설계 유형을 이론화한 것
  • 특정 알고리즘이나 프로그래밍 언어를 위한 라이브러리가 아니라
    객체 지향적으로 설계하는 방법을 설명한 것

싱글톤 패턴 작성법 with 예제

단계 ①_생성자에 private 부여

컴파일러가 기본 생성자를 만들지 못하게 하고
외부 클래스에서 임의로 해당 클래스의 인스턴스를 생성하지 못하도록 함

package j200211;

public class SingTest {
    // 생성자에 private 부여
    private SingTest() {
    }

}

단계 ②_클래스 내부에 static으로 유일한 인스턴스 생성

프로그램 내에서 사용할 인스턴스가 하나는 필요하기 때문에
클래스 내부에서 인스턴스 생성 후 외부에서 접근하지 못하도록
pivate 접근 제어자 부여

package j200211;

public class SingTest {

    // 유일한 인스턴스 생성, 공유를 위해 static으로 지정
    private static SingTest st = new SingTest(); 

    private SingTest() {
    }

}

단계 ③_외부에서 참조할 수 있는 public 메소드 작성

private으로 설정된 유일한 인스턴스를
외부에서도 사용할 수 있도록 public 메소드 작성

외부 클래스에서 해당 클래스의 인스턴스를 생성할 수 없기 때문에
인스턴스 반환 메소드는 반드시 static으로 선언해야 함

package j200211;

public class SingTest {

    private static SingTest instance = new SingTest();

    private SingTest() {
    }

    // 외부에서 인스턴스를 참조할 수 있도록 getInstance() 메소드 작성
    public static SingTest getInstance() {
    
        // synchronized: 객체 참조시 작업이 중복되지 않도록 함
        synchronized (SingTest.class) {
        
            // instance가 없다면 instance 변수에 객체 생성
            if (instance == null) {
                instance = new SingTest();
            }
            
            // instance 정적 멤버 변수 반환 → 외부 참조 가능
            return instance;
        }

    }

}

단계 ④_실제 사용 코드 작성

package j200211;

public class Test {

    public static void main(String[] args) {
        // 객체 생성, SingTest 클래스의 인스턴스를 반환 받음
        SingTest st1 = SingTest.getInstance();
        SingTest st2 = SingTest.getInstance();

        // 동일한 인스턴스인지 비교
        if (st1 == st2) {
            System.out.println("st1 주소: " + st1);
            System.out.println("st2 주소: " + st2);
            System.out.println("같은 인스턴스 입니다.");
        }
        /*
        st1 주소: j200211.SingTest@15db9742
        st2 주소: j200211.SingTest@15db9742
        같은 인스턴스 입니다.
        */
    }

}

디자인 패턴 중 하나인 싱글톤 패턴에 대해 알아보았습니다.

싱글톤 패턴은 객체를 하나만 생성한 뒤 그것을 공유해서 사용하도록 하는 설계 방식을 의미합니다.

메모리 절약과 동시 접속 처리에 자주 쓰이는 패턴이라고 하니 알아둘 필요가 있겠습니다.

또한 디자인 패턴의 경우 객체 지향 프로그래밍 언어라면 대동소이하게 참조할 수 있기 때문에

다른 객체 지향 언어를 배울 때에도 도움이 될 수 있을 것입니다.