[우테코 8기 BE] 1주차 문자열 덧셈 계산기 리뷰

2025. 10. 18. 22:46·우아한테크코스 8기 백엔드

1주차 과제는 Java로 주어진 기능, 입출력 요구사항에 맞춰 문자열 덧셈 계산기를 만드는 것이다.

문제에서 제공된 저장소의 프로젝트를 fork하고, 우선 README에 체크리스트부터 만들어봤다.

# java-calculator-precourse

## ✅ 실행 환경 확인
- [x] Java 버전 21로 실행 확인 (`java -version → 21 출력`)
- [x] IntelliJ/Gradle JVM 모두 21로 설정 (`.\gradlew.bat --version`)
- [ ] `.\gradlew.bat clean test` 실행 시 **BUILD SUCCESSFUL** 확인

---

## 📦 저장소 준비
- [x] 미션 저장소 포크 및 로컬 클론 완료
- [x] 원격 **upstream 등록** 및 **최신 변경사항 동기화 설정 완료**

---

## 💾 커밋 운용
- [x] `README.md`에 기능 목록 작성 완료
- [ ] 기능 단위 커밋 진행 (`feat`, `fix`, `refactor` 등 **Angular 컨벤션 적용**)

---

## ⚙️ 기능 요구 사항
- [ ] **빈 문자열 입력 시 0 반환**
- [ ] **기본 구분자 (, :)** 로 분리된 **양수의 합 계산**
- [ ] **커스텀 구분자** `//X\n` 형태 지원 (예: `//;\n1;2;3 → 6`)
- [ ] **잘못된 입력 시** `IllegalArgumentException` 발생 후 프로그램 종료

---

## 💬 입출력 요구
- [ ] 입력이 **구분자와 양수로만 구성됨**을 검증
- [ ] 출력 형식 **정확히 `"결과 : N"`** 으로 일치

---

## 💻 프로그래밍 요구
- [ ] 진입점 **`Application.main()`** 사용
- [ ] **`build.gradle` 수정 금지**, 외부 라이브러리 미사용
- [ ] **`System.exit()` 호출 금지**
- [ ] **파일/패키지 명 변경 없음**
- [ ] **Java Style Guide** 준수 (포맷, 네이밍, 컨벤션)

---

## 📚 라이브러리 사용
- [ ] 입력은 **`camp.nextstep.edu.missionutils.Console.readLine()`** 사용

---

## 🧪 테스트 실행
- [ ] Windows 기준 `gradlew.bat clean test` 전체 통과
- [ ] **모든 테스트 성공** (실패 시 0점 규정 숙지)

---

## 📅 일정 및 제출
- [ ] **다음 주 월요일 전 구현 완료**
- [ ] **일요일 15시 이후 제출 가능**
- [ ] GitHub에 **PR 제출 후**, **우테코 지원 플랫폼에 PR 링크 최종 제출**

---

 

특이점은 입력을 `camp.nextstep.edu.missionutils.Console.readLine()` 로 받아야 한다는 것과 깃 커밋 메시지 컨벤션, Java Style Guide 준수였다.

평소 깃 커밋이나 PR 메시지를 엉망으로 관리했는데 이참에 습관을 잡아놓기로 다짐했다.

https://gist.github.com/stephenparish/9941e89d80e2bc58a153

 

Git Commit Message Conventions

Git Commit Message Conventions. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

 

Java Style Guide는 아래 블로그의 가이드를 따르기로 했다. 디스코드 서버의 한 지원자분이 공유해주신 링크이다.

https://myeonguni.tistory.com/1596

 

[코딩규칙] 자바 코딩 규칙(Java Code Conventions)

[코딩 규칙] 자바코딩 규칙(Java Code Conventions) 자바 프로그래밍 언어 코딩 규칙원문 : Oracle / Code Conventions for JavaTM Programming Language / 1999-4-20번역 : Kwangshin's Positive Blog, Java Code Conventions / 자바 코딩

myeonguni.tistory.com

 


 

우선 요구사항대로 코드를 작성해보고 여러 케이스를 테스트해봤다. 인터넷과 LLM을 통해 만든 test 코드이다.

package calculator;

import camp.nextstep.edu.missionutils.test.NsTest;
import org.junit.jupiter.api.Test;

import static camp.nextstep.edu.missionutils.test.Assertions.assertSimpleTest;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

class ApplicationTest extends NsTest {
    @Test
    void 커스텀_구분자_사용() {
        assertSimpleTest(() -> {
            run("//;\\n1");
            assertThat(output()).contains("결과 : 1");
        });
    }

    @Test
    void 예외_테스트() {
        assertSimpleTest(() ->
                assertThatThrownBy(() -> runException("-1,2,3"))
                        .isInstanceOf(IllegalArgumentException.class)
        );
    }
    @Test
    void 빈_문자열_테스트() {
        assertSimpleTest(() -> {
            run("");
            assertThat(output()).contains("결과 : 0");
        });
    }

    @Test
    void 기본_구분자_테스트() {
        assertSimpleTest(() -> {
            run("1,2,3");
            assertThat(output()).contains("결과 : 6");
        });
    }

