231024~231030C 1031W
루프문의 향연, HotelLounge
이제 데이터를 만들었으니 이것들이 차례대로 동작하고 계산되고, 출력되게 만들어 줘야 한다.
우리 팀은 작성하고, 작성될 코드들이 순차적으로 돌아가는 메서드들을 HotelLounge에 작성했는데 큰 틀은 While 루프문 이었다.
루프문 내에서 순차적으로 적재적소에 들어갈 메서드 들을 잘 넣어주면 나중에 Run(실행) 시킬 시, 해당 출력화면에서 어떤 값을 입력하느냐에 따라 해당메소드로 이동하고 그 메서드 내에서 또 다른 메서드들이 호출되고 마지막에 이르러선 메인으로 돌아가고, 다시 시작하고… 이렇게 계속해서 반복할 수 있게 된다. 적어도 실행을 멈추거나, 뜻하지 않는 에러를 만나기 전까진.
그 과정에서 데이터 값들이 서로 맞물리고 계산되는 코드들은 Service패키지로 나누어 작성해 나갔는데, 사실상 내 파트에서는 크게 다룰 일이 없었다.
프로그램 실행시 내 파트에서 진행될 과정은 이렇다.
팀원이 작업한 메인페이지가 있는데, 여기서 1번을 누르면 ‘객실현황리스트’가 나오고, 이 중에서 원하는 객실번호를 선택할 시 ‘해당 객실을 장바구니에 넣겠냐는 확인 화면’ 한 번, '장바구니에 넣고 메인화면으로 돌아간다는 텍스트가 뜨는 화면 한 번’이다.
private void showCustomerMainView() {
roomService.resetReserved(); //시간 체크 후 reserved 변경
boolean flag = true;
while (flag) {
mainOutput.printCustomerMainView(customer);
int inputNumber = inputView.getInputNumber(1, 5);
switch (inputNumber) {
case 1: //객실선택, 장바구니에 담기
showSelectRoomView(); //<===========여기에서 내 파트로 이동!
break;
case 2:
showCancelReservationView();
break;
case 3: //장바구니 화면
showBasketView();
break;
case 4:
showMyPage();
break;
case 5:
flag = showLogoutView();
break;
}
}
}
private void showSelectRoomView() {
Map<Integer, Room> roomList = roomService.getRoomList();
int roomLength = roomList.size();
roomCheckOutput.printSelectRoomView(customer, roomList);
int inputNumber = inputView.getInputNumber(0, roomLength);
Room selectRoom = roomList.get(inputNumber);
if (inputNumber == 1) {
if (selectRoom.isReserved()) {
showAlreadyReservedRoomView();//"이미 예약됬습니다."
oneSecHold();//1초 대기
showSelectRoomView();//선택화면 다시 출력
} else {
showCheckRoomView(selectRoom); //확인 후 장바구니에 담을지 선택
}
}
}
작성이 완료된 후 여서 진행중에 발생한 시행착오의 과정을 담지 못한게 아쉽지만, 찬찬히 뜯어보도록 하자. 장황한 연결과정은 넘어가고.
- 우선 Map인 roomList를 Database→Service를 거치며 가져와 Map의 지역변수roomList에 대입해준다.
- 이 Map의 사이즈를 int roomLength에 대입해놓는다.
- 이 후에 ‘객실 리스트’를 한 번 출력시켜주는데, 이 출력문들은 모두 output 이라는 패키지에 또 각 목적에 맞는 클래스별로 나누어 작성해놓았다.
- 입력을 받는 메서드를 호출하고 범위를 설정 후 inputNumber변수에 대입한다.
- 이 inputNumber를 맵 roomList의 가져올 ‘키 값’으로 받아주면 이렇게 된다. ex) 3번을 입력 == 맵roomList 의 3번 Key값의 Value를 선택
- 이제 이 Value값을 Room클래스의 지역변수 selectRoom에 대입시키는데, 이 때 Room의 생성자는 매개인자로 Value값의 각 값을 모두 받도록 이미 작성 되어있으므로, 말은 좀 길었지만 결국 잘 들어와졌다.
이제 “선택된 번호==선택된 방” 을 if문을 돌려 그 다음 메소드를 호출한다.
- 선택된 방이 이미 ‘true==예약완료’ 라면 “이미 예약됬다”는 메세지와 함께 선택화면을 다시 출력.
- 선택된 방이 ‘false==예약가능’ 이라면 장바구니에 담을 것인지 확인하는 메서드로 넘어감.
사실상 순차적으로 실행되도록 하는 뼈대를 작성하고, 각 차례마다 필요한 출력문이나 추가적인 메서드가 필요할 시 작성하고, 그 메서드 호출문을 넣어주는 식의 작업순서를 거쳤다.
시간이 없다. 다음으로.
//선택한 객실을 예약할 것인지에 대한 로직 취소할 시, 메인 화면으로 이동
private void showCheckRoomView(Room selectRoom) {
roomCheckOutput.printRoomInfo(selectRoom); //선택한 객실 확인 메세지
int inputNumber = inputView.getInputNumber(1, 2); //누를 수 있는 숫자의 범위
if (inputNumber == 1) {
// 확인
basketService.addRoom(selectRoom); // 장바구니로 선택된 객실을 옮기는 메서드
showConfirmedCheckedRoomView(); // "성공적으로 장바구니에 담겼습니다."
waitForThreeSec(); // 3초 sleep
} else {
// 취소
showCancelReserveRoomView(); // "취소하였습니다. 메인화면으로 돌아갑니다."
}
}
예약 가능한 방을 선택했을 때 나오는 화면.
우선 “선택한 객실을 장바구니에 담을거냐” 라고 묻는 메세지가 나오고, 그 다음 입력값을 받는다.
여기에선 ‘1.확인, 2.취소’ 밖에 선택지가 없으므로 범위는 (1, 2)로 설정한다.
1번을 누르면 선택된 객실이 ‘예약대기목록’으로 넘어가는 메서드를 거친 뒤, 3초를 기다렸다가 해당 메서드를 빠져나가고, 그 전 메서드도 빠져나간 뒤 다시 메인화면으로 돌아간다.
2번을 누르면 다른 동작은 없이 동일하게 메인화면으로 돌아나간다.
기다리는 메서드는 thread의 sleep을 이용했다.
스레드는 복습 할 시간 없이 슥 맛뵈기만 해서 잘 모르기 때문에, 따로 다뤄봐야겠다. try,catch문의 예외처리 또한 그렇다.
이렇게 까지가 내가 맡은 구간의 작업이었다. 작업 경험이 많은게 아니기에 작성한 코드가 무사히 끝까지 도달하는 걸 봤을 때의 그 쾌감은 역시나 끝내준다.
하지만 아직 끝난 건 아니다. 이제 한 번 작업을 완료 한 것일 뿐.
'코딩 > JAVA' 카테고리의 다른 글
TPJ-호텔 예약 프로그램 (5) (1) | 2023.11.02 |
---|---|
TPJ-호텔 예약 프로그램 (4) (1) | 2023.11.01 |
TPJ-호텔 예약 프로그램 (2) (1) | 2023.11.01 |
TPJ-호텔 예약 프로그램 (1) (0) | 2023.11.01 |
오케~ 또시피~ (1) | 2023.10.16 |