[TIL] 숫자 야구 게임 과제

Eden·2024년 11월 7일
0

TIL

목록 보기
34/41
post-thumbnail

과제 내용

Swift 프로젝트에서 '야구 게임' 과제를 LV.2 까지 구현하는 목표로 진행됐다.
요구사항은 1에서 9 사이의 서로 다른 임의의 숫자 3개를 생성하고, 사용자가 이를 추측하게 하며 '스트라이크'와 '볼'에 대한 힌트를 제공하는 것이다.

문제점

게임을 구현하는 과정에서 여러 가지 문제에 직면했다

  1. 사용자 입력 처리: 처음에는 메인 루프에서 readLine()을 직접 사용하여 사용자 입력을 받았다. 하지만 이 접근 방식은 입력 유효성 검사와 잘못된 입력에 대한 반복 요청을 관리하는 데 어려움이 있었다.
  2. 입력 유효성 검사 경고: readLine()을 사용하여 사용자 입력을 받을 때, 값이 정의되었지만 사용되지 않았다는 경고가 발생했다. 이는 입력을 검증하면서 동시에 변수를 할당하려 했지만, 해당 변수가 다른 곳에서 사용되지 않기 때문에 발생한 문제였다.
  3. 랜덤 숫자 생성: 세 개의 랜덤 숫자가 서로 달라야 한다는 조건을 만족시키는 것이 또 다른 문제였는데, 처음에는 배열을 사용했으나 중복된 숫자가 생겨 게임이 올바르게 동작하지 않았다.

해결책

  1. 입력 처리 리팩토링: 입력 유효성 검사 문제를 해결하기 위해 getUserInput()이라는 전용 함수를 만들었다. 이 함수는 전체 사용자 입력 과정을 관리하며, 입력을 검증하고 정수 배열로 변환한다. 사용자가 잘못된 입력을 제공하면 다시 입력을 요청하여 start() 함수의 복잡성을 줄이려고 했다.
    private func getUserInput() -> [Int] {
        while true {
            print("숫자를 입력하세요: ", terminator: "")
            guard let input = readLine() else {
                print("올바르지 않은 입력값")
                continue
            }
    
            let numbers = input.compactMap { Int(String($0)) }
            guard numbers.count == 3, Set(numbers).count == 3, numbers.allSatisfy({ $0 >= 1 && $0 <= 9 }) else {
                print("올바르지 않은 입력값")
                continue
            }
            return numbers
        }
    }
  2. 사용되지 않는 경고 제거: readLine()의 결과를 사용하지 않는 변수에 할당하는 대신, 결과가 nil인지 여부만 확인하도록 조건을 수정했다. 이를 통해 사용되지 않는 변수에 대한 경고를 제거했다.
guard readLine() != nil else {
    print("올바르지 않은 입력값입니다")
    continue
}
  1. 서로 다른 랜덤 숫자 생성: 랜덤 숫자가 서로 다르도록 하기 위해 Set을 사용하여 숫자를 저장하고, 세 개의 고유한 값을 포함할 때까지 반복했다. Set을 사용함으로써 추가적인 중복 체크 없이 간단하게 고유 값을 유지할 수 있었다.
    private func makeAnswer() -> [Int] {
        var numbers: Set<Int> = []
        while numbers.count < 3 {
            let randomNumber = Int.random(in: 1...9)
            numbers.insert(randomNumber)
        }
        return Array(numbers)
    }

주요 학습 내용

  • 가독성을 위한 리팩토링: 전용 함수(getUserInput()displayResult())를 만들어 start() 메서드의 복잡성을 줄이고 코드의 가독성과 유지보수성을 향상시켰다.
  • 고유성 유지를 위한 Set 사용: Swift의 Set 자료 구조를 활용하여 랜덤 값의 고유성을 보장하고, 불필요한 중복 체크를 피할 수 있었다.
  • 입력 유효성 검사를 위한 Guard 문: guard 문을 사용하여 잘못된 입력을 초기에 처리함으로써 주요 로직을 깔끔하고 쉽게 유지할 수 있었다.

회고

이 작업을 통해 문제를 더 작은 함수로 분해하여 가독성과 재사용성을 향상시키는 것이 중요하다는 것을 다시 한 번 깨달았다. 폴더 구조나 파일 구조에 대해서도 궁금한 점이 많다. 프로젝트가 커질수록 어떻게 구조화하는 것이 좋은지 고민이다. 특히 어떤 파일에 어떤 역할을 부여할지 명확히 하는 것이 중요할 것 같다.
또, 코드에 주석을 얼마나 써야 할지에 대한 고민도 있다. 웹 개발 할 때는 주석 사용을 지양했으나, 항상 주석을 작성해야 한다고 생각하니 불필요하다고 느끼는 경우가 많았다. 주석이 많으면 가독성에 좋은지도 잘 모르겠고, 너무 많을 경우 오히려 방해가 될 수 있다고 느꼈다.

profile
Just living the daydream, one moment at a time.
post-custom-banner

0개의 댓글