JAVA | 명품 JAVA / 4장 12번 실습문제를 풀기전 생각정리
요즘 자바를 배우기 시작해서 파이썬에 대한 글을 많이 못썼다 ... 반성한다 내자신 ..
자바에서 클래스를 배우면서 4장 연습문제들을 쭉 풀어보았는데, 11번까지는 내 마음대로 수정할 수 없어서 그냥 쉽게 풀었다. 학원에서 오늘 하루종일 자습시간( 무려 8시간이나..! )을 주길래, 어제와 그제 새벽까지 11번을 미리 풀어와 12번을 여유롭게 풀어볼 수 있었다. 근데 이것마저 할만하다! 라는 느낌이 들어서 ... 같은 4장 7번 실습문제에 있던 MonthSchedule이 떠올라 그냥 무작정 달력도 추가해보자는 아이디어로 이 문제를 시작하게 되었다 ..
어제 새벽에 11번을 풀고 나서 12번은 대강 틀만 짜놓고 자자~ 해서 만들어진 코드
class Seat{
private String name;
private int number; // number도 배열 객체로 만들어서 접근할텐데 굳이 필요할까 싶은 생각
// String type; // 이거는 해줄지 말지 고민해봐야함.
public Seat() {
name = "---";
}
public Seat(int number) {
// 좌석의 정보를 세팅해주는 생성자.
name = "---";
this.number = number;
}
public String getName() {
return name;
}
public int getNumber() {
return number;
}
public void setName(String name) {
// 예약 시 호출해주는 메소드
this.name = name;
}
public void getInfo() {
// 조회 시 호출해주는 메소드
}
public void cancel() {
// 취소 시 호출해주는 메소드
}
}
class Today{
Seat[][] seatArr = new Seat[3][10];
int remain;
public Today() {
for (int i=0; i<3; i++) {
for (int j=0; j<10;j++) {
seatArr[i][j] = new Seat();
}
}
remain = 30;
}
public void reserve() {
// systemManager에서 예약 시 호출해주는 메소드
}
public void show() {
// systemManager에서 조회 시 호출해주는 메소드
}
}
class SystemManager{
public static final Scanner scan = new Scanner(System.in);
Seat[][] seatArr = new Seat[3][10];
Today[] currMonth = new Today[31];
public void finish() {
// 끝내기 선택 시 호출해주는 메소드
}
public void show() {
// 조회 시 호출해주는 메소드
System.out.println("<<< 조회를 완료하였습니다. >>>");
}
public void showCalendar() {
System.out.println("------ 예약 현황 ------");
}
public void run() {
// systemManager 실행 메소드
System.out.println("<<<<<< 명품 콘서트홀 10월 예약 시스템입니다 >>>>>>");
int day = 0;
System.out.print("며칠을 예약하시겠습니까?");
int menu = 0;
while(menu != 4) {
System.out.print("예약:1, 조회:2, 취소:3, 끝내기:4 >> ");
menu = scan.nextInt();
}
}
}
일단 뭐 이런식으로 클래스를 짜놓으면 되지 않을까 ? 라는 생각에 그냥 무작정 메소드부터 정의하고 보았다.
패키지 내에 Day라는 클래스가 존재해서 이 문제에서는 Today라는 클래스를 만들어주었다.
이렇게 다음날, 막상 구현하려고 하니 생각보다 사용하는 메소드끼리 꼬이는 느낌이 들고 SystemManager에서 Today의 메소드를 실행하고 Seat의 메소드를 실행하고 ... 하는 꼬리를 무는 생각에 다시 깔끔하게 정리하고 시작하자! 라는 생각이 들었다.
결국 메모장을 켜서 .. 꼭 필요한 메소드들이 무엇일지 생각해보면서 정리를 하게 되었다.
- class Seat
- private String name
- 생성자
- getName() :: 조회 시 이름 반환
- getNumber()
- reservation() :: 예약 시
- 좌석 구분
- 이름 입력
- cancel() :: 취소 시
- class Today
- Seat[][] seats = new Seat[3][10];
- int remain; // 잔여 좌석 ( 30 초기화 )
- 생성자
- reserve() :: systemManager에서 호출
- 몇번좌석 예약?
- Seat[number-1].setName()
- show() :: systemManager에서 조회시 전체 좌석에 대한 뷰를 보여준다?
- showRemain() :: 이번 달에 잔여 몇석인지 알려주려고 함
- class systemManager
- Today[] October = new Today[31];
- 생성자
- run() :: 전체적인 실행
- finish() :: 사용자가 끝내기 선택시 종료
- showDay() :: 사용자가 조회 선택시 며칠을 조회할건지 물어보고 그 날짜 조회
- reservationDay() :: 사용자가 예약 선택 시 며칠을 예약할건지 물어보고, 그 날짜를 예약하는 함수
- October[input-1].reserve();
- showCalendar() :: 며칠 예약하려는지 물어볼 때 + 첫 시작시에 달력 ( 날짜 + 잔여석 ) 보여주는 함수
- 먼저 문제에서 요구하는 사항이 무엇인지, 필요한 데이터는 무엇인지 정리를 꼭 해야한다.
- MVC에 대한 설명 (Model, View, Controller)
- 디자인 패턴 : Template Method
- IOC에 대한 이야기 ..
사실 이렇게 쭉 듣고 1번, 2번에 대해서는 확실하게 이해했다고 생각했다. ( 아닐수도 있습니다.. ) 3번, 4번에 대한 얘기는 구글에 검색해보세요~ 했기에 나중에 때가 되면 공부한 후에 다시 블로그에 글을 쓰도록 하겠다.
그래서 2번까지만 생각해보면서 메모장에 적어둔 (내가 미리 생각해보았던) 클래스들로 얘기하자면, Seat클래스는 bean이 되고, Today클래스는 Data Access Object가 되었으며, SystemManager는 (사실 이렇게 권장하신 건 아니었지만) View + Controller 역할을 맡게 되었다고 생각했다. 강사님께서는 'View와 Controller를 나누어 클래스를 작성한다.' 라고 하셨지만 일단 구현이라도 되고 나서 고민해보자 .. 라는 생각에 일단 클래스 세개만이라도 잘 만들어보자고 생각했다.
강사님께서 해주신 View에 대한 얘기는 아래에 있다. 아까 들었던 얘기를 기억해내면서 쓴거라 틀린 내용이 있을 수 있다.
" 만약 내(씨치)가 짠대로 구현한다면, PrintManager를 만들어 준다면 output처리, input 처리는 모두 PrintManager에서 하면 됩니다. 그러면 PrintManager를 다른 클래스에서 상속받아 사용하면 되죠. Controller에서는 단순히 메소드들을 불러와서 데이터를 처리해주기만 합니다. "
우리는 아직 상속을 안배웠기도 하고 .. (파이썬을 했기에 대강의 개념은 알 것 같다.) 강사님께서 상속받아서 사용하면 웹 환경이든/ 도스 환경이든 어디든 사용하면 된다고 얘기했었다. 그래서 나는 머릿속으로 이런식으로 생각했다.
// 이런식으로 PrintManager를 만들면 어떤 환경( dos든, Android든, web이든)에서도 PrintManager를 상속받아 사용하면 output을 보여줄 수 있다.
그렇다면 어느정도 생각의 정리가 끝났다고 생각하여 작업 시작!
결과는 다음 글에서 이 코드를 짜면서 했던 생각들과 예외처리들을 정리하면서 따로 확인해야겠다.
10/28 추가 ::
View를 상속받아서 다른곳에 쓰면 된다는 얘기는 위에 써놓은 말이 아니었다... 그냥 이상한 소리 써놓은거임..
interface에서
interface Resource{
Menu menu = new Menu();
Input input = new Input();
Output output = new Output();
View[] viewArr = {menu, input, output}; // 여기서 모든 원소는 View를 상속받아야 한다.
}
가비지가 생성되지 않도록 interface안에 클래스를 생성해주고, Menu, Input, Output 클래스는 모두 View 클래스를 상속받는다.
class View{
public void display(){
}
}
class Menu extends View{
public void display(){
System.out.print("메뉴");
}
}
class Input extends View{
public void display(){
System.out.print("::INPUT::");
}
}
class Output extends View{
public void display(){
System.out.print("::OUTPUT::");
}
}
이렇게 3개의 클래스 모두 View를 상속받아서 View 배열을 만들어 줄 수 있도록 하는 것이다 ... 이런 아이디어는 상상치도 못했다..