본문 바로가기

Language/Java

[Java] static 응용 - 싱글톤 패턴

싱글톤 패턴이란?

객체 지향 프로그램에서 인스턴스를 단 하나만 생성하는 디자인 패턴을 싱글톤 패턴(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