this & this()
 - this 는 자신의 클래스의 참조값을 갖고 있다
 - this() 는 Overload된 다른 생성자를 호출 할 수 있다.
 - this()는 생성자의 첫줄에 써야 한다.

super & super()
 - super 는 부모클래스의 참조값을 갖고 있다.
 - super() 는 부모클래스의 생성자를 호출 할 수 있다.
 - super() 는 생성자의 첫줄에 써야 한다.

- 메모리 static 영역에 1번만 생성된다. → 초기화 1번만 수행
   모든 객체가 공유한다. (공유변수)

- static메소드에서는 static변수만 사용 가능

- static변수나 메소드는 호출시 클래스명으로 직접 호출 할 수 있다.
    객체로도 호출이 가능하다.

- static{ } - 초기화 영역
                - 생성자보다도 먼저 수행한다.

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;

class Game2{
 public static void main(String[] args) throws IOException {
  int[] bas = new int[3];
  int[] gap = new int[3];

  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  System.out.print("게임을 실행 하시겠습니까? (y/n) : ");
     String ans =br.readLine();


  if(ans.equals("y") || ans.equals("Y")){

    System.out.println("숫자를 생성했습니다.");

    for(int i=0; i<bas.length; i++){
     bas[i] = (int)(Math.random()*9)+1;
 
     for(int j=0; j<i; j++){
      if(bas[i] == bas[j]){
       i--; break;
      } // if end
     } // for end  

    } // for end

//System.out.println(bas[0]+""+bas[1]+""+bas[2]);

    while(true){
      int str = 0;
      int bal = 0;

      while(true){
       System.out.print("당신이 생각하는 숫자 = ");
       int dap = Integer.parseInt(br.readLine());
           
        for(int i=0; i< gap.length; i++){
         gap[i] = dap%10;
         dap = (int)(dap/10);
        } //for end

       if (dap != 0 || gap[2]==0 || gap[0]==gap[1] || gap[1]==gap[2] || gap[2]==gap[0])
       System.out.println("값을 잘못 입력하셨습니다. 다시 입력해 주세요\n");
       else break;
      } //while end

      if (bas[0] == gap[2]) str++;
      if (bas[1] == gap[1]) str++;
      if (bas[2] == gap[0]) str++;
      if (bas[0] == gap[0] || bas[0] == gap[1]) bal++;
      if (bas[1] == gap[0] || bas[1] == gap[2]) bal++;
      if (bas[2] == gap[1] || bas[2] == gap[2]) bal++;

      if(str>0 && bal>0) System.out.println("결과 : "+str+"스트라이크 "+bal+"볼\n");
      else if(str>0 || bal>0){
       if(str>0) System.out.println("결과 : "+str+"스트라이크\n");
       else System.out.println("결과 : "+bal+"볼\n");
      } else System.out.println("결과 : 아웃\n");
     
      if (bas[0]==gap[2] && bas[1]==gap[1]  && bas[2]==gap[0] ) break;
    } //while end
  

   System.out.println("정답 짝짝짝...^^");

  } //if end

  else if(ans.equals("n") || ans.equals("N")) System.out.println("게임이 종료되었습니다.");
  else System.out.println("잘못 입력하셨습니다.");
  

 }
}

import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;

