Today I Learned

2024 스파르타 내일배움캠프 Sping 트랙 참여 // day14

shinelee26 2024. 10. 21. 21:50

오늘 진행한 학습 요약

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인 클래스는 자식이 상속받지 못한다는 사실을 새롭게 알게 되었다.
    • 자식이 상속받을 수 있는 클래스는 protectedpublic
    • pirvate를 상속받기 위해서는 gettersetter 메서드를 사용해 간접적으로 접근할 수 있다.
  • 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)