오늘 진행한 학습 요약
1. 새싹반 3회차 (퀴즈 및 로또 추첨기 만들기)
- zep에서 O/X 퀴즈
- Random 함수를 사용하여 로또 추첨기 만들기
2. CH 2 숫자 야구 게임 과제
- 개발 프로세스 가이드
- 0단계 : 개발환경 세팅
- 1단계 : 요구사항 정의 및 설계
- 필수 기능 가이드
- Lv 1. 기본 게임 구현 (숫자 야구 게임)
- Lv 2. 입력 및 출력 개선 (숫자 야구 게임)
JAVA 숫자야구게임 Git-hub 링크 : https://github.com/chews26/WordleGame/tree/main
3. 알고리즘 코드카다 Day4~6 (작성 생략)
CodingTest Git-hub 링크 : https://github.com/chews26/CodingTest
학습 정리
1. 새싹반 3회차 (퀴즈 및 로또 추첨기 만들기)
- zep에서 O/X 퀴즈
- zep에서 기본 Java 개념에 대한 OX퀴즈를 진행하였다.
- 자식생성자는 접근제어자에 상관없이 모두 상속받을 수 있다? -> X
- pivate인 클래스는 자식이 상속받지 못한다는 사실을 새롭게 알게 되었다.
- 자식이 상속받을 수 있는 클래스는 protected와 public
- pirvate를 상속받기 위해서는 getter와 setter 메서드를 사용해 간접적으로 접근할 수 있다.
- Random 함수를 사용하여 로또 추첨기 만들기
- HashSet은 중복을 허용하지 않고 순서를 보장하지 않는다.
- 선언 방법
- HashSet<Integer> numbers = new HashSet<>();
- 배열 입력 방법
- numbers.add()
- Random 함수로 임의 값을 변수에 선언할 수 있다.
- 선언 방법
- Random random = new Random();
- 원하는 값 사이의 랜덤 값 대입 방법 (1~45까지의 값)
- random.nextInt((45) + 1)
- HashSet은 중복값을 허용하지 않는다. for문을 사용해 배열에 랜덤한 값을 대입하다 중복값이 발생할 경우 원하는 배열만큼 값을 채우지 못하고 종료된다.
- 따라서 while문을 통해서 원하는 값이 채워질때까지 루프를 돌리도록 하였다.
import java.util.HashSet;
import java.util.Random;
public class Lotto {
public static void main(String[] args) {
Random random = new Random();
HashSet<Integer> numbers = new HashSet<>();
while (numbers.size() < 6) {
numbers.add(random.nextInt((45) + 1));
}
System.out.println(numbers);
}
}
2. CH 2 숫자 야구 게임 과제
개발 프로세스 가이드
- 0단계 : 개발환경 세팅
- 신규 프로젝트 WordleGame 생성
- 1단계 : 요구사항 정의 및 설계
- 1. 입력 구현
- 2. 랜덤 정답 생성
- 3. 입력 값 배열에 대입
- 4. 랜덤 값 배열에 대입
- 5. 입력 값 및 랜덤 값 비교
- 6. 오류 출력
필수 기능 가이드
- Lv 1. 클래스 없이 기본적인 연산을 수행할 수 있는 계산기 만들기
Lv1. 기본 게임 구현
1. 정답 숫자 생성하기
2. 정답을 맞추기 위해 숫자를 입력하기
3. 결과값 출력 및 게임 로직 적용하기
4. 게임 이어서하기
- Main.java 와 BaseballGame.java 두 파일을 만들었다.
- BaseballGame에서 랜덤값을 생성하는 메서드를 만들고 객체 생성 시마다 랜덤값을 생성할 수 있도록 생성자를 만들었다.
- 중복값을 허용하지 않는 Hashset을 통해 배열을 생성하였다.
- 랜덤값과 입력값을 Hashset에 대입하였다.
- 랜덤값은 1~9사이의 값인 세자리 수여야 하므로 for문으로 1~9사이의 랜덤한 값을 배열에 3번 넣을 수 있도록 작성하였다.
- 무슨 이유인지 모르겠으나 배열이 오름차순으로 정렬이 되었고 이를 해결하기 위해 순서가 보장되는 LinkedHashSet으로 변경하였다.
- 두 배열의 인덱스 값이 모두 같은지, 인덱스별로 값이 같은지, 같은 값을 포함하고 있는지를 알아내어야 하기때문에 인덱스번호에 따른 값이 필요하였다. 그러나 Hashset은 인덱스 번호로으로 값을 출력할 수 없어 이를 해결하기 위해 ArrayList로 변환하였다.
- 구현을 스트라이크출력 -> 정답 -> 볼출력 순으로 하니 정답인 경우에도 스트라이크 값이 출력되어 정답을 찾는 부분을 상단으로 배치하였다.
- 중복값으로만 볼인 경우를 찾을 때는 스트라이크가 볼일 수도 있다. 이를 따로 구현해놨는데 스트라이크인 경우에도 볼 값이 출력되는 문제가 있어 if와 else if문으로 두개를 같이 구현하여 중복으로 값이 출력되지 않도록 수정하였다.
- Lv 2. 클래스를 적용해 기본적인 연산을 수행할 수 있는 계산기 만들기
Lv2. 입력 및 출력 개선
1. 입력값이 유효한지 검사하기
2. 출력 개선
- 입력값이 숫자인지 검사하기 위해서 try-catch문을 사용하였다. 하지만 아직 입력값이 0인 경우는 try-catch문으로 어떻게 구현할 수 있을 지 고민하고 있다.
- IllegalArgumentException 에러는 적합하지 않거나(illegal) 적절하지 못한(inappropriate) 인자를 메소드에 넘겨주었을 때 발생하는 에러이다.
- InputMismatchException 에러는 입력값이 불일치해서 일어난 예외이다.
- NullPointerException 에러는 사용할 개체의 인스턴스를 생성하지 않은 상태에서 참조할 경우 발생한다(Null)