[Java] 싱글톤 패턴

1 분 소요

싱글톤 패턴이란?

프로그램을 구현하다 보면 여러 개의 인스턴스가 필요한 경우도 있고, 단 하나의 인스턴스만 필요한 경우도 있다. 객체 지향 프로그램에서 인스턴스를 단 하나만 생성하는 디자인 패턴을 싱글톤 패턴(singleton pattern) 이라고 한다. 우리가 여기서 살펴볼 싱글톤 패턴은 static을 응용하여 프로그램 전반에서 사용하는 인스턴스를 하나만 구현하는 방식이다.

어떤 회사의 직원들을 객체지향으로 구현한다고 가정해보자. 직원은 여러명이겠지만, 회사는 하나다.
이런 경우에 직원 인스턴스는 여러 개를 생성하는 것이 당연하지만, 회사 객체는 하나여야 할 것 이다.
그럼 싱글톤 패턴으로 company 클래스를 단계적으로 만들어 보자.

싱글톤 패턴으로 회사 클래스 구현하기

단계 1 : 생성자를 private로 만들기

생성자가 하나도 없는 클래스는 컴파일러가 자동으로 디폴트 생성자를 만들어 주는데, 이 생성자는 항상 public이다. 생성자가 public이면 외부에서 접근이 가능하기 때문에 인스턴스를 여러 개 생성 할 수 있다. 따라서 싱글톤 패턴에서는 생성자를 반드시 명시적으로 만들고, 그 접근 제어자를 private로 설정해야한다.

1
2
3
4
5
6
7
package singleton;

public class Company {
    private Company(){
        
    }
}

단계 2 : 클래스 내부에 static으로 유일한 인스턴스 생성하기

단계 1에서 접근제어자를 private로 함으로써 외부 인스턴스를 생성할 수 없도록 만들었다. 하지만 우리가 프로그램에서 사용할 인스턴스 하나는 필요하기 때문에, Compony 클래스 내부에서 하나의 인스턴스를 생성한다. 이 인스턴스가 프로그램 전체에서 사용가능한 유일한 인스턴스가 된다.
이 또한 private으로 선언해야만 외부에서 이 인스턴스에 접근 할 수 없어, 인스턴스 오류가 방지된다.

1
2
3
4
5
6
package singleton;

public class Company {
    private static Company instance = new Company();
    private Company(){ }
}

단계 3 : 외부에서 참조 할 수 있는 public 메서드 만들기

이제 private으로 선언한 유일한 인스턴스인 instance를 외부에서도 사용가능 하게 설정해야한다.
이를 위해 public 메서드를 사용해 유일한 인스턴스를 반환하게 한다. 이때 인스턴스를 반환하는 메서드는 반드시 static으로 선언해주어야 인스턴스 생성과 상관없이 호출이 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
package singleton;

public class Company {
    private static Company instance = new Company();
    private Company(){ }

    public static Company getInstance(){
        if(instance== null){
            instance = new Company();
        }
        return instance;
    }
}

단계 4 : 실제로 사용하는 코드 만들기

외부 클래스에서는 Company를 생성할 수 없으므로 getInstance() 메서드를 호출한다.
Company.getInstance(); 와 같이 호출하면 유일한 인스턴스를 받아온다.
두 인스턴스를 만들어 주소 값이 같은지 확인해보도록 하자.

1
2
3
4
5
6
7
8
9
10
11
package singleton;

public class CompanyTest {
    public static void main(String[] args){
        Company myCompany1 = Company.getInstance();
        Company myCompany2 = Company.getInstance();
        System.out.println(myCompany1 == myCompany2);
    }
}

>>> true

두개의 인스턴스를 만들었지만, 받아온 인스턴스는 동일한 주소 값을 가지는, 아까 만들었던 유일한 인스턴스를 받아왔음을 알 수 있다.

카테고리:

업데이트:

댓글남기기