본문 바로가기
Back-end/멋쟁이사자처럼

[멋쟁이사자처럼] 방학과제 1주차 피드백 정리

by 잔디🌿 2024. 3. 5.

    멋쟁이사자처럼 방학과제가 나왔다.

    https://github.com/alsswl/12th-backend-baseball/tree/alsswl

     

    GitHub - alsswl/12th-backend-baseball

    Contribute to alsswl/12th-backend-baseball development by creating an account on GitHub.

    github.com

     

    구현은 크게 어렵지 않았지만 어떤 것이 좋은 코드인지에 대해 고민하는 과정이 어려웠던 것 같다.

     

    <구현>

    위와 같은 순서대로 구현하였다. 

     

    <피드백 1 : 클래스를 나누어 구현하라>

     

    나는 알고리즘 문제를 풀듯이 모든 메서드들을 한 파일 안에 넣어 구현을 했었다. 하지만 위와 같이 간단한 프로젝트가 아닌 복잡한 기능을 가진 프로젝트를 진행하면 유지보수에 어려움이 있을 것이라고 하셨다.

     

    <피드백 2 : 필요 없는 import는 사용하지 않는다>

     

    원래는 사용되지 않더라도 나중에 추가하는 것보다는 편해서 기본적인 import를 하던 습관이 있었는데 컴파일이 느려진다는 단점이 있다고 한다.

     

    <피드백 3 : 불필요한 주석은 제거한다>

     

    첫번째 구현 때 무조건 주석이 많으면 좋다고 생각하고 모든 함수에 주석으로 설명을 해두었다. 그런데 주석을 많이 달면 코드 가독성이 떨어진다고 하셨다. 주석을 달기 보다는 함수명을 정확하게 해서 주석 없이 이해하도록 하는 것이 좋다는 것을 알게되었다.

     

    <피드백 4 : 접근제어자를 작성한다>

     

    처음에는 거의 모든 메서드들을 default로 해두었고 알고리즘 문제를 풀 때 return하는 과정이 불편해서 변수들을 전역변수 설정하는 습관 때문에 변수도 default로 해두었다. 이제까지 이걸로 문제가 된 적이 없어서 당연히 괜찮을 줄 알았는데 이렇게 하면 코드 유지보수성이 떨어진다고 한다. 

     class는 public으로 설정하고, class내에 있는 메서드 중 외부에서 선언되는 것은 public으로, 선언되지 않는 것은 private로 설정해야한다.

     

    <피드백 5 : LinkedList보다는 ArrayList를 사용한다>

     

    구현 과정 중에서 List가 필요한 부분인데 둘의 차이를 생각하지 않고 LinkedList를 사용했다.

    LinkedList보다는 ArrayList의 성능 차이가 있다는 피드백을 듣고 두 리스트 간의 차이를 알아보았다.

     

    ArrayList는 각각의 원소들이 인덱스를 가지고있다. 반면 LinkedList는 앞 원소의 주소와 뒤 원소의 주소를 가지고있다.

    각각의 시간복잡도는 위와 같다.

    데이터를 검색하는 시간복잡도가 ArrayList는 O(1)이고 LinkedList O(n) 인 것을 알 수있다.

    하지만 데이터를 추가하거나 삭제하는 것은 LinkedList가 ArrayList보다 효율적이다.

     

    내가 했던 프로젝트에서의 리스트는 검색의 기능이 더 컸다. 그래서 LinkedList보다는 ArrayList가 효율적이라는 것을 알 수 있다.

     

    <피드백 6 : 매직넘버를 사용하지 않는다>

     

    위와 같이 독자 입장에서 숫자만 보고서는 의미를 파악할 수 없는 수들을 매직넘버라고 한다. 

    나의 경우 게임 종료이면 0을 리턴하고, 아니면 1을 리턴하도록 했다. 

    위 코드의 가독성을 높이기 위해서

    이렇게 상수를 선언하고

    코드에 적용하여 매직넘버를 해결하였다.

     

    <피드백 7 : 객체지향적인 설계를 하기 위해 노력하자>

     

    각 클래스, 메서드가 하는 역할을 정하고 오직 그 역할을 하도록 프로그래밍 해야한다.

    나는 객체지향을 아직 다뤄본 적이 없어서 이 부분이 많이 헷갈렸다. 운영진분께 물어보니

    객체지향의 사실과 오해, 오브젝트 책을 추천해주셨다. 

    현재 두 책을 구입해서 읽고 있다. 확실히 객체지향적인 설계가 어떤 것인지 이해하는데 도움이 많이 되는 것 같다.

     

     

    사실 과거에 같은 과제를 해 본 적이 있는데, 그때는 내 코드에 대한 피드백이 없었어서 테스트케이스가 잘 돌아간다는 이유만으로 내가 프로그래밍을 잘 한줄 알았다. 

     막상 이렇게 피드백을 받고 수정해보니까 내가 아직 많이 부족하다는 것을 느꼈고, 점차 나아지는 코드들을 보면서 뿌듯했다!

     

    앞으로 더욱 좋은 코드를 짤 수 있도록 노력해야겠다.