호텔 예약 콘솔 프로그램 - 1

이찬호·2023년 7월 20일
0

프로젝트

목록 보기
1/4
post-thumbnail

콘솔에 숫자를 입력하여 호텔 예약프로그램을 만들어보자.
이 프로그램을 만드는데 목표는 1~5단계까지 있다.
1단계 목표부터 차근차근 구현해보도록 하자.
1단계 목표를 정리하자면
1) 메인화면 만들기

  • 1.랜덤으로 금액지급받기, 2. 호텔 방 보기 등등..
  • 메인화면에서 콘솔창을 통해 입력한 결과대로 페이지 이동하기
  • 페이지에서 작업 완료후 다시 메인화면으로 돌아오기
  • 개인적인 추가사항 : 주어진 선택지 이외의 값 입력 시 프로그램 종료

2) 랜덤금액 지급 선택 페이지 만들기

  • 메인에서 1번을 선택하면 현재 보유한 금액에 랜덤(0~50)만원 지급하기
  • 지급된 금액과, 현재 잔액을 표기해주기

3) 호텔 방 보기 페이지 만들기

  • 예약이 가능한 방들을 보여주기

메인페이지 구상

먼저 여러 페이지들을 선택할 수 있도록 readLine()을 통해 숫자를 입력받도록 할 것이다.
입력받은 값을 page 라는 변수를 만들어 page를 변수로 switch문을 이용하여 해당 페이지로 이동하도록 구현하면 될 것이다.
다른 페이지의 작업이 완료되면 다시 메인화면의 내용들을 보여주기 위해 count라는 변수를 만들어 while문이 계속 작동 되도록 하면 될 것이다.

var count = 0
while(count == 0){
	print("호텔 예약 프로그램")
	print("1. 랜덤 금액 지급받기")
	print("2. 호텔 방 정보 보기")
    var page = Int(readLine()!)! 
    switch page {
    case 1 : //1. 랜덤 금액 지급받기 내용
    case 2 : //2. 호텔 방 정보 보기 내용
    default : 
    count = -1 // while문의 조건이 count==0 이기에 0이 아닌 값을 할당하면 된다!
    break
    }
}
print("프로그램이 종료되었습니다.")

다른 부분은 문제가 없었지만

var page = Int(readLine()) //기존 코드
var page : Int 			   //수정한 코드
    if let value = Int(readLine()!) {
        page = value
    }
    else {
        page = 0 // 숫자가 아닌 값이 입력되어도 프로그램이 종료되도록 0으로 할당
      //page = -1 
    }

이부분이 문제였다. 먼저 readLine()의 결과는 옵셔널 타입이기에 Int()가 받을 수 없다. 따라서 강제로 언래핑을 해준 뒤, 이 값을 옵셔널 바인딩을 통해 Int값으로 변형되고, 숫자가 아닌값을 입력하여도 프로그램이 종료되도록 page를 0으로 할당하였다.
(만약, 종료되지 않게 하고 싶다면 page값을 -1로 할당하여 switch문의 case에 추가하여 에러메시지가 나오도록 해도 된다.)

이제 1번 페이지를 구현해보자!

var count = 0
var money = 0 // 프로그램 시작 시 소유하고 있는 금액
while(count == 0){
	print("호텔 예약 프로그램")
	print("1. 랜덤 금액 지급받기")
	print("2. 호텔 방 정보 보기")
    var page : Int
    if let value = Int(readLine()!) {
        page = value
    }
    else {
        page = 0
    }
    switch page {
    case 1 : 
    var randommoney = Int.random(in : 10...50) * 10000 // 랜덤으로 10~50만원 사이 지급
    money += randommoney //기존 소유 금액에 랜덤으로 지급된 돈을 더하기
    print("\(randommoney)원이 지급되었습니다.") // 출력문
    print("현재 잔액은 \(money)원 입니다.") // 출력문
    case 2 : 
    default : 
    count = -1 
    break
    }
}
print("프로그램이 종료되었습니다.")

새롭게 추가된 내용에만 주석을 달아 구분하였다. 가장 중요한 부분은

var randommoney = Int.random(in : 10...50) * 10000

