Java Number Baseball Game TIL_1

coldrice99·2024년 9월 12일
0

🚀 Java Number Baseball Game - 트러블 슈팅 기록 (long vs int, Set vs List)

오늘은 숫자 야구 게임 프로젝트를 진행하면서 겪은 두 가지 트러블슈팅 사례를 기록하고자 한다. 타입 선택(long vs int)자료구조의 선택(Set vs List)에 대한 고민과 해결책을 다뤄보겠다.


1. long vs int 선택에 대한 트러블슈팅

🧐 문제 상황

스트라이크와 볼의 개수를 계산할 때, 스트림(Stream)을 사용하여 개수를 카운트하는 로직을 작성했다. 하지만, count() 메서드가 반환하는 타입이 long이라는 점을 간과하고, int로 변수를 선언하면서 타입 불일치 오류가 발생했다.

💡 해결 방법

  1. long 타입 사용: count() 메서드는 기본적으로 long 타입을 반환하므로, 이를 처리하려면 long 변수로 선언하는 것이 자연스럽고 오류 없이 처리할 수 있다.
  2. 형 변환(Casting) 사용 가능: int로 강제 변환할 수도 있지만, long을 사용하는 것이 더 명확하고 적합하다는 결론을 내렸다.

🛠 코드 예시

long strikes = IntStream.range(0, 3)
    .filter(i -> inputList.get(i).equals(answerList.get(i)))
    .count();

long balls = IntStream.range(0, 3)
    .filter(i -> answerList.contains(inputList.get(i)) && !inputList.get(i).equals(answerList.get(i)))
    .count();

결과

결국 long 타입을 사용하는 것이 타입 불일치 오류 없이 처리할 수 있는 방법이었다. 스트림의 반환 타입에 맞는 자료형을 사용하는 것이 중요하다는 점을 다시 확인했다.


2. Set에서 List로 변환한 트러블슈팅

🧐 문제 상황

숫자 야구 게임에서 유저의 입력과 정답을 비교하여 스트라이크을 계산하는 로직을 작성하던 중, 정답이 [3, 7, 8]이고 유저가 283을 입력했을 때 잘못된 결과1 스트라이크, 1 볼이 출력되었다.

🔍 문제 원인

입력값과 정답을 Set으로 처리하고 있었는데, Set은 순서를 보장하지 않는 자료구조이다. 따라서 유저가 283을 입력했을 때 Set에 의해 순서가 변경되었고, 그 결과 잘못된 인덱스 비교가 발생해 예상과 다른 결과가 출력된 것이었다.

💡 해결 방법

정답과 입력값을 비교할 때 순서를 유지해야 했기 때문에, Set 대신 List를 사용하기로 했다. List는 순서를 보장하므로, 입력된 값의 순서대로 비교가 가능했다.

🛠 코드 변경 사항

List<Integer> inputList = new ArrayList<>();  // 입력값 저장을 위한 리스트

// 입력값 검증 로직
protected String validateInput(int input, List<Integer> inputList) {
    inputList.clear();  // 기존 입력값 초기화

    if (input < 100 || input > 999) {
        return "세자리x";  // 세 자리 숫자가 아닌 경우
    }

    inputList.add(input / 100);  // 백의 자리
    inputList.add((input / 10) % 10);  // 십의 자리
    inputList.add(input % 10);  // 일의 자리

    if (new HashSet<>(inputList).size() < 3) {
        return "중복";  // 중복된 숫자가 있는 경우
    }
    return "정상";
}

결과

입력값을 List로 처리하여, 순서를 보장하고 정확한 인덱스 비교가 가능해졌다. 순서가 중요한 상황에서는 Set 대신 List를 사용하는 것이 적합하다는 점을 배웠다.


💡 배운 점

  • 스트림 API에서 제공하는 메서드들의 반환 타입을 정확히 알고 사용해야 하며, 반환 타입에 맞는 자료형을 사용하는 것이 중요하다.
  • 순서가 중요한 경우 Set 대신 List와 같은 순서가 보장되는 자료구조를 사용하는 것이 올바른 선택이다.

https://github.com/coldrice99/NumberBaseballGame.git

profile
서두르지 않으나 쉬지 않고

0개의 댓글