본문 바로가기
학원수업/12월

12/07 국비학원 자바수업 8회차(배열, JUnit, 야구숫자게임)

by 코딩마스터^^ 2022. 12. 7.

배열

선언부에 선언할때 선언부에는 크기값을 적지않는다

 

배열에서 일부만 예외처리할 수 있다.

예외처리의 기본 꼴이

}catch(  ){

}

try{//예외가 발생할 가능성이 있는 코드를 감싼다. try-catch로
      //문법에러는  Exception과는 상관이 없다.-런타임 에러
    System.out.println(i[3]);
    }catch(ArrayIndexOutOfBoundsException e){
      System.out.println("인덱스가 범위를 넘었다.");
    }

에러는 두가지

1. 런타입 에러

Compile시에 발견하지 못하는 에러를 Runtime에러라고 한다.

이때는 프로그래머가 예측하여 처리해주어야한다.

그리고 그런 예외가 발생했을때 어떤 동작을 처리해야하는지를 우리는 예외 처리라고 한다.

 

//이른 주입인가 아니면 게으른 주입인가?
인스턴스화를 미리 하는건지 나중에 하는건지
package dev_java.ch03;

public class Arrary1 extends Object{ //상속-extends Object 생략 가능. 재사용, 확장, 오버라이딩... 재정의 해서 쓴다.

  public static void main(String[] args) {
    //선언과 생성을 나눠서 할 수 있다.
    //이른 주입인가 아니면 게으른 주입인가?
    //게으른 인스턴스화는 선언과 생성을 분리함
    //이른 인스턴스 화는 선언부에 선언과 생성을 한번에 하는 것이다. 한문장으로
    int i[];
    //int j[3]=new int[3]
    i=new int[3];
    //초기화가 안됐다. 아직  0 0 0(디폴트값)
    //객체배열 null.null,null
  }
  
}

 

향상된 for문

개선된 for문

배열을 사용하여 반복시킬 때 조금 더 편리한 방법

배열의 전부를 다 뽑을때 쓴다.

for( 자료형 변수 : 배열 ) { //배열의 값이 있으면 자료형 변수로 값을 보내주고
    반복 실행할 문장; // 실행문 
}//값이 없으면 종료

for(타입 : 주소번지)

while(d.length)

length 길이를 알려주는 메소드

Object

자바의 모든 클래스는 부모 클래스로부터 상속

"Object" 클래스를 부모클래스로 상속 받아서 사용 하게 됩니다.

 

"toString"

메서드는 객체가 가지고 있는 정보나 값들을 문자열로 만들어 리턴하는 메소드 입니다.

 

변수장애

변수는 한번에 하나의 값만 담을 수 있다.

 

int i[]={1,2,3};

    int j[];

    j=i;

두개의 주소번지가 하나의 배열을 가리키고있다

 

    int i[]={1,2,3};
    int j[];
    j=i;
    int k[];
    k=new int[3];//새롭게 생성
    //insert here
    j=k;//왜 에러인가? 에러가 발생하지 않도록 11번 라인에 코드를 추가하라.

[0, 0, 0]

 

예외처리

try-catch-finally

오류를 따로 빼내고 싶을 때 쓴다.

 

 

 

 

Junit 사용해서 테스트 하기-

디버그 있는지 미리 체크

@어노테이션을 활용

임포트 자동으로 된다.

이해안감.... 다시보기!

package dev_java.week2;

import static org.junit.jupiter.api.Assertions.assertTrue;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

public class NumberVaildCheck {
  @DisplayName("입력받은 값 유효성 체크하기")
  @ParameterizedTest
  @ValueSource(strings={"151","150","360"})//파라미터를 쓸때 input 사용

  void 너정수니 (String input){
    assertTrue(isNumber(input));//맞는지 틀린지 보는것
    assertTrue( 자리수체크 (input));
  }
  public static boolean 자리수체크(String s){
    boolean isOk=false;
    if(s.length()==3){
      isOk=true;
      return isOk;
    }else{
      return isOk;
    }
  }

