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 객체를 생성하지 않고 기존에 생성되어 있는 객체를 계속해서 사용하는 것이다.
예제 코드
카드 회사에서 카드를 발급하는 스토리를 예로 싱글톤 패턴을 사용해본다.
본 카드 회사는 유일한 객체이고, 이 회사에서 카드를 발급하면 고유 번호가 자동으로 생성된다.
카드 고유 번호는 10001 부터 시작하며, 카드가 새로 생성될 때마다 10002, 10003으로 1씩 증가한다.
CardCompanyMain.java
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 객체가 싱글톤 패턴인지 확인하고, 카드 고유 번호가 조건에 맞게 출력되는지 확인한다.
싱글톤 패턴 검사 부분에서 동일객체가 출력되면 싱글톤 패턴을 만족하는 것이다.
Company.java
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로 초기화한다.
새로운 카드를 발급하고 나면 cardNumber 값을 1 증가시킨다.
Card.java
public class Card {
private int cardNumber;
public Card() { } // 기본 생성자
public Card(int cardNumber) {
this.cardNumber = cardNumber;
}
public int getCardNumber() {
return cardNumber;
}
}
카드 객체에서는 카드 고유 번호를 매개변수로 입력 받아 객체를 생성한다.
또한 카드 고유 번호를 불러오기 위한 getCardNumber 메소드를 만들어주었다.
실행 결과

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 객체를 생성하지 않고 기존에 생성되어 있는 객체를 계속해서 사용하는 것이다.
예제 코드
카드 회사에서 카드를 발급하는 스토리를 예로 싱글톤 패턴을 사용해본다.
본 카드 회사는 유일한 객체이고, 이 회사에서 카드를 발급하면 고유 번호가 자동으로 생성된다.
카드 고유 번호는 10001 부터 시작하며, 카드가 새로 생성될 때마다 10002, 10003으로 1씩 증가한다.
CardCompanyMain.java
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 객체가 싱글톤 패턴인지 확인하고, 카드 고유 번호가 조건에 맞게 출력되는지 확인한다.
싱글톤 패턴 검사 부분에서 동일객체가 출력되면 싱글톤 패턴을 만족하는 것이다.
Company.java
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로 초기화한다.
새로운 카드를 발급하고 나면 cardNumber 값을 1 증가시킨다.
Card.java
public class Card {
private int cardNumber;
public Card() { } // 기본 생성자
public Card(int cardNumber) {
this.cardNumber = cardNumber;
}
public int getCardNumber() {
return cardNumber;
}
}
카드 객체에서는 카드 고유 번호를 매개변수로 입력 받아 객체를 생성한다.
또한 카드 고유 번호를 불러오기 위한 getCardNumber 메소드를 만들어주었다.
실행 결과
