본문 바로가기

우테코

우테코 3주차 - [로또] 요구사항 분석 + 기능구현목록 작성

 

우테코 3주차 미션은 [로또]였다.

 

자세한 내용은 다음 github 링크에서 볼 수 있다.

 

그럼 프로그래밍 요구사항에서 나타낸

이번 주차의 중요한 점들을 검토해보자

 

1. 프로그래밍 요구사항 분석


1-1. 프로그래밍 요구사항

  • indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다.
    • 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다.
    • 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메서드)를 분리하면 된다.
  • 3항 연산자를 쓰지 않는다.
  • 함수(또는 메서드)가 한 가지 일만 하도록 최대한 작게 만들어라.
  • JUnit 5와 AssertJ를 이용하여 본인이 정리한 기능 목록이 정상 동작함을 테스트 코드로 확인한다.

1-2. 추가된 요구사항

  • 함수(또는 메서드)의 길이가 15라인을 넘어가지 않도록 구현한다.
    • 함수(또는 메서드)가 한 가지 일만 잘 하도록 구현한다.
  • else 예약어를 쓰지 않는다.
    • 힌트: if 조건절에서 값을 return하는 방식으로 구현하면 else를 사용하지 않아도 된다.
    • else를 쓰지 말라고 하니 switch/case로 구현하는 경우가 있는데 switch/case도 허용하지 않는다.
  • Java Enum을 적용한다.
  • 도메인 로직에 단위 테스트를 구현해야 한다. 단, UI(System.out, System.in, Scanner) 로직은 제외한다.
    • 핵심 로직을 구현하는 코드와 UI를 담당하는 로직을 분리해 구현한다.
    • 단위 테스트 작성이 익숙하지 않다면 test/java/lotto/LottoTest를 참고하여 학습한 후 테스트를 구현한다.

1-3. 메일에 드러나 있는 3주차 미션의도

- 클래스 분리

- TDD 작성


2.  기능구현 목록 작성

 

2-1) MVC 패턴 학습

우선 이번 미션은 구현에 감이 잘 잡히지 않았다.

특히 클래스 객체에 있어서 다음 문장이 마음에 걸렸다.

  • 핵심 로직을 구현하는 코드와 UI를 담당하는 로직을 분리해 구현한다.

이에 프로그램 설계모델을 찾아보았고 MVC 패턴을 알게 되었다.

 

https://m.blog.naver.com/jhc9639/220967034588

 

[개발자 면접준비]#1. MVC패턴이란

오늘은 개발자면접에 많이 나오기도 하는 MVC패턴에 대해서 알아보고자 합니다. 과연 MVC패턴이 무엇...

blog.naver.com

 

출처 : 오픈듀토리얼스

MVC 패턴이란 Model, View, Controller의 약자로

하나의 프로젝트 구성 요소를 3가지 역할로 나눈 것을 의미한다.

 

그중 View가 UI이고, 핵심 로직이 Controller라는 점에서

프로그래밍 요구사항과 알맞은 모델이라 생각했다.

 

이에 맞춰 기능구현목록과 예외사항을 작성해보았다.

 


2-2) 기능구현 목록 작성

## 기능 목록
- [0] 로또 구입 금액을 입력받기.
    -[0] 한장당 1-45까지 6개의 수 생성
    -[0] 로또번호는 오름차순으로 정렬

- [0] 당첨번호 입력받기
  - [0] 서로 다른 6개의 수를 입력
  - [0] 입력한 수를 오름차순 정렬
  - [0] 보너스 번호를 입력받기

-[0] 사용자가 구매한 로또번호와 당첨번호 비교
-[0] (로또번호, 당첨금액) enum 클래스 생성
    -[0]  5등 : 3개 일치 - 5_000원
    -[0]  4등 : 4개 일치 - 50_000원
    -[0]  3등 : 5개 일치 - 1_500_500원
    -[0]  2등 : 5개 +보너스 일치 - 30_000_000원
    -[0]  1등 : 6개 일치 - 2_000_000_000원

- [0] 당첨금액을 기반으로 수익률 출력
  - [0] 수익률은 소수 둘째 자리에서 반올림

 


2-3) 예외 발생사항들 정리

 

