우아한 테크 코스 프리코스 3주차 후기

우아한 테크 코스 프리코스 3주차 후기

2020, Dec 14    

지하철 노선도 미션 🚇

링크 : https://github.com/lns13301/java-subway-map-precourse/tree/lns13301

회고록

  1. 코드 구현
    • 기능 단위로 분리 후 패키지 단위 분리까지 했다.
    • State(enum)를 사용하여 메뉴 선택 장면을 관리 했다.
    • 다양한 상황에서의 예외 처리를 했다.
    • 예외 상황마다 Runtime Exception 을 따로 구현하여 처리하였다.
    • 프로그램 시작 시 역, 노선 등 필요한 정보를 미리 세팅 했다.
    • Setter 는 구간 생성, 삭제 시 prevStation 을 변경하는 용도로만 사용했다.
    • Getter 는 출력 시 이름이 필요할 때만 사용하고, 정보를 비교할 때는 객체에게 묻고 그 결과를 반환받아서 문제를 처리했다.
  2. 느낀점

    • 우선 2주차 미션과 비교했을 때, 난이도가 많이 상승되어서 당황했었다.
    • 난이도가 상승했다고 느끼게 된 이유는 문제를 이해하는데에 어려움이 있었기 때문이다.
    • 문제에서 요구하는 내용을 정확하게 파악하는데 시간이 많이 소모 되었다.
    • 코드를 구현하는 도중 기능 단위 구현 후 코드를 합치는 것을 어기게 되었는데, 그 순간부터 꼬이기 시작했다.
    • 과감하게 구현한 코드를 기능 단위로 구현하던 시점으로 롤백 후 다시 기능 단위로 구현했는데, 결과적으로 기능 단위로 구현했을 때 오류를 해결하기 쉽고 더 빠른 시간안에 기능을 구현할 수 있다는 것을 알게 되었다.
    • 구현을 끝냈다고 생각했지만, 구간을 추가하는 부분에서 출제자의 의도를 정확하게 파악하지 못한 것을 뒤늦게 알게 되었다.
    • 덕분에 코드를 올바른 출제자의 의도로 고치는데 시간을 더 많이 소모하게 되었다.
    • 이전의 코드보다 리펙토링 할 것이 많아서 시간을 많이 썼지만 그 만큼 새롭게 배운점도 많았다.
  3. 3주간의 프리코스 후기

    • 3주간 학습 과정
      • 😁 프리 코스를 진행하기 전에는 필요한 기능을 구현할 수 있는 능력을 지니고 있었습니다.
      • 😉 기능을 만들고 기능 단위로 분리만 하면 코드가 완성이라고 생각했습니다.
      • 😥 하지만 프리코스를 진행하면서 제가 생각했던 것과는 다르게 신경 써야할 부분이 많았고 모르는 개념들이 많았습니다.

      • 💡 제가 기능 구현은 한 방법은 다음과 같습니다.

        • 출력문을 토대로 필요한 출력문구를 작성한다.
        • 필요한 입력 문구를 작성한다.
        • 다시 필요한 기능을 Class 단위로 작성한다.
        • 필요한 예외처리를 작성한다.
        • 출력문을 단위별로 구현한다.
        • 입력문을 단위별로 구현한다.
        • 기능 별로 구현한다.
        • Class 에 구현한 기능을 분류한다.
        • 예외 처리를 한다.
      • 📝 기본적인 틀을 정해놓고 무조건 순서에 맞게 기능 구현 해보는 학습을 해보았습니다.
      • 😰 이전에는 Main에서 보여주는 형태에 맞춰서 흐름대로 코드를 구현했었는데, 그렇게 하니깐 중간에 기능이 뒤얽히고 이거했다가 저거했다가 하는 느낌이 강했습니다.
      • ⚙ 프리코스에서는 ‘무조건’ 기능 단위로 기능만 먼저 만들고 조립식으로 코드를 짜보았는데, 정말 기능 구현이 잘되고 결과적으로 더 빠른 코딩이 가능했습니다.
      • 🙋 간혹 구현에 필요한 기능이 있을 때는 검색을 통해 찾아보았습니다. 또한 기능 요구 사항이 이해가 안되는 부분은 다른 코스 참가자의 의견 등을 통해 이해했습니다.

      • 📚 다음은 학습한 내용입니다.
        • 1주차 2주차에서는 static 을 이용해서 코드를 구현하면 메모리를 어지럽히지 않고 코드에서 매번 객체를 생성하지 않아도 되서 좋다고 생각했습니다.
        • 하지만 3주차 미션을 진행하면서 위와 같은 행동은 추론이 어려워서 객체 지향에서는 사용해서는 좋지 않다는 것을 알게 되었습니다.
        • 그래서 Output, Input 만 static 을 사용하였고 나머지 클래스는 객체화하여 사용했습니다.

        • 1주차 2주차에서는 단순히 입력에 대한 예외 처리를 했습니다.
        • 사실 예외 처리를 하면서 프로그래밍 했던 경험은 드물어서 예외 처리에는 자신이 없었습니다.
        • 하지만 3주차 미션에서는 다양한 조건들에서 예외를 처리해야하는 상황에 놓여졌습니다.
        • 예외 처리에 부족한 실력인지라 어떻게 하면 좋은 예외를 처리할 지 알아보았습니다.
        • 그래서 기존에 사용하던 예외 처리 방식에서 나만의 예외를 만들어서 처리를 하는 방법을 알아내고 그 방법대로 예외를 처리해보았습니다.
        • 제가 느끼기에는 이 방식으로 예외를 처리했더니 더 보기가 좋았습니다.

        • 프리코스 전까지는 상태를 나타낼 때 상수에 상태 코드를 넣어두고 입력 값과 상수가 일치하면 다음 상태로 넘어가는 방식만 사용했습니다.
        • 하지만 점점 복잡해지는 메뉴처리에서 한계를 느끼고 방법을 모색하여 enum 을 사용하는 방법을 학습했습니다.
        • 아직 능숙한 enum 을 사용할 수 있을지는 모르겠지만, 그래도 enum 을 통한 상태로 메뉴를 구분지으니 훨씬 코드가 보기 좋았습니다.

        • 저는 항상 Getter 와 Setter 를 편리하게 사용해왔습니다.
        • 하지만 접근 메소드와 수정 메소는 내부 데이터와 구현을 노출시켜 악영향을 미친다는 사실을 알았습니다.
        • 클래스의 구현 방식을 바꿔도 외부에 영향이 미치지 않게 코드를 만들어야 한다는 사실을 알았습니다.
        • 그래서 출력에서만 Getter 를 사용하고 Setter 는 사용하지 않는 방향으로 코딩을 해보며 학습했습니다.
        • 예를 들어 지금까지는 객체의 이름이 파라미터로 받은 이름과 같은지를 확인할 때 getName().equals(name) 메소드를 이용했다면 프리코스 과정을 통해서 isEqualName(name) 으로 객체에게 묻고 대답을 받는 형식으로 코드를 구현하는 법을 학습했습니다.
      • 😂 프리코스를 통해 배운게 많지만 어째서인지 배워야 하는 것이 더 많아진 것 같습니다.
      • 🎆 최종 테스트까지 마무리 잘해서 우아한 테크 코스 3기 교육 과정을 받을 수 있었으면 좋겠습니다! 🎆
    • 학습 후기
      • 단일 책임 원칙(Single Responsibility Principle)이라는 것을 알게 되었다.
      • 단일 책임 원칙에 맞게 클래스를 분리해 보았다.
      • 메소드를 한 가지 일만 하도록 구현하고 난 뒤 만든 기능을 활용하여 프로그램을 만들어보니 코드를 분석하는데 쉽고 시간도 적게들고 오류 발생도 적고 혹여나 발생해도 수정하기가 쉬웠다.
      • 몇 줄 안되는 코드, 심지어 단 한 줄의 코드로도 한 가지의 기능을 갖춘 메소드가 된다는 것이 놀라웠다.
      • 예외 처리를 하는 능력도 길러졌다.
      • 이전에는 try~chatch 를 이용한 예외 처리만 했었지만, 이번 프리코스 과정을 진행하면서 RuntimeException 을 상속받아서 예외 클래스를 만들고 예외를 발생시키거나 Java Optional의 orElseThrow() 에서 사용해 보았다.
      • 그 동안 잘못 알고 있었던 개념을 다시 잡는데 도움이 되었다.
      • static 을 사용하면 메모리를 어지럽히지 않기 때문에 좋다고 생각했지만, static 변수는 Global State 이며 이는 추론과 테스트가 어렵다는 점이 있었다.
      • 하지만 객체화하여 인스턴스로 생성하면 테스트 중에 그 변수가 어떤 상태를 가지고 있는지 추론하기가 더 쉬워진다.
      • Getter 와 Setter 를 최대한 쓰지 않는 것도 쉽지 않았다.
      • Setter 는 사용하지 않기, Getter 는 출력할 때만 사용하기를 원칙으로 코딩을 했다.
      • 간단한 미션에서는 의식하고 쓰지 않을 수 있었지만 3주차 미션처럼 복잡해지는 순간 나도 모르게 사용하는 경우가 있었다.
      • 코드 리펙토링을 통해서 사용된 Getter 를 객체에 묻는 형태로 변경하니 코드도 훨씬 간결해지고 좋았다.
      • 하드 코딩 대신 상수를 이용하면서 코딩을 진행해보니 숫자나 단어가 뜻하는 바를 코드에서 바로 이해할 수 있었고 수정이 필요한 경우 상수 값만 변경해주면 되어서 편리했다.
      • enum을 이용해서 메뉴창을 구현하니 복잡한 메뉴의 상태에서도 보기 쉽고 간결하게 코드 구현을 할 수 있었다.
    • 종합 후기
      • 늘 남들과 경쟁을 하면서 학습을 해왔다고 생각한다.
      • 하지만 이번 프리코스를 통해 배운 것은 과거의 나와의 경쟁이었다.
      • 그 과정에서 프리코스를 함께 준비해나가는 사람들은 경쟁자가 아닌 조력자였다.
      • 과거의 나를 이기려면 새로운 나는 성장 해야 한다.
      • 나를 더욱 성장하게 하는 것은 검색을 통한 정보 습득, 독서를 통한 지식 습득도 있겠지만 같은 길을 걷는 동료가 취하는 행동으로부터 얻는 점이 큰 것 같다.
      • 괜히 환경이 사람을 만든다는 말이 있는 것이 아닌 것 같다.
      • 나 혼자와의 경쟁에서는 내 스스로가 만족하면 끝이었다.
      • 하지만 프리코스에서는 나를 이기기 위해 나와 다른 코스 수강생의 협력이 함께 작용했다.
      • 미션을 다했다고 생각할 때 함께하는 수강생의 PR을 통해 미쳐 생각하지 못했던, 부족한 부분을 채워나가고 모르는 것이 있다면 검색해서 지식을 내 것으로 만들었다.
      • 나는 아직 배워나가야 할 것들이 많다.
      • 최종 테스트가 남아있지만 이 테스트 역시 성공적인 결과를 거두어서 뜻이 맞는 좋은 사람들과 함께 우아한 테크 코스 3기 과정을 수료하면 좋겠다.