이부분이다. 새로운 random이라는 메서드를 사용하였다. Swift에는 임의의 값을 추출할 수 있는 여러 방법이 있지만, 이번 프로젝트에서는 간단한 정수값을 추출해야 하기에 기본적인 메서드를 사용하였다. 해석하자면 10~50사이의 수들 중 임의의 숫자를 하나 뽑아 1만을 곱하여 randommoney에 할당한다는 뜻이다. 놀랍게도 벌써 1번 페이지가 끝이다!

오늘의 마지막 페이지인 2번페이지도 별거없다.

var count = 0
var money = 0 
while(count == 0){
	print("호텔 예약 프로그램")
	print("1. 랜덤 금액 지급받기")
	print("2. 호텔 방 정보 보기")
    var page : Int
    if let value = Int(readLine()!) {
        page = value
    }
    else {
        page = 0
    }
    switch page {
    case 1 : 
    var randommoney = Int.random(in : 10...50) * 10000 
    money += randommoney 
    print("\(randommoney)원이 지급되었습니다.") 
    print("현재 잔액은 \(money)원 입니다.") 
    case 2 : 
    print("1. 1박 1만원") // print문
    print("2. 1박 2만원") // print문
    print("3. 1박 3만원") // print문
    print("0. 돌아가기") // print문
    var room : Int // page와 같이 입력받은 값을 room에 저장! 현재는 어떤 번호를
    			   // 입력하여도 메인페이지로 돌아간다는 것을 알아두자!
    if let value = Int(readLine()!) {
        room = value
    }
    else {
        room = 0
    }
    default : 
    count = -1 
    break
    }
}
print("프로그램이 종료되었습니다.")

이번에도 마찬가지로 추가된 부분에만 주석을 달아놨다. 사실 지금은 데이터가 많지 않아 여러줄의 프린트문을 나열한게 다지만, 이후 데이터가 많아진다면 리스트나 맵 형태로 방들의 정보를 가진 데이터를 만들고, 그것을 반복문을 이용하여 출력해야할 것이다!

목표였던 1단계가 벌써 끝났다. 하지만 코드를 살펴보면 반복되는 부분이 있다는 것을 눈치챌 수 있다. 눈치채지 못하여도 괜찮다. 나는 귀찮은 게 싫어서 반복되는 것을 쓰며 눈치 챈것이니, 당신은 성실한 사람이라는 것이다!!!
매번 숫자를 입력받는 과정이 있을 때마다

var room : Int     			
    if let value = Int(readLine()!) {
        room = value
    }
    else {
        room = 0
    }

이렇게 길게 쓰는 것도 싫고, 복사해서 붙여넣고 변수명을 바꿔주는 것도 정말 귀찮다. 지금이야 코드가 짧지만 이게 길어진다고 생각하면 실수하지 않을 자신이 없다.
이것을 어떻게 간단하게 바꿀 수 있을까? 우리가 배운(사실 내 블로그에 설명하지 않았지만)것을 써먹어보자. 함수를 이용해보자!

func getInt () -> Int {
	var value : Int
    if let x = Int(readLine()!) {
        value = x
    }
    else {
        value = 0
    }
    return value
}

이런식으로 함수를 만들수가 있다. 별거 없다. 우리가 기존에 page, room등을 readLine()을 통해 받고 이를 옵셔널 바인딩을 통해 언래핑 한 과정들을 그대로 쓰고, 함수 실행부의 첫줄에 value라는 변수를 선언하여 value가 언래핑한 값을 받게 하고 마지막에 함수가 value를 return하면 끝이다!
이렇게 길었던 코드가

var room : Int     			
    if let value = Int(readLine()!) {
        room = value
    }
    else {
        room = 0
    }

이렇게 깔끔해진다!

var room = getInt()

또한 앞으로 더 사용하게 되면? 다른 변수에도 getInt()를 이용하여 쉽게 받아줄 수 있는 것이다. 이렇게 코드를 간결하게 하는 과정을 리팩토링이라고 한다. 개인적으로 리팩토링은 코드를 간결하게 해줄 뿐만 아니라, 우리가 인간으로써 실수할 수 있는 부분들을 줄여준다고 생각한다. 지금은 익숙하지 않아 어렵더라도 자주 편리한 기능들을 이용해먹자!

마지막으로 실행화면이다.

profile
안녕하세요

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

소중한 정보 감사드립니다!

답글 달기