본문 바로가기
JAVA

[JAVA] 싱글톤 디자인 패턴 (Singleton Design Pattern)

by Amy IT 2022. 5. 25.

싱글톤 디자인 패턴(Singleton Design Pattern)은 단 하나의 인스턴스만 생성하고자 할 때 사용하는 디자인 패턴입니다. 예를 들어 은행에서 계좌를 관리하는 프로그램을 만든다고 생각해 봅니다. 이때 계좌는 사용자마다 각각 존재해야 하지만, 이 계좌들을 관리하는 은행 객체는 단 하나만 있으면 됩니다. 이때 은행 객체를 단 하나만 생성하도록 제약을 걸 때 사용할 수 있는 것이 싱글톤 디자인 패턴입니다. 싱글톤 디자인 패턴을 적용하는 방법은 다음과 같습니다.

 

 

(1) private 생성자

 

외부에서 객체를 생성하지 못하도록 생성자의 접근제한자를 private으로 지정합니다. private 접근제한자는 같은 클래스에서만 접근을 허용합니다. 

 

 

(2) static 키워드 이용, 객체 생성

 

단 하나의 객체는 생성되어야 하므로, 자신의 클래스에서 생성자를 호출해 객체를 생성하고, static 변수에 참조시킵니다. static 키워드는 프로그램 실행 시 객체와 변수가 단 한 번 생성되도록 합니다. 객체를 참조하는 static 변수도 외부에서 함부로 접근할 수 없도록 private으로 지정합니다. 

 

 

(3) 객체 접근 위한 get() 함수

 

이렇게 만들어진 객체를 외부에서 가져갈 수 있도록 public한 함수를 만들어야 합니다. 이 함수 역시 static 키워드를 이용해야 하는데, 해당 클래스의 생성자를 앞선 과정에서 private으로 지정해서 객체 생성 없이 사용할 함수가 필요하기 때문입니다. 

 

 

(4) 클래스명.메소드명 으로 접근

 

위의 과정을 마치면 이제 외부에서 클래스명.메소드명 으로 참조값을 얻어서 객체에 접근할 수 있게 됩니다. 

 

 

이제 이 과정을 따라 은행 객체를 단 하나만 만드는 프로그램을 구현해 보겠습니다.

public class Bank {
	//2.단 하나의 객체 생성
	private static Bank bank = new Bank();
	private String bankName;

	//1.객체 생성 금지
	private Bank() {}
	
	//3.get함수 구현 
	public static Bank getBank() {
		return bank;
	}

	//이름 설정 함수
	public String getBankName() {
		return bankName;
	}
	public void setBankName(String bankName) {
		this.bankName = bankName;
	}

}
public class Test {

	public static void main(String[] args) {
//		Bank b = new Bank(); //private 생성자 접근 안됨 
//		Bank.bank; //private 변수 접근 안됨

		//4.bank를 생성이 아닌 받아서 사용하기 
		Bank b1 = Bank.getBank(); //생성되어 있는 객체를 public한 getBank()함수로 받아서 Bank타입 로컬변수에 참조
		System.out.println(b1); //bank의 주소 
		Bank b2 = Bank.getBank();
		System.out.println(b2); //같은 객체 
		b1.setBankName("국민은행");
		System.out.println(b2.getBankName()); //b1,b2 같은 객체이므로 이름바뀜 
	}

}

첫째, Bank 클래스에서 Bank 객체를 함부로 생성할 수 없도록 생성자를 private 지정합니다. 둘째, 단 하나의 Bank 객체는 생성되어야 하므로 같은 Bank 클래스에서 생성자를 호출하여 Bank 객체를 생성하고, static 키워드를 사용하여 프로그램 시작 시 생성될 수 있도록 합니다. bank 변수도 private으로 지정하여 외부의 접근을 제한합니다. 셋째, 생성된 Bank 객체를 외부에서 가져갈 수 있도록 public한 get() 함수를 선언합니다. 외부에서 Bank 객체를 생성할 수 없으므로 객체 생성 없이 사용 가능하도록 static 키워드를 사용합니다. 이렇게 생성된 객체를 메인에서 getBank() 함수로 받아서 Bank 타입 로컬변수에 참조시켜주면, 단 하나의 Bank 객체를 메인에서 사용할 수 있게 됩니다. 추가로 여기서는 setBankName() 함수와 getBankName() 함수를 통해 이름을 설정하고 조회할 수 있도록 하고 있습니다. 

 

 

이상으로 싱글톤 디자인 패턴의 정의와 방법, 예시를 정리해 보았습니다.

 

 

댓글