국비학원/수업기록

국비 지원 개발자 과정_Day7

루팽 2022. 12. 6. 22:14

버전 x.y.z

x-큰 업데이트(엔진바꿈, 하위버전 호환안됨)

y-마이너스업그레이드(기능추가'변경)

z-안정화(버그수정)

 

단위테스트(test패키지)

package dev_java.week2;

//단위테스트1
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.Random;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.RepeatedTest;
import org.junit.jupiter.api.Test;

public class RepeatedTest1 {
  @Test // 해당메소드가 테스트 메소드임을 나타냄
  @DisplayName("파라미터 두 값 비교 테스트")
  void methodB() {
    assertEquals(2, 1 + 1);
  }

  @RepeatedTest(5) // 반복된 테스트를 하기위해 사용되는 어노테이션
  void methodA() {
    Random r = new Random();
    int i = r.nextInt(10);
    System.out.println(i);
  }
}

 

package dev_java.week2;

//단위테스트2
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;

@DisplayName("파라미터 테스트 활용")
public class ParameterTest1 {
  @ParameterizedTest // 파라미터를 테스트해주는 어노테이션
  @ValueSource(ints = { 3, 7 })
  @DisplayName("ValueSource를 통해서 매개변수 지정가능")
  void isPositive(int number) {
    assertTrue(number > 0);
  }
}

 

자바는 같은 이름의 메소드를 정의할 수 있다

단 파라미터의 개수 혹은 타입이 달라야 한다

 

생성자

메소드와 다른 점은 반환 타입이 없다(void도 안됨)

같은 이름의 생성자라도 파라미터의 개수가 다르거나 타입이 다르면 중복해서 선언할 수 있다

전역 변수의 초기화를 담당한다

디폴트 생성자(파라미터가 하나도 없는 생성자)는 생략할 수 있다.(JVM이 자동 생생해준다)

생성자의 파라미터를 통해서 클래스의 관계를 설정할 수 있다.

사용자로부터 입력받는 장치를 생성자의 파라미터에 적어준다.

 

switch문 case에 {}를 붙여주면 메소드’생성자단위가 아니라 하더라도 변수 사용 가능(지역변수)

package dev_java.ch02;

public class Switch1 {
  public static void main(String[] args) {
    String bread = "도우넛";

    switch (bread) {
      case "소보로": { // switch값으로 int뿐만 아니라 String타입도 가능
        int protocol = 100; // 중괄호 안에서 지역변수처럼 사용 가능
        System.out.println("소보로빵 입니다." + protocol);
        break;
      }
      case "도우넛": {
        int protocol = 200;
        System.out.printf("%s빵 입니다. %d %n", bread, protocol);
        break;
      }
      default:
        System.out.println("원하는 빵이 없습니다.");
        break;
    }
  } // end of switch
}

  // 도우넛빵 입니다. 200

 

package dev_java.ch02;

import java.util.Random;
import java.util.Scanner;

// 문제5: 0부터 9사이의 임의의 수를 채번하고 그 숫자를 맞추는 게임을 구현하시오
// 힌트는 낮춰라, 높여라, 맞으면 축하합니다, 기회는 5번
public class Nansu1 {
  public static void main(String[] args) {
    // 랜덤하게 채번하는 메소드를 제공하는 클래스 선언 및 생성하기
    Random random = new Random(); // new 다음에 오는 이름의 객체가 로딩 -> 생성자 호출도 일어남

    // 참조형의 선언문(클래스 선언, 초기화x)은 생성자를 호출하지 않는다 -> = new 클래스이름();이 있을때만 생성자가 호출됨
    // scanner클래스를 사용하면 입력장치로 입력된 정보를 받아올 수 있다(듣기)
    // 생성자의 파라미터에 입력장치에 대한 코드가 필요함
    // System -> 내가 사용하는 컴퓨터의 장치
    // 그 뒤에 변수 in을 붙이면 입력 장치를 나타냄
    // 사용자로부터 입력받는 장치를 생성자의 파라미터에 적어준다.
    Scanner scanner = new Scanner(System.in);

    // nextInt메소드는 Scanner클래스가 소유주이다.(Scanner에 속해있는 메소드이다)
    int com = random.nextInt(10); // 0~9(10미만)
    System.out.println("정답은 ==> " + com);

    // 회차를 카운트하는 변수 선언
    int count = 1;
    boolean isOk = true;

    // 사용자에게 입력받아야하는 유효한 값의 범위를 출력하기
    System.out.println("0부터 9사이의 정수를 입력하세요.");

    while (isOk) {
      // Scanner클래스가 소유한 nextInt 메소드 호출하기
      // nextInt의 반환타입은 int
      int user = scanner.nextInt();

      if (user == 10) {
        System.out.println("게임을 종료합니다.");
        scanner.close();
        System.exit(0);
        // 사용자가 입력한 값과 컴퓨터가 채번한 값이 같은가?
      } else if (count == 5) {
        System.out.println("시도 횟수 초과로 게임을 종료합니다.");
        System.exit(0); // 파라미터에 0을 주면 JVM과의 연결고리가 끊긴다(종료, 할당 스레드 반환)
        isOk = false;
      } else if (user == com) { // 변수가 가리키는 값이 같은지를 비교(원시형 변수, 직접접근방식)
        System.out.println("축하합니다! 정답은 " + com + "입니다!");
        scanner.close(); // 사용한 Scanner의 주소번지는 반드시 닫아준다.(위변조를 막기 위해서)
        break;
      } else if (user < com) { // 정답이 입력값보다 클 때
        System.out.println("더 높은 값입니다. 남은 시도 횟수: " + (5 - count));
        count++;
      } else if (user > com) {
        System.out.println("더 낮은 값입니다. 남은 시도 횟수: " + (5 - count));
        count++;
      }
    }
    scanner.close();
  }
}

 

배열

배열은 같은 타입만 담을 수 있다

배열을 선언하면 참조형 변수가 생성됨(객체같이 주소 번지를 가짐)

배열을 선언한다고 해서 값을 저장하는 공간이 생기진 않는다

new로 배열을 생성해야 실제 저장공간을 생성한다

index(위치, 순번)의 범위는 0부터 n-1까지이다.

길이가 3이라면 index는 0, 1, 2 → 주소 번지는 229540, 229544, 229548와 같이 4씩 늘어남

int[] com = new int[3]; // 3칸짜리 int 배열생성
com[0] = 10; // 0번 index를 10으로 초기화

 

도트 연산자 . (멤버참조연산자)

해당 변수나 메소드에 접근할 때 사용

객체참조(인스턴스명).멤버명(변수, 메소드) // 인스턴스가 어떤 행동을 할지 알려줌

 

개선된 for문

일반 for문과 다르게 반복에 배열을 이용

배열의 길이로 반복 횟수가 결정됨

//기본 for문
for(int i = 0; i<10; i++) { //초기값; 조건식; 증감식
}

//개선된 for문
for(int i : arr) { //자료형 변수명(배열의 타입) : 배열명(배열의 주소번지)
}

 

package dev_java.ch02;

public class DeptList {
  // int[] deptnos; // 배열 선언, 이대로 쓰면 NullPointerException 발생
  // deptnos=new int[3]; // 배열 생성
  // int[] deptnos = new int[3]; //배열 선언과 생성
  // int[] deptnos = new int[] { 0, 0, 1 }; // 배열 선언, 생성, 초기화
  // int[] deptnos = {0, 0, 0}; //배열을 생성할 때 new예약어를 쓰지 않을수도 있다.
  int[] deptnos = new int[3];

  void methodA() {
    int com = (int) (Math.random() * 10);
    // com = (int) (Math.random()); // 항상 0(기본 double타입에 0.0~0.9 사이의 수를 int로 형변환)
    double com2 = Math.random() * 10;
    System.out.println(com + ", " + com2);

    for (int i = 0; i < 3; i++) { // 기본 for문
      deptnos[i] = com;
      System.out.println(deptnos[i]);
    }
    System.out.println();

    for (int i : deptnos) { // 개선된 for문
      System.out.println(i);
    }
  }

  public static void main(String[] args) {
    DeptList deptList = new DeptList();
    deptList.methodA();
  }
}

 

package dev_java.ch02;

public class Dowhile {
  public static void main(String[] args) {
    int i = 1;
    // while문은 조건을 수렴하지 않으면 단 한번도 실행 기회가 없다.
    while (i > 3) { // 1>3 -> false(while은 조건을 먼저 따진다.)
      System.out.println("while실행문 출력");
    }
    System.out.println("whlie출력x");

    i = 1; // 굳이 i값을 1로 초기화한 것은 동일한 조건에서 테스트하기 위함임
    do { // do-while은 조건을 나중에 따진다(무조건 한 번은 실행됨)
      System.out.println("do-while실행문 출력");
    } while (i > 3);
  }
}

// whlie출력x
// do-while실행문 출력

 

package dev_java.ch02;

public class Suffle {
  public static void main(String[] args) {
    // i와 j의 값을 서로 바꾸기
    int i = 3;
    int j = 5;
    int temp = 0;

    temp = i; // 3
    i = j; // 5
    j = temp; // 3

    System.out.println("i: " + i + ", j: " + j);
  }
}

// i: 5, j: 3

 

package dev_java.ch02;

// 피보나치 수열의 규칙을 만족하는 프로그램을 작성하고
// a1에서 a10번째 항까지 출력되도록 해보시오.
public class Fibonacci {
  int i = 0;
  int j = 1;
  int sum = 1;

  void methodA() { // 내가 만든 코드
    for (int count = 1; count <= 10; count++) {
      System.out.println("a" + (count) + ": " + sum);

      sum = i + j;
      i = j;
      j = sum;
    }
  }

  void methodB() {
    int a1 = 1;
    int a2 = 1;
    int a3 = 0;
    System.out.print(a1 + " " + a2 + " ");
    
    for (int i = 0; i < 8; i++) {
      a3 = a2 + a1;
      System.out.print(a3 + " ");
      a1 = a2;// 두번째 수를 세번째수로
      a2 = a3;// 현재의 수를 첫번째수로
    }
  }

  public static void main(String[] args) {
    Fibonacci f = new Fibonacci();
    f.methodA();
    f.methodB();
  }
}

 

package dev_java.ch02;

import java.util.Scanner;

//숫자야구게임 만들기
public class NansuMaker {
  Scanner scanner = new Scanner(System.in);
  // 만약 여기서 채번한 값을 다른 클래스에서 재사용해야한다면
  // 멤버변수(전역변수)로 결정한다.
  int com[] = new int[3]; // 컴퓨터가 채번한 숫자
  int my[] = new int[3]; // 사용자가 입력한 숫자
  int count; // 게임 시도 횟수

  // 중복되는 숫자 없이 랜덤한 세자리 수를 생성하는 메소드
  public void ranCom() {
    com[0] = (int) (Math.random() * 10);
    do {
      com[1] = (int) (Math.random() * 10);
    } while (com[0] == com[1]);
    do {
      com[2] = (int) (Math.random() * 10);
    } while (com[0] == com[2] || com[1] == com[2]);
  }

  // 유저의 입력값을 my[]에 int로 입력하는 메소드
  public void userInput() {
    System.out.println("중복되지 않는 세자리 수를 입력해주세요.");
    int user_input = scanner.nextInt();
    my[0] = user_input / 100;
    my[1] = user_input % 100 / 10;
    my[2] = user_input % 10;
  }

  // my[]와 com[]을 비교해 strike, ball, count를 출력하는 메소드
  public void baseballGame() {
    userInput();
    int strike = 0;
    int ball = 0;

    for (int i = 0; i < my.length; i++) {
      for (int j = 0; j < com.length; j++) {
        if (my[i] == com[j]) {
          if (i == j) {
            strike++;
          } else {
            ball++;
          }
        }
      }
    }
    count++;
    System.out.println(strike + "스트라이크, " + ball + "볼 - 남은 시도 횟수: " + (5 - count));

    if (strike == my.length) {
      System.out.println("축하합니다! 정답은 " + com[0] + com[1] + com[2] + "입니다.");
      System.exit(0);
    } else if (count == 5) {
      System.out.println("시도 횟수 초과로 게임을 종료합니다.");
      System.exit(0);
    } else {
      baseballGame();
    }
  }

  public static void main(String[] args) {
    NansuMaker nansuMaker = new NansuMaker();
    nansuMaker.ranCom();
    System.out.println("ranCom값: " + nansuMaker.com[0] + nansuMaker.com[1] + nansuMaker.com[2]);
    nansuMaker.baseballGame();
  }
}

 

게임창 만들어보기(기능x)

package dev_java.ch02;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.GridLayout;;

public class RandomGameView {
  // 선언부
  JFrame jf_game = new JFrame();
  JPanel jp_east = new JPanel();
  JButton jbtn_new = new JButton("새 게임");
  JButton jbtn_dap = new JButton("정답");
  JButton jbtn_clear = new JButton("지우기");
  JButton jbtn_exit = new JButton("종료");

  // 생성자-파라미터가 없는 생성자를 디폴트 생성자라함(생략 가능)
  public RandomGameView() { // 그러나 화면을 그리는 메소드를 호출하기위해 굳이 선언하였음
    initDisplay(); // 내 안에 있는 메소드이므로 인스턴스화 없이도 가능하다.
  }

  // 화면그리기 구현
  public void initDisplay() {
    // 동쪽에 붙일 속지의 레이아웃을 설정함
    // 메소드의 파라미터로 객체를 생성함-딱 한 번만 호출하니까(재사용x)
    // GridLayout layout = new GridLayout(4,1); //26,27번 코드를 한줄로쓰면 28번
    // jp_east.setLayout(layout);
    jp_east.setLayout(new GridLayout(4, 1)); // 메소드 호출시 파라미터로 객체생성구문 가능함
    jp_east.add(jbtn_new);
    jp_east.add(jbtn_dap);
    jp_east.add(jbtn_clear);
    jp_east.add(jbtn_exit);
    jf_game.add("East", jp_east);
    jf_game.setSize(450, 400);
    jf_game.setVisible(true);
  }

  // 메인 메소드
  public static void main(String[] args) {
    // 생성자 호출하기-디폴트 생성자가 호출됨
    new RandomGameView();
  }
}