    @Test
    void 콜론_구분자_테스트() {
        assertSimpleTest(() -> {
            run("1:2:3");
            assertThat(output()).contains("결과 : 6");
        });
    }

    @Test
    void 혼합_구분자_테스트() {
        assertSimpleTest(() -> {
            run("1,2:3");
            assertThat(output()).contains("결과 : 6");
        });
    }

    @Test
    void 커스텀_구분자_사용2() {
        assertSimpleTest(() -> {
            run("//;\\n1;2;3");
            assertThat(output()).contains("결과 : 6");
        });
    }

    @Override
    public void runMain() {
        Application.main(new String[]{});
    }
}

맨 위의 2개 테스트는 기존의 테스트이고 나머지 5개는 추가 예외처리가 필요하다고 생각해서 추가하였다.

테스트 결과

결과의 순서는 테스트 코드의 순서와 다른데, 그 이유는 .. 이렇다고 한다.

JUnit 테스트 동작

 


 

아직 1주차의 정답과 리뷰를 받지 않았지만, 잘 모르겠다고 생각되는 부분이 있다.

Test 코드에선 커스텀 구분자 입력을

//;\\n1

이렇게 줘야 한다는 것을 알 수 있는데, 실제 터미널에서는

//;\n1

로 입력을 줘야 결과: 1 이 출력되었다.

프로그램에 입력 혹은 테스트 코드로 주는 문자열은 다른데 결과는 같아야 하는 것인가 살짝 헷갈렸다.

// '\n' 문자열을 실제 개행 문자로 변환
input = input.replace("\\n", "\n");

int result = calculator.calculate(input);

결론은 자바 문자열 리터럴과 콘솔 입력의 이스케이프 처리 차이라는 것을 알게 되었다.

자바 문자열 리터럴에서 \\n은 \와 n으로 처리해준다.

콘솔에서 실행 결과

콘솔에 커스텀 구분자를 //와 \n를 직접 입력해서 하면 결과가 잘 나온다.

하지만 //; 이후 실제 줄바꿈인 엔터키를 누르면 그땐 \n처리가 아닌 예외처리로 인한 프로그램 종료처리가 되는데 이 동작이 맞는 것인지 잘 모르겠다. 만약 콘솔에서 엔터키를 눌러서 커스텀 구분자를 처리하는 것이라면 입력을 한 줄 더 받아야 할 것 같다.

 


 

우선 테스트 코드는 모두 pass를 하니, 나중에 정답이 나오거나 리뷰를 받을 때 확실히 알아가도록 해야겠다..

아래 사진은 계산기 프로그램의 프로젝트 구조이다. 패키지의 역할에 따라 model, view, controller로 나눠서 구현하는 MVC 패턴을 적용시켜서 구현하였다.

MVC 구조도

 


 

1주차를 성공적으로 마무리했다.

제출이 마감되면 다른 사람들의 코드와 리뷰를 받아서 다시 정리해봐야겠다. 

PR후 예제 테스트 실행 완료

 

'우아한테크코스 8기 백엔드' 카테고리의 다른 글

[우테코 8기 BE] 최종시험 후기 및 회고  (0) 2026.01.24
[우테코 8기 BE] 4 & 5 주차 오픈미션  (0) 2025.11.24
[우테코 8기 BE] 3주차 로또 리뷰  (0) 2025.11.02
[우테코 8기 BE] 2주차 자동차 경주 리뷰  (0) 2025.10.27
'우아한테크코스 8기 백엔드' 카테고리의 다른 글
  • [우테코 8기 BE] 최종시험 후기 및 회고
  • [우테코 8기 BE] 4 & 5 주차 오픈미션
  • [우테코 8기 BE] 3주차 로또 리뷰
  • [우테코 8기 BE] 2주차 자동차 경주 리뷰
mvg01
mvg01
지능 낮은 컴퓨터공학부 4학년의 블로그
  • mvg01
    mvg01 님의 블로그
    mvg01
  • 전체
    오늘
    어제
    • 분류 전체보기 (87)
      • 백준 문제풀이 (29)
        • bfs (13)
        • dfs (4)
        • shortest path (1)
        • implemetation (1)
        • data structure (5)
        • dynamic programming (2)
        • greedy (1)
        • brute force (0)
        • back tracking (1)
        • string (0)
        • binary search (1)
      • 드림핵 문제풀이 (42)
        • web (17)
        • reversing (6)
        • pwnable (2)
        • misc (10)
        • forensics (7)
      • 우아한테크코스 8기 백엔드 (5)
      • 정보 보안 (0)
        • WEB (0)
        • Reversing (0)
        • 시스템 해킹 (0)
        • Forensics (0)
      • 임베디드 (4)
        • NVIDIA Jetson (4)
        • raspberry pi (0)
      • AI (6)
        • Claude (3)
        • OpenAI gpt (1)
        • n8n (2)
      • 서평 (1)
  • 인기 글

  • 최근 글

  • 링크

  • hELLO· Designed By정상우.v4.10.3
mvg01
[우테코 8기 BE] 1주차 문자열 덧셈 계산기 리뷰
상단으로

티스토리툴바