class Game{
 public static void main(String[] args) throws IOException {

  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  
  System.out.println("가위바위보 게임시작 // 처음배팅금액 : 1000원 지급");

  int point = 1000;

  while(true){

   System.out.println("1. 주먹\n" + "2. 가위\n" + "3. 보자기\n" + "0.프로그램 종료");
   System.out.print("메뉴선택 : ");
   int user = Integer.parseInt(br.readLine());
   if(user == 0){System.out.println("게임이 종료되었습니다."); break;}

   System.out.print("배팅금액 : ");
   int money = Integer.parseInt(br.readLine());
   
   System.out.print("결과를 보시려면 Enter를 치세요 ^^  \n");
   String enter = br.readLine();

   int com = (int)(Math.random()*3)+1;
    if(user == 1){
     if(com == 2){
      System.out.println("computer : 가위, you : 주먹");
      point = point + money;
      System.out.println("You Win!!! 잔액 : "+point+"원");
     }
     else if(com == 3){
      System.out.println("computer : 보자기, you : 주먹");
      point = point - money;
      System.out.println("You Lose!!! 잔액 : "+point+"원");
     }
     else{
      System.out.println("computer : 주먹, you : 주먹");
      System.out.println("비겼다!! 잔액 : "+point+"원");
     }
    } //if end

    if(user == 2){
     if(com == 3){
      System.out.println("computer : 보자기, you : 가위");
      point = point + money;
      System.out.println("You Win!!! 잔액 : "+point+"원");
     }
     else if(com == 1){
      System.out.println("computer : 주먹, you : 가위");
      point = point - money;
      System.out.println("You Lose!!! 잔액 : "+point+"원");
     }
     else{
      System.out.println("computer : 가위, you : 가위");
      System.out.println("비겼다!! 잔액 : "+point+"원");
     }
    } //if end

    if(user == 3){
     if(com == 1){
      System.out.println("computer : 주먹, you : 보자기");
      point = point + money;
      System.out.println("You Win!!! 잔액 : "+point+"원");
     }
     else if(com == 2){
      System.out.println("computer : 가위, you : 보자기");
      point = point - money;
      System.out.println("You Lose!!! 잔액 : "+point+"원");
     }
     else{
      System.out.println("computer : 보자기, you : 보자기");
      System.out.println("비겼다!! 잔액 : "+point+"원");
     }
    } //if end


   System.out.println("\n\n");
   if(point <= 0) {System.out.print("포인트 부족. 게임이 종료되었습니다."); break; }
    

  } //while end
  
 }
} //class end

import java.util.Random;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;

class Lotto{

 int lotto[] = new int[6];

 public void init(){
  Random rd = new Random();  //클래스 생성

  for(int i=0; i<6; i++){
  lotto[i] = rd.nextInt(45)+1;  //1~45까지의 난수 발생
   for(int j=0; j<i; j++){
    if(lotto[i] == lotto[j]){  //중복되는 수가 나오면 다시 돌리기
     i--; break;
    }//if
   }//for j
  } //for i

 } //init

 public void sort(){  //생성된 6개의 수 오름차순 정렬
  for(int i=0; i<6; i++){
   for(int j=0; j<i; j++){
    if(lotto[j] >lotto[i]){
     int temp = lotto[i];
     lotto[i] = lotto[j];
     lotto[j] = temp;
    } //if
   } //for j
  } //for i
 } // sort

 public void disp(){
  for(int i=0; i<6; i++){
   System.out.print(lotto[i]+"\t");
  }//for i
 }//disp

 public static void main(String[] args) throws IOException {

  Lotto lt = new Lotto();
  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

  System.out.print("몇장사시겠습니까? : ");
  int su = Integer.parseInt(br.readLine());
  System.out.println();

  for(int i=0; i<su; i++){
   lt.init();
   lt.sort();
   lt.disp();
   System.out.println();
  }

 }
}

this
 - 생략가능
 - 자기자신 클래스의 정보(reference-참조값)를 갖고 있다.

this()
 - Overload 된 다른 생성자를 호출할 때
 - 생성자에서 반드시 첫줄에 써야 한다.

math.random을 사용하면  0 < 난수 <1 의 랜덤값이 발생한다.

class Nansu {
 public static void main(String[] args) {
  double a = Math.random();
  System.out.println(a);
 }
}

이것은 많은 랜덤값을 얻는데 사용한다.
예를 들어 로또의 수를 얻는다 하면 1부터 45까지의 수가 나와야 한다.
class Nansu {
 public static void main(String[] args) {
  int a = (int)(Math.random()*45)+1;  //난수에 45를 곱해주면  값 >0 and 값<44 이 나온다. +1를 해주면 1~45값이 출력
  System.out.println(a);
 }
}