  public static boolean isNumber(String s){
  try{
    Double.parseDouble(s); //문자를 더블로 바꾸는것=parseDouble
    return true;
    }catch(NumberFormatException e){//에러의 종류
    return false;
    }
  }
}

야구숫자게임1-1

package dev_java.ch03;

import java.util.Scanner;

public class Nansu1_2 {// 야구게임 확장예정
  int com = -1;// 사용자가 값 넣는 동안에는 바뀌면 안되니까 전역변수
  // int my=-1; no필요 값이 바뀌니까 지변으로

  public void ranCom() {
    com = (int) (Math.random() * 10); // 10을 곱하면 0~9사이의 숫자를 선택할수있다.
  }

  // user변수 때문에 변수 my를 삭제하였다.
  // 사용자가 입력한 값을 지변에 담아야 하는 이유에 대해 설명하시오.
  // 또 com변수는 왜 전역변수 이어야만 하는것인가?
  public String account(int user) {
    String msg = null;
    // 정답보다 입력한 값이 작니?
    if (com > user) {
      msg = "높여라";
    } else if (com < user) {
      msg = "낮춰라";
    } else if (com == user) {
      msg = "정답";
      // return msg; // if문에서 해당 메소드를 탈출할때 return예약어 사용가능하다.
      // 반복문에서는 break;사용한다
    }
    return msg;
  }

  public static void main(String[] args) {
    //실행하자마자 채번하도록 코딩하시오--->생성자를 활용
    //생성자역할-전변 초기화, 부모클래스 초기화 포함-상속
    Nansu1_2 nansu1_2 = new Nansu1_2();
    //컴퓨터가 채번한 값을 초기화 하는 메소드 호출하기
    nansu1_2.ranCom();//새게임을 누르면 -재사용성, 정답을 봤니?
    

    //컴터가 채번한 숫자를 출력하시오
    System.out.println("컴퓨터가 채번한 숫자는 =====>"+nansu1_2.com);//전변이다. 그러니까 인스턴스 변수. 유지
    //Scanner를 활용하여 사용자가 입력한 값을 받으시오.
    Scanner s =new Scanner(System.in);//장치로부터 듣기-소통-매번새로받아옴-반복문 안에 올것
    int i= 1;// 회차를 표시하는 변수선언. 사람마다 횟수 다름. 동시에 플레이할수있잖아. 스태틱으로 하면 안됨.
    String 입력값=null;
    String 반환값=null;
    //게임기회는 5회로 제한하시오
    while(i<4){//주의사항-무한루프 방지 코드- break;
      System.out.println("0부터 9까지 입력하시오.");
      입력값=s.nextLine();//사용자가 입력한 값 받아오기. 사용자에게 보이면 안된다. 스캐너 클래스의 넥스트메소드
      System.out.println(입력값);//null이 아닌지 확인 해 본다.
      //알면서도 잡지 못하는 Exception-> NumberFormatException
      int user=Integer.parseInt(입력값);//NumberFormatException
      반환값 = nansu1_2.account(user);
      i++;
      if("정답".equals(반환값)){//만약 정답이랑 같으면 이퀄 앞에 스트링이 온다
        //정답을 반환했을경우 축하합니다. 라고 말한뒤
        //새 게임 진행 여부를 물어보시오.--> 초기화해야된다.
        System.out.println("축하합니다.");
        // System.out.println("다시 게임을 시작하시겠습니까?y/n");
        // String yes=s.nextLine();
        // if(yes.equals("y")){
        //   i=1;//1회차부터 다시 시작.
        // } else if(!yes.equals("y")){

        // }
        i=4;//정답을 맞추고 다시 4로 초기화시켰다.
        //break;/////while문에서 제일 중요!!!!!if조건을 만족하면은 깨고 나오게 만든다.
      }
      //시도할때마다 몇 번째 기회를 사용하는지 출력하시오.
      System.out.println(user+":"+반환값);
      // i++;
      //주어진 기회를 모두 사용했습니다.
      if(i==4){
        System.out.println("주어진 기회를 모두 사용 또는 정답을 맞추었습니다.\n 새게임을 시작하려면 Y/N을 입력하세요.");
        String choice= s.nextLine();
        if("Y".equals(s.nextLine())){
          //새게임시작 새로 채번
          nansu1_2.ranCom();
          System.out.println("새게임을 시작합니다.==>정답:"+nansu1_2.com);
          i=1;
        }else if("N".equals(s.nextLine())){
          System.out.println("종료합니다.");
          System.exit(0);//break 대신에 노 했을때 끄도록 만듦
        }

      }

    }//////end of while
    s.close();//Stream,I/O,network, 사용 후 반드시 닫는다.
    //시도 할 때 마다 몇 번째 기회를 사용하는지 출력하시오

    //정답을 맞췄을경우 축하합니다. 라고 말한뒤 

    //새게임 진행 여부를 물어보시오.
    
  }

}

