728x90
문자열 덧셈 계산기
기능 요구사항
- 쉼표(,) 또는 콜론(:)을 구분자로 가지는 문자열을 전달하는 경우 구분자를 기준으로 분리한 각 숫자의 합을 반환 (예: “” => 0, "1,2" => 3, "1,2,3" => 6, “1,2:3” => 6)
- 앞의 기본 구분자(쉼표, 콜론)외에 커스텀 구분자를 지정할 수 있다. 커스텀 구분자는 문자열 앞부분의 “//”와 “\n” 사이에 위치하는 문자를 커스텀 구분자로 사용한다. 예를 들어 “//;\n1;2;3”과 같이 값을 입력할 경우 커스텀 구분자는 세미콜론(;)이며, 결과 값은 6이 반환되어야 한다.
- 문자열 계산기에 숫자 이외의 값 또는 음수를 전달하는 경우 RuntimeException 예외를 throw한다.
프로그래밍 요구사항
- indent(들여쓰기) depth를 2단계에서 1단계로 줄여라.
- depth의 경우 if문을 사용하는 경우 1단계의 depth가 증가한다. if문 안에 while문을 사용한다면 depth가 2단계가 된다.
- 메소드의 크기가 최대 10라인을 넘지 않도록 구현한다.
- method가 한 가지 일만 하도록 최대한 작게 만들어라.
- else를 사용하지 마라.
1. null 또는 empty 인지 확인
private static boolean isValidationCheckNullOrEmpty(String text) {
return text == null || text.isEmpty();
}
2. 사이즈가 1인지 확인
private static boolean isValidationCheckSize1(String text) {
return text.length() == 1;
}
3. 커스텀 문자 포함했을 경우 문자열 계산
private static Integer customDelimiterAddCalculator(String text) {
Matcher m = Pattern.compile("//(.)\n(.*)").matcher(text);
if (m.find()) {
String customDelimiter = m.group(1);
String[] tokens = m.group(2).split(customDelimiter);
return Arrays.stream(tokens).mapToInt(Integer::parseInt).sum();
}
return null;
}
4. 표준 문자열 계산
private static int standardStringAddCalculator(String text) {
String[] tokens = text.split(",|:");
if(Arrays.toString(tokens).contains("-")){
throw new RuntimeException();
}
return Arrays.stream(tokens).mapToInt(Integer::parseInt).sum();
}
5. 입력
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class InputView {
/* 값 입력 */
public static String inputString() throws IOException {
System.out.print("계산하실 문자열을 입력해 주세요 : ");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
return br.readLine();
}
}
6. 출력
public class ResultView {
public static void resultMessage(int result){
System.out.println(result);
}
}
7. main
public static void main(String[] args) throws IOException {
String inputString = InputView.inputString();
ResultView.resultMessage(StringAddCalculator.splitAndSum(inputString));
}
8. Test Code
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
public class StringAddCalculatorTest {
@Test
public void splitAndSum_null_또는_빈문자() {
int result = StringAddCalculator.splitAndSum(null);
assertThat(result).isEqualTo(0);
result = StringAddCalculator.splitAndSum("");
assertThat(result).isEqualTo(0);
}
@Test
public void splitAndSum_숫자하나() throws Exception {
int result = StringAddCalculator.splitAndSum("1");
assertThat(result).isEqualTo(1);
}
@Test
public void splitAndSum_쉼표구분자() throws Exception {
int result = StringAddCalculator.splitAndSum("1,2");
assertThat(result).isEqualTo(3);
}
@Test
public void splitAndSum_쉼표_또는_콜론_구분자() throws Exception {
int result = StringAddCalculator.splitAndSum("1,2:3");
assertThat(result).isEqualTo(6);
}
@Test
public void splitAndSum_custom_구분자() throws Exception {
int result = StringAddCalculator.splitAndSum("//;\n1;2;3");
assertThat(result).isEqualTo(6);
}
@Test
public void splitAndSum_negative() throws Exception {
assertThatThrownBy(() -> StringAddCalculator.splitAndSum("-1,2,3"))
.isInstanceOf(RuntimeException.class);
}
}
728x90
'개발 교육 > 플레이그라운드 with TDD, 클린코드' 카테고리의 다른 글
자동차 경주 게임 구현 - 리팩토링 재시도 (0) | 2022.03.14 |
---|---|
자동차 경주 게임 구현 (0) | 2022.03.12 |
숫자야구게임 다시 구현 - 피드백 적용 후 (0) | 2022.03.06 |
숫자야구게임 구현 - 피드백 적용 전 (0) | 2022.03.06 |
단위 테스트 실습 - 문자열 계산기 (0) | 2022.03.02 |