공부 내용 및 활동 내용 |
|
1. Java 기초 학습 (Java의 정석 : chapter 8. 예외처리 ~ chapter 9. java.lang )
|
1. 예외 처리
- 책을 읽어보았지만 정확히 어떻게 써야하고 조건을 어떻게 설정해야할 지 감이 잘 오지 않는다. 내용이 조금 어려워서 제대로 안 읽힌 것 같다. 내일 일어나서 한 번 다시 읽어보아야 할 것 같다. 정말 예외처리를 제대로 공부해놓으면 프로젝트에 많은 도움이 될 것 같지만, 아직까지 과제에서는 예외처리를 깊게하지 않아도 되서 그런지 모르겠지만 잘 머리에 들어오지 않는다.
2. Java.lang
- 실질적으로 "구현"에 있어서는 가장 도움되었던 파트였다. 각 클래스의 메소드, 변환 등을 다뤘었고, 이것을 읽어보면서 제대로 이해하지 못하고 사용한 메소드들을 다시 학습할 수 있었다. 대부분이 알고 있던 내용이지만 StringBuffer, StringBuilder, 클래스 메소드 오버라이딩 등은 처음 제대로 알게 되었다.
3.. 개인 과제 회고
오늘은 책도 안 읽히고, 기초 과제 발제가 나온겸 9시간 동안 과제를 했었던 것 같다.
스텝바이 스텝으로 진행했다
과제 분배 시간
0 ~ 2 시간: 설계를 어떻게 해야할지, 필요한 클래스들이 무엇인지
2 ~ 5 시간: lv 1 ~ lv 2 구현
5 ~ 6 시간: 버그 수정 및 약간의 리팩토링
6 ~ 8 시간: lv 3 ~ lv4 구현
8 ~ 9 시간: 버그 수정 및 코드 리팩토링
자체평가표
완성도 : ★ ★ ★ ★ ☆
만족도 : ★ ★ ☆ ☆ ☆
- 완성도
1. LV4까지 잘 구현되어 있다고 생각한다.
2. 모든 예외처리를 해놓았다고 생각한다.
- 만족도
1. 내 코드지만 잘 안 읽힌다.
2. 네이밍 컨벤션이 별로 좋지 않다.
3. git commit을 잘못한 것 같다.
-> lv1~2 한번에 commit, lv3~4 한번에 commit 두번의 커밋으로 과제 완성
-> 각 기능을 구현하고 commit을 진행해야할 것 같다..
4. 클래스를 잘못 나눈 것 같다.
- 마음에 안 드는 점
1. 코드가 선형적으로 읽히지 않는다. -> 코드 가독성이 떨어진다.
public class BaseballGame {
InputRequester inputRequester;
GameAnnouncement gameAnnouncement;
RandomNumberGenerator randomNumberGenerator;
Validator validator;
GameRecorder gameRecorder;
boolean isRunning = true;
public BaseballGame(InputRequester inputRequester, GameAnnouncement gameAnnouncement, RandomNumberGenerator randomNumberGenerator, Validator validator, GameRecorder gameRecorder) {
this.inputRequester = inputRequester;
this.gameAnnouncement = gameAnnouncement;
this.randomNumberGenerator = randomNumberGenerator;
this.validator = validator;
this.gameRecorder = gameRecorder;
}
public static void main(String[] args) {
BaseballGame baseballGame = new BaseballGame(new InputRequester(), new GameAnnouncement(), new RandomNumberGenerator(), new Validator(), new GameRecorder());
baseballGame.play();
}
public void play() {
while (isRunning) {
boolean isValidOption = false;
String selectedOption = inputRequester.selectGameOption();
while (!isValidOption) {
isValidOption = validator.optionValidator(selectedOption);
handleOption(selectedOption);
}
}
}
public void handleOption(String selectedOption) {
switch (selectedOption) {
case "0":
setDigit();
break;
case "1":
gameAnnouncement.printGameStartMessage();
gameStart();
break;
case "2":
gameAnnouncement.printRecordMessage();
showGameRecord();
break;
case "3":
gameAnnouncement.printGoodbyeMessage();
isRunning = false;
}
}
private void setDigit() {
boolean isSetDigit = false;
while (!isSetDigit) {
String digit = inputRequester.selectDigit();
if (validator.isValidDigit(digit)) {
validator.setDigit(Integer.parseInt(digit));
randomNumberGenerator.setDigit(Integer.parseInt(digit));
isSetDigit = true;
} else {
gameAnnouncement.printWrongDigitMessage();
}
}
}
private void gameStart() {
boolean isCorrect = false;
int answer = randomNumberGenerator.getRandomNumber();
int[] answerArr = randomNumberGenerator.getNumberArr();
while (!isCorrect) {
String stringNumber = inputRequester.inputNumber();
if (validator.isValidNumber(stringNumber)) {
if (validator.isAnswer(answerArr, answer)) {
gameAnnouncement.printCongratulationMessage();
gameRecorder.saveTryCounter(validator.tryCounter);
validator.resetTryCounter();
isCorrect = true;
}
}
}
}
private void showGameRecord() {
gameRecorder.printRecord();
}
}
2. 함수, 변수 네이밍 컨벤션이 제대로 지켜지지 않은 것 같다.
public int[] getValidNumberArr(int answerLength) {
int pow = digit - 1;
int index = 0;
int validNumberCopy = validNumber;
int[] validNumberArr = new int[answerLength];
while (validNumberCopy > 0) {
int division = (int) (Math.pow(10, pow--));
int number = validNumberCopy / division;
validNumberCopy %= division;
validNumberArr[index++] = number;
}
return validNumberArr;
}
이렇게 수학적으로 접근할 때, 변수 네이밍을 어떻게 지정해야할 지 모르겠다...
3. 함수 간 의존성이 보인다.
public boolean isAnswer(int[] answerArr, int answer) {
tryCounter += 1;
if (answer == validNumber) {
return true;
} else {
int[] validNumberArr = getValidNumberArr(answerArr.length);
countStrikeAndBall(answerArr, validNumberArr);
return false;
}
}
public int[] getValidNumberArr(int answerLength) {
int pow = digit - 1;
int index = 0;
int validNumberCopy = validNumber;
int[] validNumberArr = new int[answerLength];
while (validNumberCopy > 0) {
int division = (int) (Math.pow(10, pow--));
int number = validNumberCopy / division;
validNumberCopy %= division;
validNumberArr[index++] = number;
}
return validNumberArr;
}
public void countStrikeAndBall(int[] answerArr, int[] validNumberArr) {
int strikeCounter = 0;
int ballCounter = 0;
List<Integer> integerList = Arrays.stream(answerArr)
.boxed()
.toList();
for (int i = 0; i < answerArr.length; i++) {
int arrIndex = integerList.indexOf(validNumberArr[i]);
if (arrIndex >= 0) {
if (arrIndex == i) {
strikeCounter += 1;
} else {
ballCounter += 1;
}
}
}
4. 로직 처리의 문제
String temp = "";
if (strikeCounter > 0) {
temp += strikeCounter + "스트라이크 ";
}
if (ballCounter > 0) {
temp += ballCounter + "볼";
}
if (strikeCounter == 0 && ballCounter == 0) {
temp = "아웃";
}
System.out.println(temp);
음 이게 맞는 처리 방식인가 싶다... 너무 짜치게... 코드를 넣은 것 같다.
이것 말고도 많은 문제점이 있었지만 더 이상 코드가 안 읽힌다.
- 아 그와중에 버그가 있다.. 후우.. 바로 하자 ㅠㅠㅠㅠㅠㅠㅠ
구현도 구현이지만 네이밍 컨벤션이 정말 중요하다고 생각한다. 중간중간 제대로 짓지않아 헷갈린 것 같다. 물론 처음부터 잘하진 못하겠지만 뭔가 발전을 못하는 것 같은 느낌이 들었다. 음... 뭐가 문제인지 계속 고민해보고있다.
튜터님이 첫 과제에 대해 피드백을 남겨주셨지만 전혀 감을 못 잡겠다. Git 컨벤션은 어떻게 작성해야하고, push는 어떤 단위로 끊는게 좋을지, 멀티쓰레드는 뭔지..., 특정 클래스가 많은 책임을 지고 있다는게 무엇인지.. 정말 헷갈린다. 일단 내 스스로 해결하는게 좋을 것 같아 하루에 3번은 읽고있지만 해석이 잘 안 된다... 음.,... 내일 한번 튜터님 찾아가보도록 하자
'스파르타(부트캠프) > TIL (Today I Learned)' 카테고리의 다른 글
[내일배움캠프] 스파르타 19~ 20일차_24.10.23~ 24 (2) | 2024.10.25 |
---|---|
[내일배움캠프] 스파르타 18일차_24.10.22 (2) | 2024.10.22 |
[내일배움캠프] 스파르타 16일차_24.10.18 (3) | 2024.10.18 |
[내일배움캠프] 스파르타 14일차_24.10.16 (2) | 2024.10.16 |
[내일배움캠프] 스파르타 13일차_24.10.15 (0) | 2024.10.15 |