21.11.09(화)
수업때 박터지는 날이였다. 모르는 내용들이 뇌에 끊임없이 주입되어 과부화가 발생했다.. 그리고 어제 했던 홀짝게임의 피드백으로 (1. 메소드가 너무 많은것 2. 변수명, 메소드명의 대문자가 잘못 표기되어 있는것) 2가지를 받았는데 아직 1번 사항은 고치지 못하였다. 2번만 개선한 코드를 우선 하기에 적어 놓고 오늘 수업때 새롭게 배운내용과 궁금한 내용들을 정리하도록 하겠다.(++클래스도 나눠봤다.)
package D3;
public class OddOrEven {
public static void main(String[] args) {
Play play = new Play();
play.inputData();
}
}
package D3;
import java.util.Scanner;
import static java.lang.Math.min;
import static java.lang.Math.pow;
public class Play {
private Scanner sc = inputPlayerName();
private int playerCapital = 100;
private int computerCapital = 120;
private int stageCount = 1;
public int inputData() {
int computerRandomNum = selectComputerRandomNum();
String playerInputOddEven = inputOddEven(sc, "홀,짝을 입력해주세요.");
int betMoney = checkBetMoney(sc, playerCapital, computerCapital);
String computerOddEven = checkOddEven(computerRandomNum);
if (playerInputOddEven.equals(computerOddEven)) {
computerCapital = computerLose(computerCapital, betMoney, "현재 상대방의 잔액은 ");
playerCapital = playerWin(playerCapital, betMoney, "현재 나의 잔액은 ");
} else {
playerCapital = playerLose(playerCapital, betMoney);
computerCapital = computerWin(computerCapital, betMoney, "현재 상대방의 잔액은 ");
}
if (stageCount == 8 && computerCapital == 0) {
playerWin(playerCapital, stageCount);
} else if (computerCapital == 0) {
stageCount++;
computerCapital = nextLevel(playerCapital, stageCount);
return inputData();
} else if (playerCapital == 0) {
playerlose(playerCapital, stageCount);
} else {
return inputData();
}
return playerCapital;
}
private static Scanner inputPlayerName() {
Scanner sc = new Scanner(System.in);
String playerName = inputOddEven(sc, "플레이어의 이름을 입력해주세요.");
System.out.println("플레이어의 이름은 " + playerName + " 입니다.");
return sc;
}
private static int selectComputerRandomNum() {
int computerRandomNum;
computerRandomNum = (int) (Math.random() * 20) + 1;
return computerRandomNum;
}
private static String inputOddEven(Scanner sc, String s) {
System.out.println(s);
return sc.next();
}
private static int checkBetMoney(Scanner sc, int playerCapital, int computerCapital) {
int validBetMoney = getInputBetMoney(sc);
while (validBetMoney != 0) {
if (validBetMoney > min(playerCapital, computerCapital)) {
System.out.println("베팅 금액을 초과하였습니다." + "\n" + min(playerCapital, computerCapital) + " " + "이하로 입력해주세요.");
validBetMoney = getInputBetMoney(sc);
} else {
break;
}
}
return validBetMoney;
}
private static int getInputBetMoney(Scanner sc) {
System.out.println("베팅 금액을 입력해주세요.");
int inputBetMoney = sc.nextInt();
return inputBetMoney;
}
private static String checkOddEven(int n) {
String computerOddEven;
if (n % 2 == 0) {
computerOddEven = "짝";
} else {
computerOddEven = "홀";
}
return computerOddEven;
}
private static int computerLose(int computerCapital, int betMoney, String s) {
computerCapital -= betMoney;
System.out.println(s + computerCapital + "입니다.");
return computerCapital;
}
private static int playerWin(int playerCapital, int betMoney, String s) {
playerCapital += betMoney;
System.out.println(s + playerCapital + "입니다.");
return playerCapital;
}
private static int computerWin(int computerCaptial, int betMoney, String s) {
computerCaptial = playerWin(computerCaptial, betMoney, s);
return computerCaptial;
}
private static int playerLose(int playerCaptial, int betMoney) {
playerCaptial = computerLose(playerCaptial, betMoney, "현재 나의 잔액은 ");
return playerCaptial;
}
private static void playerWin(int playerCapital, int i) {
System.out.println("WIN!!");
System.out.println("당신의 소지금은 " + playerCapital + " 이며, 총 " + i + "라운드 진행되었습니다.");
}
private static int nextLevel(int playerCapital, int roundCount) {
int computerCapital;
computerCapital = (int) (playerCapital * pow(1.2, roundCount));
System.out.println(roundCount + "라운드" + ">>" + "새로운 상대가 등장합니다.");
return computerCapital;
}
private static void playerlose(int playerCaptial, int roundCount) {
System.out.println("당신의 소지금은 " + playerCaptial + " 이며, 총 " + roundCount + "라운드 진행되었습니다.");
System.out.println(" - Game Over - ");
}
}
- 커밋을 의미있게 쓰자 (메소드 한 기능 구현당, 최대한 제목에서 다 알 수 있도록 참고:udacity 커밋 가이드)
- 예약어에 대해 생각해보자 (예약어로 될만한 단어로 선언하지 않기)
- 커밋 전, 코드 리포맷은 필수다. (커밋 시 형식은 '한줄요약 제목 / <한줄띄기> / 상세내용' 순으로 추천)
- 메소드가 많아지면 클래스로 분리하기.
- 코테 준비는 '알고리즘 문제해결 전략' 책을 추천.
- 클래스 이름 첫글자는 꼭 대문자로.
- 구현전에 주석으로 단계별로 정리해보기 -> 그다음에 메소드명 정리해보기
- 메소드는 매개변수와 리턴값으로 통신한다.
- 반복문은 CPU의 빠른 작업속도를 활용하고 코드의 간결화를 위해 사용한다.
- 조건문은 일종의 필터로 검증작업에 활용된다.
- Return의 2가지 의미 (1. 메소드를 종료한다. / 2. 호출한 쪽으로 값을 반환한다.)
- Return을 쓰는 이유 : 메소드간의 통신 즉, 상호작용을 위해서
- 메소드는 한번에 한 가지 일을 하고 메소드가 모여 프로그램을 완성함.
- 객체는 무조건 클래스에서 만들어지는게 아니다.(자바에서만 그럼)
- 행동은 상태를 항상 변화시키고, 행동은 다른 객체의 상태를 변화시킨다.
- 클래스를 잘 쪼개서 만드는것 -> 객체지향 프로그래밍 또는 설계라고 한다.
- 객체지향 프로그램은 아주 커다란 프로그램 만들기에 용이하고, 유지보수에 좋다.
- 그럼 함수형은 왜 요새 많이 쓰나?(인터넷의 발달과 빅데이터 시대가 오면서 연산속도가 중요해짐)
- 메소드 만들때 무조건 기본은 'private'이다.
- 2차원 배열이란?
- this. 가 뭐지?(객체 생성시 this.x에서 x를 참조하도록 함)
- 메소드 선언할때 final이 뭐지?
- getter와 setter는 뭐지?
- 향상된 for문이란 무엇이지?
- 메소드 영역, JVM 메모리란?
- 런타임 이셉션으로 인해 throw를 씀 <- 이게 무슨소리지?
- hasnext가 뭐지?
- Call By Value와 Call By Reference의 핵심이란?
- 어떤 함수를 호출하는 과정에서 인자(Argument)를 함수의 매개변수(Parameter)에 넘기게 되는 과정에서 어떤 방식으로 넘기느냐를 설명하는 문장
- Call by Value : argument를 복제하여, Parameter에 대입함
- Call by Reference : Parameter가 원본 argumnet를 직접 참조함. 따라서 함수의 작업과정에서 parameter의 변화는 argument에 영향을 미친다.
- Argument와 Parameter의 차이는?
문법으로 표기하기
1) 타입[][] 배열이름;
2) 타입 배열이름[][];
3) 타입[] 배열이름[];
그림으로 도식화한 2차원 배열
예제1(배열 선언과 동시에 초기화 하는 방법)
int[][] arr = {
{10, 20, 30},
{40, 50, 60}
}
실행결과
10 20 30
40 50 60
예제2(가변배열 : 행마다 다른 길이의 배열을 요소로 저장할 수 있다.)
int[][] arr = {
{10, 20},
{30, 40, 50},
{60, 70}
}
실행결과
10 20
30 40 50
60 70