관리 메뉴

이리메라 갖다가

[Swift] Command Line Tool로 키오스크 만들기(1) : 기획, 정규식(유효성 검사) 본문

TIL

[Swift] Command Line Tool로 키오스크 만들기(1) : 기획, 정규식(유효성 검사)

너이르나 2023. 7. 26. 23:20
728x90
반응형

팀 프로젝트 : 키오스크 만들기

1. 프로젝트 개요

Swift 문법을 응용해서 키오스크 프로그래밍 하기

필수
구현
사항
Lv0 - 요구사항별로 상세 기능 기획
- 예외 사항 확인
- 프로젝트 생성 : macOS command line tool
Lv1 - 입력받은 숫자에 따라 다른 로직을 실행
- if, switch, guard 문 활용
- 반복문 활용하여 특정 번호 입력 시 프로그램 종료
- readLine() 함수로 값을 입력받기
Lv2 - 클래스 설계
- 클래스들의 프로퍼티와 메소드 정의
- 메소드를 이용해서 Lv1 코드 개선
Lv3 - Lv2 설계 클래스의 상속 관계 구성
- 하나의 객체 리스트로 모든 매뉴 관리
- 리스트 요소 삭제
선택
구현
사항
Lv4 - 입력값 서식 지정 및 재입력
- 현재 잔액과 금액을 비교해서 구매 가능한 상태 정의(클래스 추가 가능)
Lv5 - 특정 작업이 종료된 후 n초 뒤 다른 작업을 할 수 있도록 코드 작성
- 현재 시간을 비교하여 특정 시간대는 결제할 수 없다는 알림창 구현
- 프로그램을 종료할 때까지 n초마다 현재 주문 대기수를 실시간으로 출력(GCD 활용 멀티쓰레드 환경 구축)

 

2. 프로그램 기획

구현 사항 확인 후 어떤 키오스크 프로그램을 만들지 협의를 진행했다.

예시는 패스트푸드점 키오스크였는데, 우리팀은 영화관 키오스크로 결정했고 어떤 항목들이 있어야 하는지 노션에 정리하였다.

 

2. 역할분담

콘솔창만 사용하여 키오스크를 구현해야하기 때문에 각자 노션에 정리된 기능들을 틀만 작업하여 깃에 푸시했다.

각자 작업한 코드를 화면공유를 통해 리뷰하였고, 가장 효율적으로 작성된 코드를 main으로 역할을 분담했다.

유효성 검사

  • (1) 화면에 보이는 번호 외 입력 시 오류 메세지 출력, 재입력
  • (2) (1)과 동일
  • (3) 최대 예매 가능인수 지정
  • (4) 입력값 검증(문자숫자 조합), 예매인수와 동일한 갯수의 입력값 확인, 예매완료된 좌석은 입력값으로 받을 수 없음
  • (5) 입력값 형태 검증(숫자, -구분자)
  • (6) Y/N 입력값 검증
  • (7) 예매내역 없을 시 없다는 문구와 함께 메인으로 돌아가는 기능

 

3. 유효성 검사 (4): 입력값 검증

좌석을 선택할 때 A1 처럼 문자와 숫자로만 이루어져야 하니까 입력값의 패턴을 지정할 수 있다.

해당 검증은 Swift 정규식(참조 블로그)을 이용해서 확인할 수 있다.

 

아래 코드는 입력된 문자열에 정해진 패턴에 맞는지 검사하는 함수이다.

func validateSelectedSeat(_ input: String) -> Bool {
    let pattern = "^[A-C][1-4]$"
    let regex = try! NSRegularExpression(pattern: pattern)
    let range = NSRange(location: 0, length: input.utf16.count)
    return regex.firstMatch(in: input, options: [], range: range) != nil
}
  • func validateSelectedSeat(_ input: String) -> Bool : 문자열 input이라는 매개변수를 받고 불리언 값을 반환한다.
  • let pattern = "^[A-C][1-9]|10$": 정규 표현식 패턴 저장
    • ^ : 문자열 시작
    • [A-C] : 입력값이 대문자 A부터 C 중에서 일치
    • [1-4] : 입력값이 숫자 1부터 4 중에서 일치
    • $ : 문자열 끝
  • let regex = try! NSRegularExpression(pattern: pattern): NSRegularExpression 객체 regex를 생성한다. *try!는 예외를 무시하고 정규 표현식 객체를 생성하게 한다.
  • let range = NSRange(location: 0, length: input.utf16.count): input의 범위를 정의하는 NSRange 객체 range를 생성한다. 이 범위는 문자열의 시작부터 끝까지를 나타낸다.
  • return regex.firstMatch(in: input, options: [], range: range) != nil: regex를 사용하여 input에서 정규 표현식에 해당하는 부분을 검사한다.
    • regex.firstMatch(in:options:range:) : 메서드는 첫 번째로 매치되는 부분을 찾음
    • options : 추가적인 옵션을 지정할 수 있으며, 여기서는 빈 배열을 사용하여 기본 옵션을 적용
    • range :  검사할 문자열의 범위를 지정
    • != nil : 매치되면 true, 매치되는 부분이 없으면 false
🥲 유효성 검사 (4)를 진행하면서 어려웠던 점
- updatedSeat이 while문 안에 있으니까 선택한 좌석이 잘못 입력되어 수정해도 처음 입력한 값이 저장되어 있어서 오류 발생
- 상기 오류는 결제 완료시에 저장되도록 위치를 변경
- 예매 인원 수를 2명으로 예매하고 좌석을 선택하면, 해당 좌석이 선택되어 있는데도 불구하고 자꾸 결제로 넘어가는 문제 발생
- 입력값을 구분자 띄어쓰기 " "가 있는 String으로 인식하고 구분자를 기준으로 쪼개 배열에 저장하고 좌석을 입력 받을 때 해당 배열에 이미 존재하는지 확인하는 함수를 만들어서 검증하게 했다.. 진짜 힘들었다... 
728x90
반응형