BUILD SUCCESSFUL in 0s
README.md에 구현할 기능 목록을 정리해 추가한다.입력한 문자열에서 숫자를 추출하여 더하는 계산기를 구현한다.
결과 : 6
덧셈할 문자열을 입력해 주세요.
1,2:3
결과 : 6
Application의 main()이다.build.gradle 파일은 변경할 수 없으며, 제공된 라이브러리 이외의 외부 라이브러리는 사용하지 않는다.System.exit()를 호출하지 않는다.camp.nextstep.edu.missionutils에서 제공하는 Console API를 사용하여 구현해야 한다.camp.nextstep.edu.missionutils.Console의 readLine()을 활용한다.woowacourse 저장소 우측 상단의 fork 버튼을 클릭해 fork합니다
git clone https://github.com/{본인_아이디}/java-calculator-7.git
git checkout -b {본인 아이디}
IntelliJ 시작 후 프로젝트 import

public PrintWriter printf(String format, Object... args)
System.out.printf("출력 format", 출력할 내용);
→ 하나의 커밋단위 !
feat(View): hi!;
https://junit.org/junit5/docs/current/user-guide/
https://assertj.github.io/doc/
https://www.baeldung.com/assertj-exception-assertion
https://www.baeldung.com/parameterized-tests-junit-5
public class UserInput{
// 불변 객체의 특성이므로 final
private final String input;
private final boolean hasCustomDelimiter;
private final List<String> delimiters;
// 1. constructor
public UserInput(String input, boolean hasCustomDelimiter, List<String> delimiters){
this.input = input;
this.hasCustomDelimiter = hasCustomDelimiter;
this.delimiters = delimiters;
}
// 2. getter
public String input(){
return input;
}
public boolean hasCustomDelimiter(){
return hasCustomDelimiter;
}
public List<String> delimiters(){
return delimiters;
}
// 3. hashCode
@Override
public int hashCode(){
return Objects.hash(input, hasCustomDelimiter, delimiters);
}
// 4. equals
@Override
public boolean equals(Object o){
if(this == o) return true;
if(o == null || getClass() != o.getClass()) return false;
UserInput userInput = (UserInput)o;
return input.equals(userInput.input())
&& hasCustomDelimiter == userInput.hasCustomDelimiter()
&& delimiters.equals(userInput.delimiters());
}
// 5. toString
@Override
public String toString(){
return "UserInput[input=" + input
+ ", hasCustomDelimiter=" + hasCustomDelimiter
+ ", delimiters=" + delimiters + "]";
}
}
public record UserInput(String input,
boolean hasCustomDelimiter,
List<String> delimiters){
}
public record UserInput(String input,
boolean hasCustomDelimiter,
List<String> delimiters){
public String printFields(){
return "input은 "+input+"이고, 추출된 구분자들은 "+delimiters+"입니다.";
}
}
https://mysterlee.tistory.com/102
https://yozm.wishket.com/magazine/detail/2814/
-> 편한데 귀찮음
a.getB().getC().getD()
a.getD();
-> B.getC().getD();
이번 과제를 통해 많은 것을 배우며 새로운 환경에 적응하는 시간이 필요했다. 특히 깃허브 사용법과 커밋 메시지 컨벤션에 익숙해지기까지 시간이 걸렸지만 그 과정에서 유익한 점을 많이 배웠다. 과제 요구사항 중 하나였던 커밋 메시지 컨벤션에 대해 처음 알게 되었고 그동안 프로젝트를 하며 나름의 규칙으로 커밋 메시지를 작성해왔던 방식이 조금 부족하다는 생각을 하게 되었다. 커밋 메시지 컨벤션을 정독하며 그 고민이 해소되었고 만약 내가 지금까지의 습관대로 회사에 입사했다면 적응하는 데 어려움이 있었을 것 같다고 느꼈다. 또한 기능 단위로 커밋을 하니 커밋 로그를 확인할 때 수정된 파일과 변경 사항을 명확히 분리해서 볼 수 있어 이해하는 데 많은 도움이 되었다. 이번 과제에서는 커밋 메시지를 영어로 작성했지만 다음 과제부터는 subject line을 제외한 나머지 부분은 한글로 작성하는 것이 더 좋을 것 같다.
과제를 진행하면서 과제 설명이 다소 모호하고 예시가 부족해 본격적으로 구현하기 전에 많은 고민을 하게 되었다. 특히 잘못된 값에 대한 예외 처리를 어떻게 해야 할지, 그리고 테스트 코드를 어떻게 작성해야 할지 고민하는 시간이 길었다. 이번 프리코스에서 TDD를 사용해보기로 마음먹었기 때문에 가능한 모든 예외 상황을 고려하면서 생각이 깊어졌고 이로 인해 생각보다 시간이 많이 소요되었다. 과제 제출이 끝난 후 TDD를 사용해보니 초반에 시간을 많이 들여야 했지만, 구현 과정에서 어느 부분에서 오류가 발생하는지 명확하게 파악할 수 있어 매우 유익했다. 특히 규모가 큰 프로젝트에서 TDD가 유용하게 사용될 것 같아 앞으로도 계속 사용할 계획이다.
과제에서 “문자열 앞부분의 ’//’와 ‘\n’ 사이에 위치하는 문자를 커스텀 구분자로 사용한다”는 설명이 다소 모호하게 느껴졌다. 특히 ‘//’와 ‘\n’ 사이에 여러 문자가 들어갈 경우, 이를 잘못된 입력으로 처리해야 할지, 아니면 각각의 문자를 커스텀 구분자로 봐야 할지 고민이 많았다. 구분자는 한 글자의 문자이지만, 과제 설명에 ‘//’와 ‘\n’ 사이에 하나의 커스텀 구분자만 들어간다는 명확한 언급이 없었기 때문에 여러 문자가 들어갈 경우 각 문자를 개별적인 커스텀 구분자로 해석해야 한다고 판단했다. 따라서 여러 문자가 주어졌을 때 각각의 문자를 커스텀 구분자로 인식하도록 코드를 구현했다.
또 이번 과제의 규모가 크지 않아 Application 클래스를 제외하고 두 개의 클래스만 사용했지만, 엄밀히 말하면 절차지향적으로 코드를 작성했기 때문에 이 방식이 적절한지에 대한 의문이 들었다. README에 기능을 정리하면서도 함수나 코드의 양이 적어서 과연 이렇게 작성하는 것이 맞는지 고민이 되었다. 스터디원들과 코드 리뷰를 통해 피드백을 받고 다른 사람들이 어떻게 구현했는지, 왜 그렇게 구현했는지에 대해 이야기를 나누고 싶다.

이 얘기를 보고 굉장히 위안이 됐다...