Hyemi Lee

Hyemi Lee

주니어 개발자의 삽질과 기록

JAVA, singleton패턴(static 응용)

static 응용 : singleton 패턴

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! 자바 프로그래밍 입문

Share on

Twitter Facebook LinkedIn

You may also enjoy

Redis Stream

2021年04月28日

Stream Stream은 로그 데이터를 처리하게위해 5.0에서 새로 도입된 데이터 타입입니다. 대량의 데이터가 연속적으로 발생할때 처리하기 위해 등장했습니다. 기존 데이터를 수정하지 않고 오직 추가로 발생합니다. 이런 종류의 데이터를 stream or log데이터...

Study, Object, chapter2&3 presentation

2021年04月20日

chapter03. 역할, 책임, 협력 객체지향 설계란, 올바른 객체에게 올바른 책임을 할당하면서 낮은 결합도와 높은 응집도를 가진 구조를 창조하는 활동이다.

Spring, chatting 프로그램 만들기, Reactive란?

2020年06月16日

Reactive 막힘없이 흘러다니는 data(event)를 통해 사용자에게 자연스러운 응답을 주고 규모 탄력적으로 리소스를 사용하며 실패에 있어서 유연하게 대처한다 모든 지점에서 블럭 되지 않게 하자 oop와 같은 패러다임 모든 것을 비동기적인 data의 strea...