[Design Pattern] Singleton(싱글톤)

Singleton 디자인 패턴

Singleton(싱글톤)이란 인스턴스가 단 1개만 생성되어야 하는 패턴이다.

Java를 사용하여 싱글톤을 만드는 방법은 다음과 같다.

singleton

public class SingletonTest {
	
	private int num;
	
	private SingletonTest() {
		num = 100;
	}
	
	private static SingletonTest instance = null;
    
	public static SingletonTest getInstance() {
		if (instance == null)
			instance = new SingletonTest();
		return instance;
	}
	
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
}

생성자private으로 만든다.
private로 생성함으로써 다른 클래스에서 사용하지 못하도록 한다.

SingletonTest 변수 instance 를 null 값으로 초기화한다.

getInstance() 메소드를 사용하여 SingletonTest 객체를 생성할 수 있다.
해당 메소드에서는 만약 기존에 생성된 instance, 즉 SingletonTest 객체가 없다면 SingletonTest 객체를 new 한 뒤 instance 변수에 저장하고 반환한다.
이미 SingletonTest 객체가 존재하는 경우에는 바로 instance 를 반환한다.

따라서 새로운 SingletonTest 객체를 생성하지 않고 기존에 생성되어 있는 객체를 계속해서 사용하는 것이다.

Java 예제 코드

카드 회사에서 카드를 발급하는 스토리를 예로 싱글톤 패턴을 사용해본다.

본 카드 회사는 유일한 객체 이고, 이 회사에서 카드를 발급하면 고유 번호가 자동으로 생성된다.
카드의 고유 번호는 10001 부터 시작하며, 카드가 새로 생성될 때마다 10002, 10003으로 1씩 증가한다.

public class CardCompanyMain {

	public static void main(String[] args) {

		Company com = Company.getInstance();
		Company company = Company.getInstance();
		
		System.out.println((com == company) ? "동일객체" : "다른객체"); // 싱글톤 패턴인지 검사
		
		Card myCard = company.createCard(); // 첫 번째 카드 생성, 고유번호 10001
		Card yourCard = company.createCard();
		
		System.out.println(myCard.getCardNumber()); // 10001 출력
		System.out.println(yourCard.getCardNumber()); // 10002 출력		
	}
    
}

Main 에서는 Company 객체가 싱글톤 패턴인지 확인하고, 카드의 고유 번호가 조건에 맞게 출력되는지 확인한다.
싱글톤 패턴 검사 부분에서 동일객체가 출력되면 싱글톤 패턴을 만족하는 것이다.

public class Company {

	private static int cardNumber = 10001;
	
	private Company() {
		
	}
	
	private static Company instance = null;
    
	public static Company getInstance() {
		if (instance == null)
			instance = new Company();
		return instance;
	}
	
	public Card createCard() {
		Card card = new Card(cardNumber);
		cardNumber++;
		return card;
	}
	
}

카드 회사 객체는 싱글톤 패턴으로 만든다.
그리고 카드를 만들 때마다 고유 번호도 함께 생성하기 위해 cardNumber 변수를 static 으로 선언 및 10001 값으로 초기화한다.
새로운 카드를 발급하고 나면 cardNum 값을 1 증가시킨다.

public class Card {
	private int cardNumber;
	
	public Card() {	// 기본 생성자
		
	}
	
	public Card(int cardNumber) {
		this.cardNumber = cardNumber;
	}
	
	public int getCardNumber() {
		return cardNumber;
	}
	
}

카드 객체에서는 카드 고유 번호를 매개변수로 입력 받아 객체를 생성한다.
또한 카드 고유 번호를 불러오기 위한 getCardNumber 메소드를 만들어주었다.

실행 결과

좋은 웹페이지 즐겨찾기