ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] SingletonPattern
    언어/JAVA 2022. 9. 7. 17:53

    -웹프로그래밍에서 자주 사용하는 기법

    -웹프로그래밍의 특성상 하나의 프로그램을 서버에 두고 다수의 사용자가 접속해서 그 하나의 프로그램을 사용하게 되는데 이때 그 프로그램내의 클래스로 만들어지는 객체는 다수의 사용자인원수 만큼 따로생성되어 사용되기 마련임. 이때 메모리 과부하가 일어날 수 있으며 이를 해결하기 위해 하나의 객체를 각각 다른 사용자가 혼자 사용하는 것처럼 공유해서 쓸 수 있게 하는 방식이 싱글턴 방식임

    -특정 클래스의 인스턴스를 반드시 한개만 생성할 수 있도록 강제하는 패턴

    -하나의 인스턴스를 여러 래퍼런스 변수가 공유하여 사용하도록 제어하는 방식임

    // 싱글톤 생성법
    import java.util.Calendar;
    class SingletonEx{
    	int n1;
    	int n2;
    // 1. 생성자를 private로 보호함
    	private SingletonEx() { }
    // 2. 클래스 내부에서 생성자를 호출해서 객체하나(new 인스턴스)를 생성
    //	  이 역시도 private로 생성함. &static으로 생성함
    	private static SingletonEx itc=new SingletonEx();
    // 위 itc 객체에 저장된 new SingletonEx()가 모두가 공유해서 사용할 유일한 new 인스턴스가 됨
    // 3. 생성해놓은 객체의 참조변수값을 리턴하는 public형의 메서드를 생성
    // 메서드 이름 getInstance() - static으로 생성함
    	public static SingletonEx getInstance(){
    		return itc;
    	}
    }
    
    public class Singleton {
    	public static void main(String[] args) {
    		// SingletonEx s1=new SingletonEx();
    		// SingletonEx s2=new SingletonEx();
    		// SingletonEx s1=new SingletonEx();
    		// SingletonEx s2=s1;
    		// SingletonEx s1=new SingletonEx(); 
    // 1. 생성자가 private으로 보호되므로 오류
    // SingletonEx.getInstance()가 리턴해주는 유일한 인스턴스의 주소를 s1에 저장해서 사용
    		 SingletonEx s1= SingletonEx.getInstance();
    		 SingletonEx s2= SingletonEx.getInstance();
    		 SingletonEx s3= SingletonEx.getInstance();
    		 
    		System.out.println(s1);
    		System.out.println(s2);
    		System.out.println(s3);
    // 객체 참조 변수를 println으로 출력하면 클래스이름과 해쉬코드가 출력됨
    // 해쉬코드: 각 객체들을 서로 구분할 수 있는 고유값->새로운 저장장소의 주소를 계산하는 피연산이기도 함
    		s1.n1=150;
    		s2.n2=200;
    		System.out.println(s3.n1+" "+s3.n2);
    		// Calendar c=new Calendar(); ->error
    		Calendar c=Calendar.getInstance();
    	}
    }
    public class Card {
    	final static int spade=4;
    	final static int diamond=3;
    	final static int heart=2;
    	final static int clover=1;
    	private int kind; // 	4:Sqade/ 3:Diamond/ 2:Heart/ 1:Clover
    	private int number; //	 A:1/ 2-10/ J:11/ Q:12/ K:13
    	Card(int kind, int number){
    		this.kind=kind;
    		this.number=number;
    	}
    	Card(){
    		this(spade,1);
    	}
    	// 무늬와 숫자를 String으로 리턴해주는 멤버메서드
    	// kind: 4, number: 13이라면 문자열"[Spade:K]"라고 리턴
    	public String toString() {
    		String[]kinds= {"","♣","♥","◆","♠"};
    		String[]numbers= {"","A","2","3","4","5","6","7","8","9","10","J","Q","K"};
    		String result=" ["+kinds[kind]+":"+numbers[number]+"] "; // [Spade:K]
    		return result;
    	}
    }
    
    class CardDeck{
    	private Card[]cards=new Card[52]; // 카드 52장의 저장된 배열(참조변수 배열)
    	// new Card(); 동작이 52번 필요함
    	// cards[0]=new Card(Card.spade,1);
    	// cards[1]=new Card(Card.spade,2);
    	// cards[2]=new Card(Card.spade,3);
    	 CardDeck() { // 생성자에서 배열 52칸에 new Card()	;로 인스턴스를 할당함
    		 int i=0;
    		 for(int k=1; k<=4; k++) { // 카드의 종류 1~4 반복
    			 for(int n=1; n<=13; n++) { // 카드 번호 1~13 반복
    				 cards[i]=new Card(k,n); // 카드 장수 i는 0~51
    				 i++;
    			 }
    		 }
    	 }
    	public Card pick(int i) {
    		return cards[i]; // cards[i] 객체(참조값)가 리턴
    	}
    	public void shuffle() {
    		// 모든 카드를 한번씩 랜덤한번째의 카드와 자리바꿈함. 반복실행 이용
    		for(int i=0; i<52; i++) {
    			int r=(int)(Math.random()*52);
    			Card temp=cards[i];
    			cards[i]=cards[r];
    			cards[r]=temp;
    		}
    	}
    }
    
    public class Game {
    	public static void main(String[] args) {
    		CardDeck d=new CardDeck();
    		d.shuffle();
    		/*
    		Card c1=d.pick(0);
    		System.out.printf("%s ",c1.toString());
    		System.out.printf("%s ", d.pick(1).toString());
    		System.out.printf("%s ", d.pick(2));
    		System.out.printf("%s ", d.pick(3));
    		System.out.printf("%s ", d.pick(4));
    		*/
    		// 현재 프로그램을 1인당 카드 7장, 플레이어 5명으로 늘려서 카드를 골고루 분배하고
    		// 플레이어 1명당 한줄에 분배된 카드를 출력
    		Card []p1=new Card[7];
    		Card []p2=new Card[7];
    		Card []p3=new Card[7];
    		Card []p4=new Card[7];
    		Card []p5=new Card[7];
    		int k=0;
    		for(int i=0; i<p1.length; i++) {
    			p1[i]=d.pick(k++);
    			p2[i]=d.pick(k++);
    			p3[i]=d.pick(k++);
    			p4[i]=d.pick(k++);
    			p5[i]=d.pick(k++);
    		}
    		for(int i=0; i<7; i++) System.out.printf("%s",p1[i]); 
    		System.out.println();
    		for(int i=0; i<7; i++) System.out.printf("%s",p2[i]); 
    		System.out.println();
    		for(int i=0; i<7; i++) System.out.printf("%s",p3[i]); 
    		System.out.println();
    		for(int i=0; i<7; i++) System.out.printf("%s",p4[i]); 
    		System.out.println();
    		for(int i=0; i<7; i++) System.out.printf("%s",p5[i]);
    		/*
    		Card c=new Card(Card.diamond, 11);
    		System.out.println("Card: "+c.toString());
    		Card d=new Card(Card.diamond, 1);
    		System.out.println("Card: "+d.toString());
    		System.out.println("Card: "+c);
    		System.out.println("Card: "+d);
    		*/
    	}
    }

    '언어 > JAVA' 카테고리의 다른 글

    [JAVA] Extends TypeCastion  (0) 2022.09.08
    [JAVA] 상속(Extends)  (0) 2022.09.07
    [JAVA] Static  (0) 2022.09.07
    [JAVA] This  (0) 2022.09.07
    [JAVA] 생성(Constructor)  (0) 2022.09.07

    댓글

Designed by Tistory.