본문 바로가기
우아한테크코스/1주차 프리코스

[1주차 프리코스] 3 ~ 4일차 리뷰

by 행복한라이언 2023. 10. 21.
728x90
반응형

1. TODO 체크

▶ 1. 컬렉션 이터레이터, 제네릭, Wrapper 클래스 학습하기

2. 학습한 내용 정리하기(컬렉션 - 리스트, 맵, 셋)  / Wrapper 클래스

3. 추가 리팩토링 진행

  예외처리 학습하기

 JAVA 스터디: https://happy-ryan.tistory.com/38

 

[Java] 1주차 스터디 - 파이썬 list 자바 Array, ArrayList 에 대해!

1. Array 연관된 data를 메모리상에 연속적이며 순차적(ordered)으로 미리 할당된 크기(fixed-size)만큼 저장하는 자료구조 장점: 조회가 매우 빠름 단점: 미리 할당된 크기를 선언해야하므로 메모리 낭

happy-ryan.tistory.com


2. 진행상황

1) Java 1주차 스터디 진행

2) Wrapper클래스에 대한 학습 진행 

3) 리팩토링 진행 


3.  리팩토링

[ 2차 리팩토링 전 ]

  • 변경: 각 역할에 맞게 최대한 분리
    • Application 클래스
    • Game 클래스
    • GameRule 클래스
      • countBallAnsStrike: computNumber와 userNumber의 교집합을 통해서 Ball과 Strike 세기 
      • countStrike: 순회하면서 같은 위치에 있는 수,즉 Strike 세기
      • hintProvider: Ball과 Strike 수에 따른 힌트 제공
    • BaseBall 클래스
      • creatNumber: 서로다른, 1~9로 구성된, 자연수 생성
    • ExceptionHandler 클래스
      • isAllDigit: 숫자 외 입력이 있는지 판단
      • isValidLength: 3자리 숫자인지 판단
      • isValidNumber: 0이 포함되거나 중복되는 숫자가 있는지 판단
    • Constants 인터페이스: 상수를 관리하기 위해서 도입
      • validLength: 현재 숫자야구게임은 3자리이다. n자리까지 확장될 수 있도록 변수로 관리

