ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JAVA | 명품 JAVA / 4장 12번 실습문제 코드 공유 / 생각정리
    Java 2022. 10. 28. 00:32

    https://github.com/chomu97/JavaPractice/blob/main/Chapter04Ex12.java

     

    GitHub - chomu97/JavaPractice

    Contribute to chomu97/JavaPractice development by creating an account on GitHub.

    github.com

     


    먼저 코드를 구현하면서 무슨 생각을 했는지 정리해보겠다.

    기본적인 틀은 앞의 글에서 말한 것처럼 구현했다고 생각했다. 각각의 클래스를 만들면서 했던 생각을 정리해보자.

     

    가장 기본적인 클래스인 Seat 클래스는 최대한 간단하게 만들어보려고 했다. 왜냐하면 필요한 데이터는 이름만 저장하면 되었기 때문에 좌석번호나 등급을 나타내는 필드 변수는 필요없지 않나 ? 라는 생각이었기 때문이다. 따라서 그 변수들은 후술할 클래스인 (DAO라고 생각되는 ) Today 클래스에 Seat 2차원 배열을 생성해 0차원의 인덱스를 차례대로 S, A, B 등급이라고 생각하고, 1차원의 인덱스를 좌석의 번호라고 생각하기로 했다. 메소드는 setter와 getter, 생성자로 마무리지었다.

     

    다음으로 Today 클래스이다. Today클래스에서는 최대한 System.out.print(f,ln) 문을 쓰지 않으려고 했고, 단순히 Seat 데이터에 대한 접근 및 후술할 SystemManager 클래스로 리턴해 줄 데이터만 신경썼다.

    이 클래스에서 애매하다고 생각했던 점은 GRADES (=3) 와 SEATS (=10) 변수를 Today 클래스에 public static final int로 선언해주었는데, SystemManager에서 반복문을 돌리면서 몇 번 사용하게 되었는데 이게 괜찮을지에 대한 생각이 들었다. 과연 어디에 선언해주는 게 좋은지에 대한 고민이었다. ( 하지만 답은 아직 안나옴.. )

    다른 고민으로는 Today 생성자에서 seatArr을 생성하면서 객체를 30개씩 만들어 주게 되는데 이게 메모리에 괜찮을까 하는 생각도 들었다. 만약 10월만이 아니라 1년짜리 예약 시스템으로 확대한다면? 이게 괜찮을까?? 버틸까?? 하는 고민이 있었다. 해결 방법으로 만약 해당 날짜에 예약을 한번도 안했다면 사용하는 시기에 맞추어 Seat 배열을 생성하는게 낫지 않을까 하는 생각이 들었다. 다만 이 방법을 구현하고 싶었으나 어떻게 초기화해야할 지 몰라서 .. Pass ...해버렸다..

     

    마지막으로 제일 시간이 오래걸렸던 SystemManager클래스이다. 여기에서 run()메소드를 통해 전체적인 시스템을 구동하려고 했고 ( Controller의 역할 ), 이에 따라 화면에 출력해야 할 메소드들을 여기서 모두 선언해주었다. ( View의 역할 ) 사실 구현하면서도 MVC에 대해서 배우지도 않고 그냥 내가 클래스만 배우고 짜보는 거라서 내가 지금 하는 말이 맞는지는 모르겠다. 또 내가 구현한 코드가 실제로 그렇게 구현을 하고 있는지도 알 수 없었다. 하지만 지금은 구현을 잘 해보는 것이 목적이라고 생각되었기 때문에 일단 깔끔하게 짜자는 생각을 버리고 코드를 작성하였다.

    시간이 오래 걸렸던 이유중 하나가 달력을 출력하면서였는데, 2022년 10월 달력과 똑같이 출력하려다 보니 for loop도 많이 들어가고 특히 조건을 나누는 데 시간을 많이 썼다. 진짜 더럽게 짠 코드다.. 라고 생각되는데 일단 여기에 집중하는 것보다 일단 제대로 출력되는지만 확인해보고 다른 메소드 구현이나 데이터 접근에 대한 내용이 더 중요하다고 생각되어 제대로 출력되는 것만 확인해보고 더이상 고민하지 않았다.. ( 심지어 한 주에 1줄씩 출력이 아니라 2줄씩 출력이었기 때문에 더 더러워졌다고 생각한다 ..)
    처음에 SystemManager를 작성할 때에는 input이 필요할 때  Scanner객체를 사용하며 next(), nextInt()를 메소드 내에 변수를 생성하면서 받아왔는데, 모든 프로그램이 잘 돌아가는 것을 확인한 이후 예외처리에 대한 작업을 시작하였다. 어떤 식으로 하면 한번에 예외처리할 수 있을까..? 라는 생각에 String이든 Int이든 그냥 validateInput() 메소드를 만들어서 각각 리턴해주면 안될까 라는 좋지 못한 생각을 강사님께 여쭤보았는데, 말도 안되는 생각이라며 ... 최대한 간단하게, 각각 구현하라는 답변을 들었다. 이에 validateInputInteger() 메소드를 구현하게 되었는데, 항상 System.out.print()가 input을 받는 위에 작성되어 있어서 이게 마음에 들지 않아 매개변수로 받게 되었다. ( 이렇게 생각하면서 파이썬 강사님이 클래스를 구현하면서 얘기하시던 말이 떠올랐다 .. "나중에 하다보면 이걸 함수로 만들면 되겠는데? 하실 거에요~" ) 정수를 받으면서 InputMatchException 에러는 try-catch로 해결하고, IndexOutOfBoundsException은 애초에 정수를 받아오기 때문에 정수의 범위 또한 매개변수로 입력받았다. String을 input 받는 부분은 모두 이름을 입력하는 부분이었기 때문에 validateInputKoreanName 메소드를 구현하여 한국어를 입력하지 않으면 넘어가지 못하도록 구현하였다. 그렇게 메소드를 하나 구현해두고, run()메소드에서 input이 필요한 곳이라면 String 넣어주고 가져다 쓰니까 엄청 편리했다!!여기서 아쉬웠던 점들이라면 첫째로 달력 출력.. 나중에 1년짜리 달력 출력해야된다면 어떻게 구현할래? 하는 물음이 있었고 둘째로 Today 클래스에 선언해둔 상수들을 여기서 사용했던 점 (이건 아쉬운 점보다 어떻게 하지?하는 느낌) 이 있었다.

     


    내가 짠 이 코드는 사실 혼자 생각해서 만든 코드라서 12번 문제가 원하는 정답과는 거리가 멀 수 있다. 또한 최적화된 코드인지도 내가 작성했기에 판단할 수 없다.( 아쉬운 점 말고는 그래도 최대한 잘, 깔끔히 작성해보려고 노력했다.) 하지만 문제에서 요구하는 요구사항들은 최대한 만족해가면서(Ex: 출력 내용들, 이름을 입력받아 취소하는 기능들..) 내가 원하는 기능을 추가하려고 했기 때문에 어느 정도 문제의 답이 섞여 있다고는 얘기할 수 있을 것 같다. 만약 이 문제의 답만을 원해서 들어온 분들이라면 도움이 못 될 것 같아 죄송스럽지만( 너무 복잡하다고 생각함.. ) 오늘 내 8시간의 결실을 정리해두기 위함이 크기 때문에 어떤 생각을 가지고 이 문제를 풀게 되었는지만 확인해보면 될 것 같다.

     


    10/28 추가::

     

    1. 오늘 강사님 수업 이후 위의 고민 중 하나 해결.

    input 을 받았을 때 객체 배열에 생성자를  호출해서 넣어주는 방법이 더 적절했을 것이라고 생각함. 

    Chapter4 Example 7번에서 MonthSchedule input 메소드

    workArr[day-1] = new Day(work); 해주는 것처럼, 날짜를 입력받은 뒤에 배열의 그 부분만 생성해주면 된다..!

    Output은??

    Chapter4 Example 7번에서 MonthSchedule output 메소드

     

    2. bean 클래스에 toString 메소드를 Override 해주면 Arrays.toString(workArr) 을 print해주면 리턴해준 값에 따라 String이 나오게 된다.

     

    3. 수업을 더 듣다보니까 두번 째 고민도 해결됨.

    Chapter4 Example7번에서 inerface

    인터페이스를 배우지 않아서 내가 몰랐던 부분이었는데 인터페이스에서 상수 필드를 정의해주면 되는 것..!

    다른 클래스에서 interface를 사용하려면 implements Resource해주면 된다.

     

    4. 위에서 내가 고민해보지 않았던 점 중 하나는 과연 객체 지향 프로그래밍을 한 것인가..? 라는 점이었다. 오늘 7번 문제를 풀어주시면서 객체 지향 프로그래밍을 하려면 어떻게 할 지에 대한 코드를 보여주셨는데 다음 글에서 공유하도록 하겠다. 아직 파이썬만 써본 나에게 와닿지는 않았다.

     

    5. 코드에서 고쳐야 할 점 중 하나가 인덱스에 접근할 때 메소드에 (number -1 ) 을 매개변수로 넣는 게 아니라 메소드에서 index = number -1 처리를 해주는 것이 더 낫다.

     

    'Java' 카테고리의 다른 글

    JAVA | 명품 JAVA / 4장 12번 실습문제를 풀기전 생각정리  (0) 2022.10.27

    댓글

Designed by Tistory.