## 예외 발생사안
- [0] 로또 구입 입력받기
    - [0] 1000원으로 나누어 떨어지지 않을 경우
    - [0] 양수가 아닌 수를 입력했을 경우
    - [0] 숫자가 아닌 경우

- [0] 당첨번호 입력받기
    - [0] 중복되는 숫자가 있을 경우
    - [0] 6개보다 많거나 적은 숫자를 입력할 경우
    - [0] 범위를 넘어선 숫자가 있을 경우

 

유의한 점 및 느낀 점

 

1. 기능목록을 큰 흐름을 중심으로 작성하려 노력했다.

- 2주차 공통 피드백에서 마음에 와닿았던 문구 중 하나가 바로 README.md 문서를 살아있는 문서로 만들라는 피드백이었다. 이에 처음부터 프로그램 설계를 자세한 부분까지 모두 설계하기보다 일단 큰 맥락을 만들어두고, 프로그래밍 과정에서 더 좋은 방법을 검토하며 수정하기로 마음을 먹었다. 이렇게 생각하니 조금 마음이 편해졌고, 더 큰 맥락들이 잘 보이기 시작했다.

 

2. TDD 작성과정

: 우선 TDD 작성과정을 제이슨님 강의를 통해 다시 복습해보았다.

: 이후, 우테코 포비님의 강의가 유투브에 올라와있어 추가학습할 생각이다.

https://youtu.be/bIeqAlmNRrA

 

우선 유투브 댓글에 적혀져있는 요약본을 살펴보면 다음과 같았다.

- 메소드분리

- 인벤트(들여쓰기2) 줄이기 -> 메서드로 분리하기

- Else 예약어 쓰지 않기

- 메소드가 한가지 일만 하도록 구현

- 로컬 변수가 정말 필요한가?

- compose method 패턴 적용

- 메소드 라인수 제한 15->10라인

 

=> 이는 3주차 메일에도 잘 녹아있는 부분이라 더 유의해보기로 했다.

중요한 건 의식하는 자세라고 말씀하셨으니!

 

3. enum 사용이 필요한 이유를 생각해보자

enum 사용에 대한 요구사항이 있어서, 왜 enum이 사용되는지 그 이유와

여러 컬렉션들을 살펴보고자 했다.

 

1. 클래스처럼 보이게 하는 상수

2. 서로 관련있는 상수들끼리 모아 상수들을 대표할 수 있는 이름으로 타입을 정의하는 것

3. Enum 클래스 형을 기반으로 한 클래스형 선언 

 

출처 : https://limkydev.tistory.com/66

 

특히 enum에서 각 상수값에 따라 문자형과 같은 다른 자료를 연결시킬 수 있다는 점이 유용해보였다.

로또 당첨 순서별로 각각 출력해주어야 하는 문자열 값이나 상금액이 다른데, 이를 활용하면 되지 않을까 싶었다.

 

enum과 다른 자료형을 연관시킨 예제

출처: https://limkydev.tistory.com/66

 

[Java] Enum의 사용법

안녕하세요. 지난 시간엔 EnumClass가 무엇이고 어떤 장점들이 있는지 알아보았습니다. 2017/06/27 - [Java] - [Java] enum 이란? (enum 개념익히기) 이번 시간은 Enum 사용방법을 더 알아보면서 Enum에 대한 이

limkydev.tistory.com

 

package EnumExample;

public class Developer {
	public String name;
	public int career;
	public DevType type;

	public static void main(String[] args) {
		for (DevType type : DevType.values()) {
			System.out.println(type.getName());
		}
	}
}

enum DevType { 
	//상수("연관시킬 문자") <- 이땐 줄 끝에 세미콜론 (;) 붙이기. 
	MOBILE("안드로이드"), 
	WEB("스프링"), 
	SERVER("리눅스"); 
	
	final private String name; 
	public String getName() { 
		return name; 
		} 
	private DevType(String name){ 
		this.name = name; 
		} 
	}
}

*결과

안드로이드

스프링

리눅스

 

enum을 사용하는 이유

- 기본적으로 제공하는 메서드를 이용해서 enum을 다양한 형태로 가져와 처리 가능

- 상수 정의  + 생성자를 통해 상수와 연관된 값을 연결하고 확장 가능