싱글톤 패턴이란?
객체 지향 프로그램에서 인스턴스를 단 하나만 생성하는 디자인 패턴을 싱글톤 패턴(singleton pattern)이라 한다.
📌 디자인 패턴이란?
객체 지향 프로그램을 어떻게 구현해야 좀 더 유연하고 재활용성이 높은 프로그램을 만들 수 있는지를 정리한 내용이 디자인 패턴(design pattern)이다. 간단히 말해서 프로그램 특성에 따른 설계 유형을 이론화 한 내용이며, 특정 알고리즘이나 프로그래밍 언어를 위한 라이브러리가 아니라 객체 지향으로 설계하는 방법을 설명한 것이다. 따라서 디자인 패턴은 자바는 물론 C++ 나 C#과 같은 다른 객체 지향 언어에도 적용하여 구현할 수 있다.
싱글톤 패턴으로 회사 클래스 구현하기
1단계 : 생성자를 private로 만들기
생성자가 하나도 없는 클래스는 컴파일러가 자동으로 디폴트 생성자 코드를 넣어 준다. 컴파일러가 만들어주는 디폴트 생성자는 항상 public인데, 생성자가 public이면 외부 클래스에서 인스턴스를 여러개 생성할 수 있다. 따라서 싱글톤 패턴에서는 생성자를 반드시 명시적으로 만들고 그 접근 제어자를 private로 지정해야 한다.
package singleton;
public class Company {
private Company() {}
}
2단계 : 클래스 내부에 static으로 유일한 인스턴스 생성하기
1단계에서 외부 인스턴스를 생성할 수 없도록 만들었다. 우리가 프로그램에서 사용할 인스턴스 하나는 필요하기에 Company 클래스 내부에서 하나의 인스턴스를 생성한다. 이 인스턴스가 프로그램 전체에서 사용할 유일한 인스턴스가 된다. private로 선언해 외부에서 이 인스턴스에 접근하지 못하도록 제한해야 인스턴스 오류를 방지할 수 있다.
package singleton;
public class Company {
private static Company instance = new Company(); //유일하게 생성한 인스턴스
private Company() {}
}
3단계 : 외부에서 참조할 수 있는 public 메서드 만들기
private로 선언한 유일한 인스턴스를 외부에서도 사용할 수 있도록 설정하기 위해 public 메서드를 생성한다. 그리고 유일하게 생성한 인스턴스를 반환해 준다. 이때 인스턴스를 반환하는 메서드는 getInstance() 메서드는 인스턴스 생성과 상관없이 호출할 수 있어야 하기 때문에 반드시 static으로 선언해야 한다.
package singleton;
public class Company {
private static Company instance = new Company(); //유일하게 생성한 인스턴스
private Company() {}
public static Company getInstance() { //인스턴스 외부에서 참조할 수 있도록
if(instance == null) { //public get() 메서드 구현
instance = new Company();
}
return instance; //유일하게 생성한 인스턴스 반환
}
}
4단계 : 실제로 사용하는 코드 만들기
외부 클래스에서는 Company를 생성할 수 없으므로 static으로 제공되는 getInstance() 메서드를 호출한다.
package singleton;
public class CompanyTest {
public static void main(String[] args) {
Company myCompany1 = Company.getInstance();
Company myCompany2 = Company.getInstance();
System.out.println(myCompany1 == myCompany2); //두 변수가 같은 주소인지 확인
}
}
myCompany1과 myCompany2를 비교해 보면 같은 참조 값을 가지는 동일한 인스턴스임을 알 수 있다.
이와 같이 static을 사용해서 유일한 객체를 생성하는 싱글톤 패턴을 구현할 수 있다.
'Language > Java' 카테고리의 다른 글
[Java] 다차원 배열 (0) | 2022.11.12 |
---|---|
[Java] 배열이란? (0) | 2022.11.07 |
[Java] 변수 유효 범위 (0) | 2022.10.20 |
[Java] static 변수 (0) | 2022.10.18 |
[Java] 객체 간 협력 (0) | 2022.10.17 |