콘솔에 숫자를 입력하여 호텔 예약프로그램을 만들어보자.
이 프로그램을 만드는데 목표는 1~5단계까지 있다.
1단계 목표부터 차근차근 구현해보도록 하자.
1단계 목표를 정리하자면
1) 메인화면 만들기
2) 랜덤금액 지급 선택 페이지 만들기
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()를 이용하여 쉽게 받아줄 수 있는 것이다. 이렇게 코드를 간결하게 하는 과정을 리팩토링이라고 한다. 개인적으로 리팩토링은 코드를 간결하게 해줄 뿐만 아니라, 우리가 인간으로써 실수할 수 있는 부분들을 줄여준다고 생각한다. 지금은 익숙하지 않아 어렵더라도 자주 편리한 기능들을 이용해먹자!
마지막으로 실행화면이다.
소중한 정보 감사드립니다!