중요한것은 난수는 소수값으로 나왔는데 지금과 같은 경우 정수로 변하기 때문에 형변환에 신경써야 한다.

이와 같은 방식으로 가위바위보게임도 만들 수 있다.
1~3까지의 난수를 발생시켜 각각 1이 나올경우 바위, 2가 나올경우 가위, 3이 나올경우 보로 하여
if문으로 돌려 주면된다.

String 클래스에서 substring(), toLowerCase(), concat(), trim() 등의 메소드를 생각하면 String 클래스는 
변경 가능한 클래스처럼 보인다. 그러나, 실제로는 이러한 메소드들은 원래 객체와 다른 새로운 String 객체를 
만들어 반환한다. 또 하나의 String 객체가 생성되는 것이다. 따라서 원래 String 객체는 가지고 있는 문자열이 
변경되지 않으며 여전히 사용가능한 채로 남는다.

StringBuffer 클래스는 가지고 있는 문자열의 내용을 변경 가능하도록 만든 클래스이다. 
즉, append(), insert(), delete() 등의 메소드를 통하여 StringBuffer 객체가 가지고 있는 문자열을 변경할 
수 있으며, 이 때, String 클래스처럼 새로운 객체를 생성하지 않고, 기존의 문자열을 변경한다. 이 경우 객체 
생성을 하지 않으므로, String 클래스보다 효율적이라고 생각하기 쉽지만, 동기화(synchronization)를 보장해야 
하기 때문에 단순한 참조에서는 상대적으로 String 보다 나쁜 성능을 보인다. 따라서, 단순 참조가 많은 경우 
StringBuffer 클래스보다 String 클래스가 유리하다. 물론, StringBuffer 클래스는 동기화되어 있으므로, 
멀티 쓰레드에 대하여 안전하다.

split과 StringTokenizer는 둘다 입력되어진 입력값을 일정한 규칙값을 통해 나누는데 사용된다

split의 경우 값이 비어져 있으면 null값으로 인식해 빈값으로 출력되는 반면
StringTokenizer는 값이 비어져 있으면 공간할당을 없이 출력된다.

    예 : "일,이,,삼"으로 입력했을때 ","이 문자를 규칙으로 나눈다고 하면
          split의 경우 [일] [이] [ ] [삼]으로 출력되고
          StringTokenizer의 경우  [일] [이] [삼]으로 출력된다.


import java.util.StringTokenizer;

class StringToken{
 public static void main(String[] args){
  String a = "대전-대구--부산";
  StringTokenizer  b = new StringTokenizer(a, "-");
  for (int i=1; b.hasMoreTokens(); i++){
   System.out.println(i+". "+b.nextToken());
  }
  System.out.println();
  String []c = a.split("-");
  for(int i=0; i<c.length; i++){
   System.out.println((i+1)+". "+c[i]);
  }
 }
}

출력결과


싱글턴의 특징은 특정 클래스의 인스턴스는 오직 하나임을 보장하고, 이 인스턴스에 전역적인 접근성을 제공한다.
싱글턴은 특정 클래스를 전역변수처럼 사용할수 있게하며, 전역변수의 개선책이다. 싱글턴은 전역변수의 여러가지
문제를 해결한다.그러나 반대로 싱글턴은 전역변수가 가지는 문제점 또한 상속하고 있다.
'편리함'을 위해 싱글턴을 쓰다 오히려 로직을 무너뜨릴 수 있으며 이는 특히 멀티쓰레드에서는 디버깅을 난해하게
만드는 요소가 될 수 있다.싱글턴은 내부가 아닌 외부에서 직접 생성에 관련한 기능을 제공한다.
싱글턴 패턴의 경우 인스턴스가 클래스 내부에 선언되어 있고 static 즉 정적 변수보통 클래스의 인스턴스 생성은
생성자에서 하는데 싱글톤의 특성상 유일한 객체를 생성하기에 클래스 내부에 선언을 하여 관리를 용이하다.

+ Recent posts