우아한 프리코스

[우아한 테크 코스]6기 프리코스 1주차 회고록

그zi운아이 2023. 10. 25. 20:08

프리코스 1주차 회고록

우아한형제들의 개발자 양성 프로젝트, 우아한테크코스의 프리코스를 경험하게 된 것은 정말 뜻 깊은 시간이었습니다. 이 프리코스를 통해 많은 것을 배우고 성장하는 기회를 얻었습니다. 아래에는 이 경험에서 얻은 교훈과 느낀 점, 그리고 부족한 부분을 솔직하게 정리해보겠습니다.

 

🚀 기능 요구 사항

기본적으로 1부터 9까지 서로 다른 수로 이루어진 3자리의 수를 맞추는 게임이다.

  • 같은 수가 같은 자리에 있으면 스트라이크, 다른 자리에 있으면 볼, 같은 수가 전혀 없으면 낫싱이란 힌트를 얻고, 그 힌트를 이용해서 먼저 상대방(컴퓨터)의 수를 맞추면 승리한다.
    • 예) 상대방(컴퓨터)의 수가 425일 때
      • 123을 제시한 경우 : 1스트라이크
      • 456을 제시한 경우 : 1볼 1스트라이크
      • 789를 제시한 경우 : 낫싱
  • 위 숫자 야구 게임에서 상대방의 역할을 컴퓨터가 한다. 컴퓨터는 1에서 9까지 서로 다른 임의의 수 3개를 선택한다. 게임 플레이어는 컴퓨터가 생각하고 있는 서로 다른 3개의 숫자를 입력하고, 컴퓨터는 입력한 숫자에 대한 결과를 출력한다.
  • 이 같은 과정을 반복해 컴퓨터가 선택한 3개의 숫자를 모두 맞히면 게임이 종료된다.
  • 게임을 종료한 후 게임을 다시 시작하거나 완전히 종료할 수 있다.
  • 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시킨 후 애플리케이션은 종료되어야 한다.

입출력 요구 사항

입력

  • 서로 다른 3자리의 수
  • 게임이 끝난 경우 재시작/종료를 구분하는 1과 2 중 하나의 수

출력

  • 입력한 수에 대한 결과를 볼, 스트라이크 개수로 표시
1볼 1스트라이크
 
  • 하나도 없는 경우
"낫싱"
 
  • 3개의 숫자를 모두 맞힐 경우
3스트라이크
3개의 숫자를 모두 맞히셨습니다! 게임 종료
 
  • 게임 시작 문구 출력
1"숫자 야구 게임을 시작합니다."
 

실행 결과 예시

"숫자 야구 게임을 시작합니다.
숫자를 입력해주세요 : 123
1볼 1스트라이크
숫자를 입력해주세요 : 145
1볼
숫자를 입력해주세요 : 671
2볼
숫자를 입력해주세요 : 216
1스트라이크
숫자를 입력해주세요 : 713
3스트라이크
3개의 숫자를 모두 맞히셨습니다! 게임 종료
게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.
1
숫자를 입력해주세요 : 123
1볼
..."

회고록

이번에 진행한 숫자야구 게임 미션은 단순한 기능임에도 불구하고, 객체 지향적이고 깔끔한 코드를 작성하기 위해 많은 고민을 필요로 했습니다.

 

1.컨벤션 지키기

첫 번째로, 우아한 테크 코스에서 제시한 코드 컨벤션을 지키는 것에 중점을 뒀습니다. 평소에는 나만 볼 수 있는 코드를 작성하던 경향이 있었지만 이번에는 코드를 다짠 후에 한 번 더 확인하면서 컨벤션에 맞게 코드를 수정하였습니다. 이 과정을 통해 코드의 가독성을 높이고 다른 사람들이 이해하기 쉬운 코드를 작성하는 방법을 배웠습니다.

 

2.객체지향적인 구조 설계

두 번째로, 객체 지향적인 구조를 설계하는 것에 많은 시간을 투자했습니다. 어떤 클래스를 유틸리티 클래스로 설정할지 MVC 패턴을 어떻게 적용할지 등에 대한 여러 가지 고민을 했습니다. 특히, 확장성을 고려하여 Game, Input, Output, View를 인터페이스로 설계하였고, Validator와 Convtor를 유틸리티 클래스로 설정했습니다. 이러한 구조 설계 과정은 구현 시간보다 더 많은 시간을 필요로 했습니다.

또한, MVC 패턴을 적용하여 사용자 인터페이스와 비즈니스 로직을 분리하였고, Validator와 같은 유틸리티 클래스는 싱글턴 패턴을 적용하여 한 번 생성된 인스턴스를 재사용하도록 하였습니다. 이러한 패턴들은 코드의 유지 보수성과 확장성을 향상시키는데 크게 기여했습니다.

3. 람다와 스트림 활용

세번쨰로, Stream과 람다를 적극 활용하였습니다. Stream과 람다를 이용하면 복잡한 로직도 간결하고 이해하기 쉬운 코드로 표현할 수 있으며, 이는 코드의 가독성을 크게 향상시킵니다. 따라서, 이번 프로젝트에서는 이러한 이점을 활용하기 위해 가능한 한 for-loop와 if문 대신 Stream과 람다를 사용하였습니다.

4.단위 테스트 구현

네 번째로, 테스트 방법에 대한 변화가 있었습니다. 전체 시스템을 완성한 후에 직접 실행하여 테스트하는 방식을 주로 사용했었습니다. 하지만 이번 프로젝트에서는 객체 생성, 데이터 변환, 예외 처리 등의 기능에 대해 단위 테스트를 작성하였습니다.  이를 통해 코드의 안정성을 높일 수 있습니다.

5.일급 컬렉션 사용

다섯 번째로, 일급 컬렉션을 사용하여 코드 품질을 높였습니다. 일급 컬렉션은 컬렉션을 포함하는 클래스를 의미하는데, 이를 사용함으로써 비즈니스에 종속적인 자료구조를 만들고 불변성을 보장할 수 있습니다. 
이번 프로젝트에서는 BallIndex, BallNumber, Ball, Balls라는 도메인을 사용하였습니다. 여러 Ball을 Balls라는 일급 컬렉션으로 관리함으로써 관련 로직을 더욱 명확하고 직관적으로 표현할 수 있었습니다. 이를 통해 코드의 품질을 향상시키며, 더욱 객체 지향적으로 코드를 작성할 수 있었습니다.

6.메소드 오버라이딩 활용

여섯 번째로, equals, hashCode, toString 메소드를 적극적으로 오버라이드하여 활용했습니다.
equals 메소드를 통해 객체 비교를 진행하였습니다. 이를 통해 getter를 사용해 값 비교를 하는 로직 대신 객체 자체를 비교하는 코드를 작성할 수 있었고, 이는 코드를 더욱 간결하고 명확하게 만들어주었습니다.
toString 메소드를 오버라이드하여, 객체의 상태를 문자열로 쉽게 변환할 수 있었습니다.

이런 방식으로 equals, hashCode, toString 메소드를 적극적으로 활용하면서, 코드의 가독성과 유지 보수성을 향상시킬 수 있었습니다. 이는 객체 지향 프로그래밍의 중요한 원칙 중 하나인 '객체의 자율성'을 더욱 강조하였습니다.

 

프로젝트 구조

🐣 [구현 코드 보러가기]

https://github.com/xogns4909/java-baseball-6/tree/xogns4909

 

GitHub - xogns4909/java-baseball-6

Contribute to xogns4909/java-baseball-6 development by creating an account on GitHub.

github.com