오늘 Lv.2 와 이어 어제 하지 못한 Input
으로 입력받는 것 까지 구현을 해보려고 한다.
우선 만들어볼 클래스를 정리했다.
코드로 옮긴 후)
우선 이정도로 나누고, InputHandler
부터 해보자..
class 명을 뭐로 적어야할 지 감이 안와서 지피티의 도움을 받았다.
그리고 getInput
이라는 메서드를 구현해야하는데,
[Int]
로만 하면 정수가 아닌 값이 들어갈 경우 오류가 생길 수 있어 옵셔널로 처리했다.
그리고 쉼표로 입력 구분해서 하려고 했는데,
생각해보니 zip
을 이용해서 묶을거라서 쉼표는 빼야겠다...
일단 여기서 중요한 것,
그리고 readLine()
을 통해 텍스트를 입력 받고 input
에 저장해준다.
여기서 if let = raedLine()
은 이제 입력이 3개가 아니거나,
숫자가 아닌 경우는 else
로 넘어가게 처리 했다.
근데 왜 이렇게 피가 잔뜩 날까...
해결해가다가 [Int]?
가 아니라 String?
으로 해야하는 부분을 알게 되었다.
readLine()
은 입력 자체를 String
으로 받기 때문에,
Int
로 명시하지 않아도 된다는 걸 알게 됐던 것이다.
그렇게 return input
을 하면 [Int]?
였을 땐 오류가 났지만,
String?
으로 바꾸니 오류가 나지 않을 수 있었다!!
그리고 위에서 바뀐 부분이 또 있는데,
return input
다음에 있는 else
에서 return
값을 먼저 적고 그 아래에 print
구문을 적었었다.
현재 바뀐 코드에는 print
가 return nil
보다 앞에 와있는데,
if
문은 return
이 나오면 바로 끝나기 때문에 그 전에 프린트를 적어줘야 한다는 것이었다.
당연히 빈 공란이면 if let
라인을 타고 내려와서 맨 아래의 else
가 프린트 될 줄 알았다.
하지만 아무 입력을 하지 않았음에도 불구하고 숫자를 입력해주세요
라는 프린트는 나오지 않았다.
여기서 사용된 건 isEmpty
라는건데,
이걸 어떻게 알 게 됐냐면,, 그냥 다른 친한 수강생분에게 현재 상황을 채팅으로 푸념하 듯 말했더니,
너무나도 당연하다는 듯이
.
.
.
" isEmpty로 비어있는거 확인하면 되는거 아니야? "
isEmpty 분명 낯은 익은데 기억나지 않아 급히 검색해봤다.
번역 하자면, ' 문자열에 문자가 없는지 여부를 나타내는 부울 값입니다. '라고 한다.
참과 거짓을 나눠주는 bool
값이라서 단 한번의 체크로 값에 닿을 수 있다.. 완전 좋다
그렇게 바로 if
문을 이용하여 input
을 isEmpty
로 접근하여
프린트 구문을 입력해주고, 아닐경우 return nil
을 해주었다.
입력:
이 비워져있으니 숫자를 입력해주세요 라고 잘 뜬다.!
일단 입력하는 곳의 중복 번호 방지는 과제엔 없었지만,
만약 답이 403
일 경우 사용자가 500
을 치게 되었을 때
원스트라이크 원볼
이 나오게 된다.
그래서 입력 할 때 중복번호를 작성할 경우 다시 작성하라는 프린트 값도 나와야하고...
앞자리가 0인 경우도 "앞자리가 0이 될 수 없다" 고 알려줘야 했다.
.
.
.
그렇게 부랴부랴 폭풍 검색을 통해 구현했다.
.
.
( 스트라이크랑 볼도 구분하는거 만들어야하는데 조점례 )
일단 눈에 띄는 부분이 있다면,
맨 위쪽을 보면 class
밑에 private
을 이용해서 중복입력을 확인 하는 곳에 접근을 했다.
캡슐화를 배울 때 알게 되었는데,
private
로 설정된 변수나 메서드는 그 선언이 포함 된 클래스 내에서만 접근이 가능하다고 한다.
이로서 외부 코드에서 overlapInputs
에는 직접 접근하지 못할 것이다.
만약 외부에서 Set
에 잘못된 데이터를 추가하는 걸 방지할 수 있게 된다.
번역 )
주어진 요소가 집합에 존재하는지 여부를 나타내는 부울 값을 반환합니다.
쉽게 말하면 특정 컬렉션,, 배열이나 집합 내에 값이 존재하는지 확인하는 메서드다.
contains
메서드는 주어진 element
가 collection
에 존재하면 true
를 반환하고, 존재하지 않으면 false
를 반환한다.
그렇다는 건 사용자가 입력한 input
이 overlapInputs
라는 Set
에
이미 포함되어 있는지를 확인 하는 것인데,
어제 공부해서 알다시피 Set
은 중복값을 없애기 때문에 값이 이미 존재하는지 쉽게 확인이 가능하다.
다른 입력값은 다 확인했고, 숫자가 아닌 문자를 입력할 경우 숫자만 입력하라는 것도 뜬다.
마지막 print
구문은 if let input = readLine()
은 입력이 없을 경우 nil을 반환하는데,
옆에 EOP
라고 써 놓은게 있다.
사용자가 더이상 입력하지 않거나 파일의 끝에 도달했음을 의미한다고 한다.
그래서 저 print
구문이 나오는 경우는 파일의 끝에 도달했을 경우라는 뜻이다.
실행하면서 왜 저 마지막 프린트문은 나오지않는건가 궁금했어서 알아본 것.
덕분에 EOP
라는 것도 알게되었다.
..... 중복값 입력하면 프린트 구문 나오게 처리 다 한 것 같은데 나오지 않는다..
다시 좀 알아봐야겠다..
오늘 스트라이크와 볼 구현까지 하려고 했는데 우선 여기까지 하고 다른 할 일이 있어서 멈추었다.
전체적으로 InputHandler 클래스는 사용자 입력을 안전하고 효율적으로 처리하는데 초점을 맞춰봤다.
다양한 조건을 검증하여 올바른 입력만을 수집할 수 있도록 설계했는데,
중복 입력 방지와 유효성 검사를 통해 게임의 공정성을 유지할 수 있는 기반을 만드려고 했지만 중복 입력은 좀 더 알아봐야겠다.
이런 게임만들면서 여러 메서드를 이용해보는 그런 좋은 경험이 되길 바라는 마음이다.. 그래도 오늘 여러 메서드도 사용해봐서 재미있게 작업했던 것 같다.
꼭 힌트클래스를 구현하고, 도전가이드까지 열심히 도전하련다..
if 문 보기 싫어서 guard 문으로 바꾸는 중.. .
스트라이크랑 볼로 표시해주는 기능 구현 중. . .