적당한 과제로 영화 예매 프로그램을 작성하게 되었다.
과정은 1~3단계로 나뉘어져 있고 모든 단계가 개체에 대한 적절한 이해가 필요한 과제였다. 현재는 1~2단계까지 코드를 완성했고, 마지막 제출까지 3단계를 끝마쳐야한다.
영화 예매 프로그램은 파트별로 크게 3가지로 나뉘어져있다.
1. 상영관 관리 프로그램
2. 영화 상영일정 관리 프로그램
3. 영화 티켓 예매 프로그램
각각 기능별로
0- 메인은 MovieReservation 클래스
1- 상영관 관리 프로그램은 Sceen, ScreenManager 클래스
2- 영화 상영일정 관리 프로그램은 Movie, MovieTimetable, TimetableManager 클래스
3- 영화 티켓 예매 프로그램은 Seat, Ticket, TicketManager클래스
를 필요로 한다. 현재는 1, 2 만 구현했으며 내부 메소드 중에 3과 연관 되는 메소드는 틀만 작성했다.
객체를 생성해서 배열을 뒤지는 과정에서 계산을 잘못해서 NullPointException이 엄~청 많이 발생했으나 환기 한번하고 천천히 다시 건드려보니 모두 해결되었다.
무식하게 복사 붙여넣기해서 길어졌던 코드도 중복을 제거하고 최대한 간결하게 정돈했다.
2파트 까지는 만족! 3파트까지 모두 완성되면 최종 편집본으로 다시 한번 글을 작성할 생각이다.
아래는 각 클래스별 코드이다. 코드가 적잖이 기므로 접기.
1. 상영관 관리 프로그램에 대한 Screen, ScreenManager 클래스
package myPackage;
public class Screen
{
private String name;
private int rowNum;
private int seatNum;
public Screen(String name, int rowNum, int seatNum)
{
this.name = name;
this.rowNum = rowNum;
this.seatNum = seatNum;
}
@Override
public String toString()
{
return "Screen [name=" + name + ", rowNum=" + rowNum + ", seatNum=" + seatNum + "]";
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getRowNum()
{
return rowNum;
}
public void setRowNum(int rowNum)
{
this.rowNum = rowNum;
}
public int getSeatNum()
{
return seatNum;
}
public void setSeatNum(int seatNum)
{
this.seatNum = seatNum;
}
}
package myPackage;
import java.util.Scanner;
public class ScreenManager
{
private Screen[] screens;
private int maxCount;
private int count;
public ScreenManager(int maxCount)
{
this.maxCount = maxCount;
this.screens = new Screen[maxCount];
count = 0;
}
public void add()
{
String name = null;
int rowNum = 0, seatNum = 0;
Scanner s = new Scanner(System.in);
if(count == maxCount)
{
System.out.println("상영 가능한 스크린 수가 모두 차있습니다.");
}else
{
System.out.print("상영관 명칭 : ");
name = s.next();
System.out.print("좌석 열수 : ");
rowNum = s.nextInt();
System.out.print("한열의 좌석수 : ");
seatNum = s.nextInt();
System.out.println("# "+name + "이 생성되었습니다.");
System.out.println();
screens[count] = new Screen(name, rowNum, seatNum);
count++;
}
}
public void list()
{
for(int i = 0; i < count; i++)
{
System.out.println(screens[i].getName() + "["+screens[i].getRowNum()+"열 / "+screens[i].getSeatNum()+"좌석]");
}
System.out.println();
}
// public void get()
// {
//
// }
public void remove()
{
Scanner s = new Scanner(System.in);
System.out.print("삭제할 상영관 명칭? ");
String input = s.next();
boolean isfound = false;
for(int i = 0; i < count; i++)
{
if(input.equals(screens[i].getName()))
{
System.out.println("# "+input+"이 삭제되었습니다.");
for(int j = i; j < count; j++) {
screens[j] = screens[j+1];
}
isfound =true;
count--;
break;
}
}
if(!isfound)
{
System.out.println("삭제할 상영관 명칭이 잘못 된 것 같습니다. 다시 시도해주세요.");
}
System.out.println();
}
public void screenManagerMain()
{
Scanner s = new Scanner(System.in);
int input = -999;
while(input != -1)
{
System.out.print("상영관 메뉴 (1.등록, 2.목록, 3.삭제, 0.메인메뉴) >> ");
input = s.nextInt();
switch(input)
{
case 1:add();break;
case 2:list();break;
case 3:remove();break;
case 0:input = -1;break;
default:System.out.println("입력오류입니다.");break;
}
}
}
public Screen[] getScreens()
{
if(count == 0) {
return null;
}
return screens;
}
public void setScreens(Screen[] screens)
{
this.screens = screens;
}
public int getMaxCount()
{
return maxCount;
}
public void setMaxCount(int maxCount)
{
this.maxCount = maxCount;
}
public int getCount()
{
return count;
}
public void setCount(int count)
{
this.count = count;
}
}
2. 영화 상영일정 관리 프로그램 Movie, MovieTimetable, TimetableManager 클래스
package myPackage;
public class Movie
{
private String title;
private String openDate;
private int playtime;
private String grade;
public Movie(String title, String openDate, int playtime, String grade)
{
this.title = title;
this.openDate = openDate;
this.playtime = playtime;
this.grade = grade;
}
public String getTitle()
{
return title;
}
public void setTitle(String title)
{
this.title = title;
}
public String getOpenDate()
{
return openDate;
}
public void setOpenDate(String openDate)
{
this.openDate = openDate;
}
public int getPlaytime()
{
return playtime;
}
public void setPlaytime(int playtime)
{
this.playtime = playtime;
}
public String getGrade()
{
return grade;
}
public void setGrade(String grade)
{
this.grade = grade;
}
}
package myPackage;
public class MovieTimetable
{
private Movie movie;
private Screen screen;
private String[] times;
public MovieTimetable(Movie movie, Screen screen, int count)
{
this.movie = movie;
this.screen = screen;
times = new String[count];
}
public void addTime(String t)
{
times = t.split(" ");
}
public void showTime()
{
for (int i = 0; i < times.length; i++)
{
System.out.print(times[i]+" ");
}
}
public Movie getMovie()
{
return movie;
}
public void setMovie(Movie movie)
{
this.movie = movie;
}
public Screen getScreen()
{
return screen;
}
public void setScreen(Screen screen)
{
this.screen = screen;
}
public String[] getTimes()
{
return times;
}
public void setTimes(String[] times)
{
this.times = times;
}
}ㄴ
package myPackage;
import java.util.Arrays;
import java.util.Scanner;
public class TimetableManager
{
private MovieTimetable[] table;
private ScreenManager sm;
private int pos;
public TimetableManager(int n)
{
table = new MovieTimetable[n];
pos = 0;
}
public void add()
{
Scanner s = new Scanner(System.in);
String title, openDate, grade;
int playtime = 0;
Screen sc[] = sm.getScreens();
Movie m = null;
int select = 0;
int mArrayCnt = 1;
title = openDate = grade = null;
while (true)
{
if (sc == null)
{
System.out.println("등록된 상영관이 없습니다. 최소한 하나의 상영관을 등록해주세요.");
return;
}
// 처음 등록 시 조건의 if문
if (pos == 0)
{
System.out.println("**현재 등록된 영화가 없습니다.");
} else
{
Movie mArray[] = new Movie[pos];
for (int i = 0; i < pos; i++)
{
if (i == 0)
{
mArray[i] = table[i].getMovie();
}
if (i > 0)
{
if (!table[i-1].getMovie().getTitle().equals(table[i].getMovie().getTitle()))
{
mArray[i] = table[i].getMovie();
mArrayCnt++;
}
}
}
for(int i = 0; i < mArrayCnt; i++)
{
System.out.println("["+(i+1)+"] "+mArray[i].getTitle()+" "+mArray[i].getOpenDate());
}
System.out.print("0을 입력하면 새로운 영화 등록 선택번호 입력하면 원하는거 등록 : ");
select = s.nextInt();
if(select != 0)
{
m = mArray[select-1];
}
// 영화 목록 여기서 출력하고 선택을함. 혹은 0
}
// 처음 등록이 아닐 때
if (select == 0)
{
System.out.print("영화제목 : ");
title = s.next();
System.out.print("개봉일 : ");
openDate = s.next();
System.out.print("상영시간 : ");
playtime = s.nextInt();
System.out.print("등급 : ");
grade = s.next();
m = new Movie(title, openDate, playtime, grade);
System.out.println("**신규 영화(" + title + ")가 등록되었습니다.");
}
String temp = null;
boolean isFound = false;
int k = 0;
while (true)
{
System.out.print("상영관 : ");
temp = s.next();
if (!temp.equals("#"))
{
// 예외 처리 및 검색 시작
for (int i = 0; i < pos; i++)
{
if (table[i].getScreen().getName().equals(temp))
{
System.out.println("**" + table[i].getScreen().getName() + "은 이미 상영일정이 등록되어 있습니다.");
isFound = true;
break;
}
}
if (isFound)
{
isFound = false;
continue;
}
for (k = 0; k < sm.getCount(); k++)
{
if (sc[k].getName().equals(temp))
{
break;
}
}
if (k == sm.getCount())
{
System.out.println("**" + temp + "는 미등록된 상영관입니다.");
continue;
}
// 예외 처리 및 검색 끝
} else
{
break;
}
s.nextLine();
System.out.print("상영일정 : ");
temp = s.nextLine();
String timeNumbering[] = temp.split(" ");
table[pos] = new MovieTimetable(m, sc[k], timeNumbering.length);
table[pos].addTime(temp);
pos++;
System.out.println("**상영일정 등록이 완료되었습니다.");
}
// 정렬 알고리즘
for (int i = 0; i < pos - 1; i++)
{
for (int j = 0; j < pos - 1 - i; j++)
{
if (table[j].getMovie().getTitle().compareTo(table[j + 1].getMovie().getTitle()) > 0)
{
System.out.println("i = " + i + "j = " + j + "pos = " + pos + " ");
MovieTimetable temp1 = table[j];
table[j] = table[j + 1];
table[j + 1] = temp1;
}
}
}
break;
}
}
public void list()
{
int i = 0;
String name = "";
String isEqualName = null;
int firstNumbering = 1;
while (true)
{
if (i == pos)
break;
isEqualName = table[i].getMovie().getTitle();
if (!name.equals(isEqualName))
{
System.out.print("[" + firstNumbering + "]");
System.out.println(table[i].getMovie().getTitle());
name = table[i].getMovie().getTitle();
firstNumbering++;
}
System.out.print(table[i].getScreen().getName() + " : ");
table[i].showTime();
System.out.println();
i++;
}
}
public void remove()
{
String title = null;
String name = null;
boolean isFound = false;
Scanner s = new Scanner(System.in);
System.out.print("삭제할 영화제목 ? ");
title = s.next();
System.out.print("삭제할 영화관 ? ");
name = s.next();
for (int i = 0; i < pos; i++)
{
if (table[i].getMovie().getTitle().equals(title) && table[i].getScreen().getName().equals(name))
{
for (int j = i; j < pos; j++)
{
table[j] = table[j + 1];
}
System.out.println(title + "의 " + name + "상영일정이 삭제되었습니다.");
isFound = true;
pos--;
break;
}
}
if (!isFound)
{
System.out.println("영화 제목 또는 영화관의 명칭이 일치하지 않아서 삭제하지 못하였습니다. 다시 시도해주세요.");
}
}
public void TimetableManagerMain(ScreenManager sm)
{
this.sm = sm;
Scanner s = new Scanner(System.in);
int input = -999;
while (input != -1)
{
System.out.print("상영일정 메뉴 (1.등록, 2.목록, 3.삭제, 0.메인메뉴 ) >> ");
input = s.nextInt();
switch (input)
{
case 1:
add();
break;
case 2:
list();
break;
case 3:
remove();
break;
case 0:
input = -1;
break;
default:
System.out.println("입력오류입니다.");
break;
}
}
}
}
'Programing > JAVA' 카테고리의 다른 글
[Java]영화관 예매 프로그램 완성본 소스코드 (5) | 2019.05.17 |
---|---|
[Java]scanner와 while을 이용한 역으로 점찍기 (0) | 2017.07.13 |
[Java]scanner와 for를 이용한 역으로 점찍기 (0) | 2017.07.13 |
[Java]scanner와 while문을 이용한 점찍기 (0) | 2017.07.13 |
[Java]scanner와 for를 이용한 점찍기 (0) | 2017.07.13 |
irostub
iro의 잡화상점