[ 2차 리팩토링 후 ]

  • 변경 사항: 객체를 더 현실적으로 분리 및 개체의 역할에 대한 고민
    • User, Computer, Game(System) 객체를 생성하고 각각에 맞는 역할 부여
      • Game클래스: 기존의 Game 클래스(https://happy-ryan.tistory.com/35)는 너무 많은 역할을 담당했다. User의 역할과 Computer의 역할을 모두 가지고 있었다. 그러므로 User와 Computer 클래스를 생성해서 Game클래스의 부담을 줄인다. 포인트 중 하나는 Game이 시작될 때 User와 Computer가 발생하므로 Game클래스 생성자에서 User, Computer인스턴스가 생성되도록 한다. 또 Game(System)에서 결과가 콘솔 창에 출력되도록 한다. 이는 User와 Computer의 역할이라고 할 수 없다. 즉, Game 클래스를 정의하면 User와 Computer 사이의 게임 중재자역할, 비유하면 카지노에서 플레이어들 사이에서 중개를 하고 결과를 보여주는 딜러 역할이라고 할 수 있다.
      • Computer클래스: 기존 BaseBall에서 숫자를 생성한다고 정의했는데 이는 Computer의 역할에 해당한다. 그러므로 BaseBall클래스를 Computer 클래스로 변경했다.
      • User클래스: User클래스의 역할은 매우 간단하다. 숫자를 입력만 하면 된다.
        • Computer와 User가 Game하는 것을 play()라는 메서드로 메서드명을 통일시켜서 사용한다.
        • Computer의 play()는 받은 입력에 대한 숫자 야구 힌트를 제공하는 것이다.
        • User의 play()는 입력을 하는 것이다.
    • Constants Inteface에서 관리하기
      • 상수와 문자열 메세지 모두 Constants Interface에 관리한 이유는 리팩토리를 하는 과정 중에서 문자열 복사붙여넣기를 잘못해 테스트코드에 실패를 몇 번 했다. 아무래도 사람 하는 일이다보니 그런 사소한 실수가 일어나는데 이게 2번 정도 반복이 되니 상수처럼 관리하는 것이 좋다는 생각을 해 문자열 메세지도 validLength처럼 Constants Interface에서 관리하도록 한다.
    • Application과 Game에 대한 역할 고민
      • 기존에는 Game클래스에서 while문을 반복해 맞출 때까지 계속 반복하도록 만들었고 맞춘 이후에는 "2"를 입력을 받아서 게임을 종료시키거나 "1"을 입력 받아서 게임을 반복하도록 코드를 만들었다. 즉, Game 클래스 안에서 ⓐ 정답 맞출 때까지 입력 반복 || ⓑ 게임이 종료될 때까지 게임 반복 이라는 while문 2개 들어간 상황이 만들어진 것이다. 이것도 Game 클래스가 무진장 커진 이유 중 하나이다.
        • Game의 역할은 정확히는 ⓐ정답 맞출 때까지 입력 반복 만 의미한다. 따라서 Game 내부에서는 정답을 맞추는 것까지만 진행하면 된다. 즉, 게임은 1판 자체만을 의미해야한다. 게임을 재반복하는건 Game 클래스의 역할이 아니다.
        • 게임을 재반복하는 역할은 메인, 즉 Application에서 담당한다. 입력에 따라서 게임이 다시 진행될지 아닐지 판단한다.
    • ExceptionHandler에 대한 역할 고민
      • 기존에는 Game 클래스에서 에러를 처리했는데 이는 Exception Handler의 역할이다. 따라서 3개의 예외처리는 raiseException으로 묶고 Game 클래스에서는 각 에러에 대해서 보이지 않도록 한다.

4. pickUniqueNumbersInRange() 에러 발생!

    public static List<Integer> pickUniqueNumbersInRange(
        final int startInclusive,
        final int endInclusive,
        final int count
    ) {
        validateRange(startInclusive, endInclusive);
        validateCount(startInclusive, endInclusive, count);
        final List<Integer> numbers = new ArrayList<>();
        for (int i = startInclusive; i <= endInclusive; i++) {
            numbers.add(i);
        }
        return shuffle(numbers).subList(0, count);
    }

 

▷ 게임 종료 후 재시작 에러 발생


TODO

리팩토링 정리하기★

▶ pickUniqueNumbersInrange()메서드 사용시 에러 발생하므로 해결하기

 

예외처리, Wrapper Class, 이터레이터 정리하기


소감

  어떤 역할이 필요한지 고민하고 나눈 역할들이 어떤 일을 하는지에 대해서 깊은 고민을 할 때 좋은 객체지향 코드가 나올 수 있을 것 같다. 우리가 게임을 하면 당연히 플레이어 2명과 둘 사이를 중재해주는 시스템이 존재한다. 그런데 처음에는 모든 것을, 즉 플레이어 2명의 역할을 중재해주는 시스템에게 맡기는 코드를 만들어서 시스템에 해당하는 Game 클래스가 엄청 비대해지는 결과가 발생한 것이다.

 또 Game 자체는 단판이다. 우리가 게임을 다시하는 것은 그 단판이 끝나고 새로운 게임을 하는 것이다. 따라서 Game 클래스 자체에서 Game을 다시 진행할지 안할지에 대한 판단을 부여해서는 안된다. 이러한 생각을 바탕으로 객체를 다시 생성하고 리팩토링 했으며, 따라서 현재 내 코드는 크게 4가지의 객체가 있다.

  • Application(main): 게임의 시작을 알리고 그 게임이 종료되었을 때 그 후에 게임을 반복할지 안할지는 판단하는 객체
  • Game: User와 Computer 사이의 중개자로, User에게 입력 받은 값을 Computer에 알려주고, 받은 값을 바탕으로 Computer가 만든 hint를 User에게 제공하는 객체 &중개자 역할을 하며 User가 정답을 입력하면 게임을 종료시키는 객체
  • User: 숫자야구의 입력을 담당하는 객체
    • ExceptionHandler: User의 입력을 예외처리하는 객체
  • Computer: User의 입력에 대한 Ball와 Strike의 숫자 제공
    • GameRule: User의 입력에 대한 Ball과 Strike의 숫자가 얼마인지 계산하는 객체
  • Constants Interface: n자리 야구 게임을 위한 validLength 및 문자열 메시지를 관리하는 객체

Java 1주차 스터디 인증을 완료했다. 기존에 Python-list와 Java-ArrayList, Array와 어떤 관계가 있을까, 어떤 차이가 있을까에 대한 고민이 있었다. 스터디를 위해서 공부해보니 add 메서드에 대해서 아주 깊이 학습을 해서 둘 사이의 차이점에 대해서도 명확하게 알게되었고 오랜만에 CS지식 점검도 다시한 것 같아서 조금 깊에 파긴 했지만 재밌었다. 

 

 프리코스 1주차임에도 불구하고 정말 많이 배우고 있다는 것을 느낀다. 기존에 나는 원리를 전부 알아내는 것도 중요하게 생각하지만 적당한 납득 이후에 우선 이것을 사용하고 이후에 이해를 하는 선납득 후이해 방식을 택한다. 우테코 프리코스를 하면서 빠른 시간 내에 구현을 위해서는 이런 방법이 나쁘지 않게 느껴졌고 또 우테코를 하면서 효과적인 학습 방법이 무엇인지, 왜 미션기반의 학습을 우테코에서 채택했는지 점점 알게되가는 것 같다.

 

 

 

 

728x90
반응형