극장 예약 시스템 만들기

니나...·2025년 4월 6일

미니 프로젝트

목록 보기
2/4

자바프로그래밍실습I 수업 과제

이 수업에는 써머리 레포트 제외 매주 실습 과제가 1-2개 있는데 이번 주에는 배열을 배워서 극장 예약 시스템을 만들어 보았다. 리팩토링이 필요하겠지만... 일단 열심히 했으니까 백업해둬야징.

예시 코드로 교수님이 올려주신 건 예약, 취소, 좌석 표시, 좌석 만들기, 폭파하기, 메뉴 표시, 메뉴 입력 받기 정도였는데 ... 메뉴를 직원용과 손님용 두 개로 나누고(각각 기능을 다르게 함!) 좌석 배열을 3차원으로 바꿔서 상영관을 여러 개 만들 수 있도록 했다 아예 처음부터 작성했다면 수월했을 텐데 2차원 배열 활용하는 코드를 뜯어고쳐서 3차원 배열로 만들려니까 코드 전체에서 꼼꼼하게 손 볼 게 많았다 !

  1. 메뉴를 스태프 메뉴 / 고객 메뉴의 두 가지로 분류해서 고객들은 예약, 취소, 좌석 확인 기능을, 스태프는 상영관 만들기, 상영관 리스트 확인하기, 상영관 삭제하기 기능을 사용할 수 있도록 했습니다.
  2. 상영관을 여러 개 만들고 싶어서 많은 시도를 거친 끝에 … 3차원 배열을 만들게 되었습니다. 상영관 리스트를 따로 만들어보는 시도, 배열을 배열 안에 넣어보는 시도 등을 해봤지만… 3차원 배열이 가장 깔끔하고 직관적이라 해당 방식으로 마무리 짓게 되었습니다.
  3. 3차원 배열로 수정하고 나니 모든 for문과 매개변수를 수정해야 했습니다…
  4. 변수가 많이 늘어나기도 하고 메뉴와 함수 구조가 많이 다층적으로 변했지만 … 하다 보니 욕심이 나서 끝까지 매달려 완성했습니다!

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월 중순은 되어야 제대로 시작할 수 있을 듯 ㅠ휴

0개의 댓글