Today I Learned

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

shinelee26 2024. 10. 22. 21:32

오늘 진행한 학습 요약

1. 나무반 3회차 ( 제네릭과 인터페이스 )

  • 제네릭 사용
  • 제네릭 구현
  • 인터페이스란

2. CH 2 숫자 야구 게임 과제

  • Lv 1. 기본 게임 구현 (숫자 야구 게임)
  • Lv 2. 입력 및 출력 개선 (숫자 야구 게임)
  • Lv 3. 추가 기능 및 개선 (숫자 야구 게임)
JAVA 숫자야구게임 Git-hub 링크 : https://github.com/chews26/WordleGame/tree/main

 

3. 배열 개념 정리

  • 배열 기본 개념 및 사용법 정리
  • 배열 주요 메서드 정리

4. 알고리즘 코드카다  Day7 (작성 생략)

CodingTest Git-hub 링크 : https://github.com/chews26/CodingTest

 

5. learn git branching (작성 생략)

LearnGitBranching 링크 : https://learngitbranching.js.org/?locale=ko

학습 정리

1. 나무반 3회차 ( 제네릭과 인터페이스 )

  • 제네릭 사용
    • 제네릭을 사용하지 않을 때 
    • 제네릭을 가장 먼저 접하는 것이 자바에서 리스트를 사용할 때
    • 리스트에 뭐가 들어 있을지 알 수 알 수 없기 때문에 매번 타입을 체크
    • 또한 여러 타입이 있어 공통적인 처리가 불가능
    • ArrayList.add() 메소드 비교  
    • 제네릭은 소스통에 붙어있는 라벨과 비슷함 > 굳이 안에 내용을 보지 않아도 알 수 있는 장점
    • 제네릭이 사용되는 시점에 어떤 것으로 사용할지 표기(구체화)해야 제대로 사용 가능
  • 제네릭 구현
    • 제네릭 구현은 상장 만들기와 비슷하다


    • "김재호" 를 제외한 문장은 고정된 값이다.
    • "김재호" 부분을 제네릭에 비유하면 T라는 글자가 위치하는 곳이다.
    • 제네릭을 설정하는 부분에서는 아무 문자나 사용할 수 있습니다. 하지만 관습적으로 T라는 글자 하나를 씀
    • T : Type을 의미
    • E: Element (컬렉션에서 요소를 나타낼 때 사용)
    • K: Key (Map의 키를 나타낼 때 사용)
    • V: Value (Map의 값을 나타낼 때 사용)
    • S, U, V 등: 2개 이상의 타입 파라미터를 정의할 때 추가로 사용
  • 제네릭을 사용하는 이유
    • 중복코드, 브랜드필터(포장형태, 보관방식 등)이 늘어나는 경우 유리함
  • T에 들어갈 수 있는 타입은 ? 
    • 모든 타입이 다 들어갈 수 있다.
  • T는 타입이 없어서 메소드가 사용하려는 메소드를 알 수 없을 수 있음
  • 이를 위해 상한과 하한을 구현할 수 있음

 

  • 인터페이스
    • 어떤 클래스가 가져야 할 동작을 미리 정해주는 설계도
      • 택배 = 인터페이스
      • 대한통운, 우체국, 한진택배 = 인터페이스의 구현체
    • 인터페이스를 보고 우리는 “구체적으로 어떻게 하는지 모르겠지만, 최종적으로 이런 기능을 제공하는구나”라고 알 수 있음
    • 제네릭을 쓸 때는 거의 필수적으로 인터페이스를 함께 쓰게됨
      • 제네릭과 인터페이스에 관해 개념 공부 및 응용방법을 연습해 봐야 이해가 빠를 것 같다.

 


2. CH 2 숫자 야구 게임 과제

Lv1. 기본 게임 구현
1. 정답 숫자 생성하기
2. 정답을 맞추기 위해 숫자를 입력하기
3. 결과값 출력 및 게임 로직 적용하기
4. 게임 이어서하기
  • 기본 게임 구현을 완료하였다.
  • 오류 출력 개선은 Lv2에서 같이 진행하였다.

Lv2. 입력 및 출력 개선
1. 입력값이 유효한지 검사하기
2. 출력 개선

  • play 메서드를 try-catch문으로 예외를 처리하여 오류 발생을 검토하도록 하였다. throw로 특정 에러가 발생하면 sout으로 예외 이유를 출력하도록 하였으나 아래와 같은 문제가 발생하였다.
  • 중복이 안 되는 LinkedHashSet에서 중복값을 입력할 경우 에러메시지를 출력하도록 하였다. .contains로 저장된 값이랑 중복되면 throw로 에러메시지를 출력하도록 하였는데 처음 입력값은 에러메시지를 출력하였으나 두 번째 입력값은 에러메시지를 출력하지 않고 정상 처리되는 문제가 있었다.
  • 이를 해결하기 위해 LinkedHashSet.size() <3 이면 에러메세지를 출력하게끔 하려고 하였으나 에러가 발생한 배열 값이 초기화되지 않는 문제와 while문이 제대로 루프가 되지 않는 현상을 겪었다.
  • 이를 해결하기 위해서 throw로 에러를 출력하는 것이 아니라 if문으로 해당 케이스가 발생할 경우 Sout으로 에러메시지를 출력하고 continue 값을 주니 루프가 제대로 작동하였다.
  • try-catch문의 활용 방법을 더 공부할 필요성을 느꼈으며 예외처리 방법에 대해 더 연구해보아야겠다.

 

Lv 3. 추가 기능 및 개선 (숫자 야구 게임)
1. 게임 기록 통계
2. 출력 개선
  • Lv2를 진행하며 case문으로 게임 시작 전  "1. 게임시작하기 2. 게임 기록보기 3. 종료하기"를 선택할 수 있는 기능을 추가하였다. Lv3에서는 2. 게임 기록보기를 개발하였다.
  • 처음에 loop를 완료한 횟수와 재시도 횟수를 각각 Array List 배열에 넣는 것을 시도했었다.
  • 그러나 loop를 완료한 횟수를 count하면서 계속 원하는 값이 입력되지 않았다.
  • 작성을 하다 보니 성공을 알리는 함수가 발생할 때 재시도 횟수를 List에 add 하는 것을 반복하게 될 것이고 재시도 횟수의 size가 게임을 성공한 기록의 수가 되기 때문에 하나의 배열로 작성할 수 있음을 깨닫게 되었다.
  • 따라서 for 루프로 tryCountArr.size만큼 반복하여 게임 성공 횟수와 시도횟수를 출력하는 메소드를 작성하였다

 


3. 배열 개념 정리

  • 배열 기본 개념 및 사용법 정리
  • 배열 주요 메서드 정리

내용이 많아 Notion에 정리하였다.

 

Java 기본배열 | Notion

Java에서 기본 배열 사용법과 주요 명령어 정리

shinelee26.notion.site