국비학원/수업기록
국비 지원 개발자 과정_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();
}
}