JAVA, singleton패턴(static 응용)
static 응용 : singleton 패턴
- 자동차 회사는 단 한개만 존재해야 한다
[singleton패턴 이란]
- 전 시스템에 단 하나의 인스턴스만이 존재하도록 구현하는 방식
- ex)날짜, 서울의 날짜는 단한개. 뉴욕의 날짜는 단한개.
[코드 예시]
CompanyTest
package singlton;
import java.util.Calendar;
public class CompanyTest {
public static void main(String[] args) {
Company c1 = Company.getInstace();
Company c2 = Company.getInstace();
// 주소 값이 같다
System.out.println(c1+" "+c2);
// 예시
//Calendar cal = new Calendar();
// 컴파일 에러. 달력은 이미 만들어진 한개의 달력을 참조만할수있다.
Calendar calendar = Calendar.getInstance();
calendar.getTime(); // Calendar의 여러 메소드 사용 가능
}
}
Company
package singlton;
public class Company {
private static Company instance = new Company();
// 전체에서 사용될 유일한 인스턴스
// 함부로 변경되면 안되므로 private로 선언
// 단 하나의 값만을 가져야 하므로 static으로 선언
// private 이므로 해당 클래스에서만 생성가능하다
private Company() {}
// 객체를 생성하지 않고 해당 인스턴스를 부르고 싶어서 static으로 선언한다
public static Company getInstace() {
if (instance == null)
instance = new Company();
return instance;
}
}
문제
- 카드 회사가 있습니다. 카드회사는 유일한 객체이고, 이 회사에서 카드를 발급하변 항상 고유번호가 자동으로 생성됩니다
- 10001부터 시작해서 카드가 생성될 때 마다 10002,10003식으로 증가됩니다
- 다음 코드가 수행 되도록 Card 클래스,CardCompany 클래스를 구현하세요
CardCompanyTest
package classPart;
public class CardCompanyTest {
public static void main(String[] args) {
// 싱글톤 패턴
CardCompany company = CardCompany.getInstance();
// 카드 회사는 하나만 있고, 카드회사에서 카드를 발급한다.
// 메서드에서 Card 생성
Card myCard = company.createCard();
Card yourCard = company.createCard();
System.out.println(myCard.getCardNumber()); // 10001 출력
System.out.println(yourCard.getCardNumber()); // 10002 출력
}
}
CardCompany
package classPart;
public class CardCompany {
// 카드회사는 유일하다
// 함부로 변경되면 안되므로 private
// 단 하나의 값만 가져야 하므로 static
private static CardCompany company = new CardCompany();
// private이므로 해당 클래스에서만 생성가능
private CardCompany() {}
// 객체를 생성하지 않고 해당 인스턴스를 부르고 싶어서 static으로 선언한다
public static CardCompany getInstance() {
if (company == null) {
company = new CardCompany();
}
return company;
}
// 카드회사에서 카드를 발급한다.
// Card가 생성된다
public Card createCard() {
Card card = new Card();
return card;
}
}
Card
package classPart;
public class Card {
// 카드 번호는 카드마다 하나 있다
// static을 사용하면 모든 카드가 공유하므로 쓰면안된다
// private로 외부에서 함부로 바꾸지 못하게 보호한다.
//private static int cardNumber;
private int cardNumber;
// serialNum 카드 회사에서 제공되고 그 값음 공유 되므로 static으로 설정한다
private static int serialNum = 10000;
Card(){
// card가 발급될때마다 (인스턴스화 될때마다) seialNum은 +1 되고, 그값은 유지 된다.
serialNum++;
cardNumber = serialNum;
}
public int getCardNumber() {
return cardNumber;
}
public void setCardNumber(int cardNumber) {
this.cardNumber = cardNumber;
}
}
Reference
인프런 강좌
Do it! 자바 프로그래밍 입문