이 수업에는 써머리 레포트 제외 매주 실습 과제가 1-2개 있는데 이번 주에는 배열을 배워서 극장 예약 시스템을 만들어 보았다. 리팩토링이 필요하겠지만... 일단 열심히 했으니까 백업해둬야징.
예시 코드로 교수님이 올려주신 건 예약, 취소, 좌석 표시, 좌석 만들기, 폭파하기, 메뉴 표시, 메뉴 입력 받기 정도였는데 ... 메뉴를 직원용과 손님용 두 개로 나누고(각각 기능을 다르게 함!) 좌석 배열을 3차원으로 바꿔서 상영관을 여러 개 만들 수 있도록 했다 아예 처음부터 작성했다면 수월했을 텐데 2차원 배열 활용하는 코드를 뜯어고쳐서 3차원 배열로 만들려니까 코드 전체에서 꼼꼼하게 손 볼 게 많았다 !
- 메뉴를 스태프 메뉴 / 고객 메뉴의 두 가지로 분류해서 고객들은 예약, 취소, 좌석 확인 기능을, 스태프는 상영관 만들기, 상영관 리스트 확인하기, 상영관 삭제하기 기능을 사용할 수 있도록 했습니다.
- 상영관을 여러 개 만들고 싶어서 많은 시도를 거친 끝에 … 3차원 배열을 만들게 되었습니다. 상영관 리스트를 따로 만들어보는 시도, 배열을 배열 안에 넣어보는 시도 등을 해봤지만… 3차원 배열이 가장 깔끔하고 직관적이라 해당 방식으로 마무리 짓게 되었습니다.
- 3차원 배열로 수정하고 나니 모든 for문과 매개변수를 수정해야 했습니다…
- 변수가 많이 늘어나기도 하고 메뉴와 함수 구조가 많이 다층적으로 변했지만 … 하다 보니 욕심이 나서 끝까지 매달려 완성했습니다!
main.java
package week5;
import java.util.Scanner;
import java.util.Arrays;
public class main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
TheaterReservation tr = new TheaterReservation();
Arrays.fill(tr.MovieList, "상영 중인 영화 없음.");
tr.Welcome();
while(true) {
System.out.println("영화관 스태프라면 1, 영화관에 방문한 손님이라면 2를 눌러주세요.");
int id = input.nextInt();
switch (id) {
case 1 : tr.StaffMenuDisplay();{
int menu = tr.menuInt();
if (menu == 1 || menu == 2 || menu == 3) {
if (tr.MovieList == null) {
System.out.println("상영 중인 영화가 없습니다...");
continue;
}
}
switch (menu) {
case 0 : System.out.println("극장 시스템 메뉴를 마칩니다."); break;
case 1 : tr.makeSeatSquare(); break;
case 2 : tr.ShowMovieList(); break;
case 3 : tr.deleteTheater(); break;
default : System.out.println("존재하지 않는 메뉴입니다.");
}
break;}
case 2 : tr.ConsumerMenuDisplay(); {
int menu = tr.menuInt();
switch (menu) {
case 0 : System.out.println("극장 시스템 메뉴를 마칩니다."); break;
case 1 : tr.reserve(tr.Seat); break;
case 2 : tr.cancel(tr.Seat); break;
case 3 : tr.showSeat(tr.Seat); break;
default : System.out.println("존재하지 않는 메뉴입니다.");
}
break;}
default : System.out.println("1과 2 중 하나를 입력해주세요.");
}
}
}
}
TheaterReservation.java
package week5;
import java.util.Scanner;
public class TheaterReservation {
int[][][] Seat = new int[8][][];
Scanner input = new Scanner(System.in);
String[] MovieList = new String[8];
public void ShowMovieList() {
for (int i=0; i<8; i++) {
System.out.print((i+1)+"관 : ");
System.out.println(MovieList[i]);
}
}
public void reserve(int [][][] ar) {
ShowMovieList();
System.out.println("원하는 상영관의 번호를 입력하세요.");
int trNumber = input.nextInt();
int[][] arr = Seat[trNumber - 1];
if (arr == null) {
System.out.println("해당 상영관은 예약 불가능합니다.");
return;
}
int row, col;
while (true) {
System.out.print("행 입력: ");
row = input.nextInt();
System.out.print("열 입력: ");
col = input.nextInt();
row-=1; col-=1;
if (row < 0 || row >= arr.length || col < 0 || col >= arr[0].length) {
System.out.println("존재하지 않는 좌석입니다.");
continue;
}
if (arr[row][col] == 1) {
System.out.println("이미 예약된 좌석입니다.");
continue;
}
break;
}
arr[row][col] = 1;
System.out.println("예약이 완료되었습니다.");
}
public void cancel(int[][][] ar) {
int row = 0, col = 0, trNumber;
while (true) {
ShowMovieList();
System.out.println("원하는 상영관의 번호를 입력하세요.");
trNumber = input.nextInt()-1;
System.out.print("취소할 행 : ");
row = input.nextInt();
if (row<0 || row>ar.length-1) continue;
System.out.print("취소할 열: ");
col = input.nextInt();
if (col<0 || col > ar[row].length-1) continue;
if(ar[trNumber][row][col]==0) {
System.out.println("예약된 좌석이 아닙니다.");
continue;
}
else break;
}
Seat[trNumber][row][col] = 0;
}
public void showSeat(int[][][] ar) {
ShowMovieList();
System.out.println("원하는 상영관의 번호를 입력하세요.");
int trNumber = input.nextInt();
trNumber -= 1;
int[][] targetSeat = ar[trNumber];
for (int i = 0; i < targetSeat.length; i++) {
for (int j = 0; j < targetSeat[i].length; j++) {
if (targetSeat[i][j] == 1) System.out.print("■ ");
else System.out.print("□ ");
}
System.out.println();
}
}
public void makeSeatSquare() {
System.out.println("상영관 번호 : ");
int number = input.nextInt();
String temp = input.nextLine();
System.out.println("영화 제목 : ");
String title = input.nextLine();
System.out.println("행 크기 : ");
int row = input.nextInt();
System.out.println("열 크기 : ");
int col = input.nextInt();
Seat[number - 1] = new int[row][col];
MovieList[number - 1] = title;
}
public void deleteTheater() {
ShowMovieList();
System.out.println("삭제할 상영관 번호를 입력하세요.");
int number = input.nextInt();
if (number < 1 || number > 8) {
System.out.println("존재하지 않는 상영관입니다.");
return;
}
if (Seat[number - 1] == null) {
System.out.println("이미 삭제되었거나 아직 만들어지지 않은 상영관입니다.");
return;
}
Seat[number - 1] = null;
MovieList[number - 1] = "상영 중인 영화 없음.";
System.out.println(number + "관이 삭제되었습니다.");
}
public void ConsumerMenuDisplay() {
System.out.println("-----------------------------------------------");
System.out.println("1. 예약하기 2. 취소하기 3. 좌석 표시하기 0. 메뉴 나가기 ");
System.out.println("-----------------------------------------------");
System.out.println("menu : ");
}
public void StaffMenuDisplay() {
System.out.println("-------------------------------------------------------------------");
System.out.println("1. 상영관 만들기(사각형) 2. 상영관 리스트 확인하기 3. 상영관 삭제하기 0. 메뉴 나가기");
System.out.println("-------------------------------------------------------------------");
System.out.println("menu : ");
}
public int menuInt() {
int menu;
menu = input.nextInt();
return menu;
}
public void Welcome() {
System.out.println("=======================================================================");
System.out.println(" Welcome to Ewha Movie!! ");
System.out.println("=======================================================================");
}
public static void main(String[] args) {
}
}
소감
문법 자체는 아직까지 씨랑 비슷해서 수월함
사실 유니티 개발 때문에 빨리 씨샵 공부를 해야 되는데 이번 학기에는 진짜 진짜 너무 하는 게 많아서 ... 최소 5월 중순은 되어야 제대로 시작할 수 있을 듯 ㅠ휴