꼼꼼히 분석하기

HintPart1

배열을 이용한 야구게임

package dev_java.pattern;

public class HintPart1 {
  //선언부
  //컴터가 채번한 숫자를 담을 1차배열 선언
  int com[] = new int[3];
  //사용자가 입력한 문자열 쪼개서 담을 1차배열 선언
  int my[] = new int[3];
  //회차를 담을 변수 선언
  int cnt = 0;
  //새 게임 버튼을 누르면 3자리의 서로 다른 숫자를 채번한다
  public void ranCom(){
    com[0] = (int)(Math.random()*10);
    //중복된 숫자를 제거하는 목적으로 do..while선택함
    do{
      com[1] = (int)(Math.random()*10);
    }while(com[0] == com[1]);
    do{
      com[1] = (int)(Math.random()*10);
    }while(com[0] == com[2] || com[1] == com[2]);
  }

  //3자리 숫자를 입력 받아서 힌트문을 작성해주는 메소드 구현
  public String account(String user){
    if(user.length() !=3){
      return "세자리 숫자만 입력하세요.";//account메소드 탈출하기
    }
    int imsi = 0;//파라미터로 넘어온 사용자가 입력한 문자열 값을 정수형으로 변환 담기
    int strike = 0;
    int ball = 0;
    try {
      imsi = Integer.parseInt(user);
    } catch (NumberFormatException e) {
      return "숫자만 입력하세요.";
    }
    my[0] = imsi/100;// 256/100 -> 2.56 int/int -> 2만 남음
    my[1] = (imsi%100)/10; //256%100 -> 56/10 -> 5.6 -> 5남음
    my[2] = imsi%10;//256%10 -> 몫은 25이고 나머지는 6이다
    for(int i=0;i<com.length;i++){//입력받은 숫자가 com배열에 존재하니? 네-볼 , 아니오-제외
      for(int j=0;j<com.length;j++){//만일 위에서 네 라면 스트라잌인지를 검사한다 com 배열의 i자리와 my배열의 j 자리가 같니
        //숫자가 있어?
        if(com[i] == my[j]){//같은 숫자가 있는지만 비교하고 자리가 달라도 참이다.
          //볼은 확보 되었다. 자리가 같은지 비교하자
          //숫자의 자리도 같아?
          if(i == j){//42번에서 비교한 숫자의 자리가 사용자가 입력받은 자리까지도 같은거야? 네-스, 노-볼
            strike ++;
          }else{
            ball++;
          }
        }//입력받은 숫자가 컴터채번한 숫자와 일치하는 경우
      }//////////end of inner for문
    }///////////end of outter for문
    //strike변수값이 3이면 55번은 실행될 기회를 못 갖는다.
    if(strike == 3) return "정답입니다.";
    return strike+"스 "+ ball +"볼";
  }////////////end of account
  public static void main(String[] args) {

  }
}

 

Final을 붙여서 정의를 하면 재정의가 안된다.

int i=5;

i=7;

이런식으로 새로 정의 안된다.

 

단축키

컨트롤+클릭 하면 변수가 가리키는것이 무엇인지 알려준다.

 

컨트롤z는 실행취소

컨트롤 y는 되돌리기

댓글