Swift 프로젝트에서 '야구 게임' 과제를 LV.2 까지 구현하는 목표로 진행됐다.
요구사항은 1에서 9 사이의 서로 다른 임의의 숫자 3개를 생성하고, 사용자가 이를 추측하게 하며 '스트라이크'와 '볼'에 대한 힌트를 제공하는 것이다.
게임을 구현하는 과정에서 여러 가지 문제에 직면했다
readLine()
을 직접 사용하여 사용자 입력을 받았다. 하지만 이 접근 방식은 입력 유효성 검사와 잘못된 입력에 대한 반복 요청을 관리하는 데 어려움이 있었다.readLine()
을 사용하여 사용자 입력을 받을 때, 값이 정의되었지만 사용되지 않았다는 경고가 발생했다. 이는 입력을 검증하면서 동시에 변수를 할당하려 했지만, 해당 변수가 다른 곳에서 사용되지 않기 때문에 발생한 문제였다.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
}
}
readLine()
의 결과를 사용하지 않는 변수에 할당하는 대신, 결과가 nil
인지 여부만 확인하도록 조건을 수정했다. 이를 통해 사용되지 않는 변수에 대한 경고를 제거했다.guard readLine() != nil else {
print("올바르지 않은 입력값입니다")
continue
}
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
자료 구조를 활용하여 랜덤 값의 고유성을 보장하고, 불필요한 중복 체크를 피할 수 있었다.guard
문을 사용하여 잘못된 입력을 초기에 처리함으로써 주요 로직을 깔끔하고 쉽게 유지할 수 있었다.이 작업을 통해 문제를 더 작은 함수로 분해하여 가독성과 재사용성을 향상시키는 것이 중요하다는 것을 다시 한 번 깨달았다. 폴더 구조나 파일 구조에 대해서도 궁금한 점이 많다. 프로젝트가 커질수록 어떻게 구조화하는 것이 좋은지 고민이다. 특히 어떤 파일에 어떤 역할을 부여할지 명확히 하는 것이 중요할 것 같다.
또, 코드에 주석을 얼마나 써야 할지에 대한 고민도 있다. 웹 개발 할 때는 주석 사용을 지양했으나, 항상 주석을 작성해야 한다고 생각하니 불필요하다고 느끼는 경우가 많았다. 주석이 많으면 가독성에 좋은지도 잘 모르겠고, 너무 많을 경우 오히려 방해가 될 수 있다고 느꼈다.