Skip to content

Conversation

@baam12
Copy link

@baam12 baam12 commented Oct 20, 2025

<기능 구현 전 생각해보기>
1.의사 코드 작성하기

  • 입력을 받는다. = camp.nextstep.edu.missionutils.Console의 readLine()을 활용한다. // 구분자와 양수로 구성된 문자열
  • 계산기 기능을 구분한다.
  • 값을 담을 변수를 선언 및 초기화를 한다.
  1. 기능 구현하기
  • 빈 문자열 입력 시 0을 반환한다.
  • 쉼표와 콜론으로 구분된 숫자들을 더한다.
  • 커스텀 구분자를 지정할 수 있다.
  • 숫자가 아닌 값이 들어오면 예외를 발생시킨다.
  • 결과를 "결과(변수) : n"형태로 출력한다.
  1. 예외처리 순서
    1. //로 시작하지만 \n이 없을 경우
    1. //와 \n 사이에 빈 문자열이거나 공백이 있을 경우
    1. 토큰화 결과 빈 토큰일 경우
    1. //와 \n 사이에 양수가 아닌 0 또는 음수가 들어올 경우
    1. //와 \n 사이에 숫자 외에 문자가 들어올 경우

- 사용자 안내문 출력
- Console.readLine()으로 문자열 입력 받기
- 결과 출력 포맷 '결과 : 출력값' 형식으로 구성
- 입력의 값이 ""로 들어올 경우 결과의 내용을 0으로 출력하도록 구현

- 기본 구분자(쉼표,콜론)을 기준으로 문자열을 분리하여 Strong 타입의 숫자 배열 생성

- 문자열을 정수로 형변환 후 반복문으로 합계를 계산하도록 구현

- 결과 출력 포맷 '결과 : 출력값' 형식으로 구성
- 커스텀 구분자 //입력받은 문자열\n 패턴을 파싱하고 커스텀 구분자를 분리하여 합산
- //와 \n사이에 특수문자 구분자가 들어올 경우 정규식이 불안정해지기 때문에 Pattern.quote를 사용하여 특수문자를 입력 받을 수 있게 정규식 안전 처리
IllegalArgumentException 발생 조건
- //로 시작하지만 개행(\n)이 없는 경우
- //와 \n 사이에 공백이 들어올 경우
- //와 \n 사이에 기본구분자 없이 숫자로만 들어올 경우
- //와 \n 사이가 숫자가 음수인 경우
-//와 \n 사이에 양수 외에 문자가 들어올 경우
- //로 시작하는 입력에서 개행(\n)이 없는 경우 두 번째 입력 라인으로 숫자값을 받도록 처리
- 커스텀 구분자가 공백이거나 비어 있는 경우 IllegalArgumentException 발생
- 커스텀 구분자가 숫자(정수) 또는 음수 표현(-)인 경우 IllegalArgumentException 발생
- 기본 구분자(쉼표, 콜론) 입력도 예외 없이 동작하도록 통합
- 각 토큰이 비어 있거나 0/음수/비숫자일 경우 IllegalArgumentException 발생
@baam12 baam12 changed the title 문자열 덧셈 계산기 커스텀 구분자 및 예외 처리 구현 [문자열 덧셈 계산기] 이효범 미션 제출합니다. Oct 20, 2025
Copy link

@jihwankim128 jihwankim128 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코드 정말 잘봤습니다!
다음 미션 때는 escape 문자에 대해 조심하면 더 좋은 결과가 있을 것 같아요!!
#14
저도 리뷰 한 번 부탁드립니다!

import java.util.regex.Pattern;
import camp.nextstep.edu.missionutils.Console;

public class Application {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

현재 Monolith 구조군요!
Monolith의 장점도 있지만 객체지향적으로 접근해보면 어떨까요?!

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

소중한 리뷰 감사합니다. 어떻게 접근해야 할지 몰라 하나의 클래스에 다 우겨 넣었는데 객체지향으로 어떻게 접근해야 할지 지난 1주차 미션에 적용을 못했지만 2주차 미션에는 꼭 객체지향으로 적용해보겠습니다. 그리구 1주차 미션도 객체지향적으로 리팩토링을 하면서 연습해보겠습니다 조언 감사합니다 :)

Comment on lines +8 to +9
System.out.println("덧셈할 문자열을 입력해 주세요.");
String input = Console.readLine();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

입/출력에 대한 책임입니다! 따로 분리해도 좋을 것 같아요!

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

지환님 뿐만 아니라 다른 동기분들의 코드를 참고하면서 입 출력에 대한 책임을 어떻게 분리하는지 공부하면서 리팩토링 해보도록 하겠습니다. 피드백 감사합니다 :)

Comment on lines +11 to +14
if (input == null || input.isEmpty()) {
System.out.println("결과 : 0");
return;
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

비즈니스 로직과 출력이 함께 공존하는 것 같아요!

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

비즈니스 로직과 출력을 분리할 수 있다는 생각을 못했는데 한번 시도해보겠습니다!! 감사합니다 :)

String[] tokens;

if (input.startsWith("//")) {
int newLineIndex = input.indexOf("\n");

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

헉 \는 escape 문자로 \ 이렇게 두개 묶으셔야합니다!!

그리고 입력에 대한 처리군요? 비즈니스 혹은 파싱하는 관심사 등 여러 시각으로 책임을 분리할 수 있을 것 같아요!

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아하...개행을 할 때 \로 묶어야 하는군요....파싱하는 과정과 입력 받는 부분을 나눠보겠습니다. 요구사항에 대해 이해를 잘 못했던 것 같습니다. 부족한 실력이지만 1주차 코드를 리팩토링 할 때 반영해 보겠습니다. 진심어린 리뷰 감사합니다 :)

Comment on lines +21 to +22
String customDelimiter;
String numbers;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아무 값 없이 초기화되는 로직이 있다면, 메서드로 추출해보세요!
String customDelimiter = extractCustomDelimiter();

Comment on lines +24 to +32
if (newLineIndex >= 0) {
customDelimiter = input.substring(2, newLineIndex);
numbers = input.substring(newLineIndex + 1);
} else {
customDelimiter = input.substring(2);
String secondLine = Console.readLine();
if (secondLine == null) throw new IllegalArgumentException();
numbers = secondLine;
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 로직이 잘 읽혀지지가 않습니다! 메서드로 분리해서 어떤 로직을 담고 있는지 메서드 명으로 표현하면 좋을 것 같아요!

Copy link
Author

@baam12 baam12 Oct 21, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 부분은 틀린 코드입니다... 의도는 음수가 되면 안되고, 개행을 하고 나서 두번째 줄을 입력받는 것으로 표현했습니다만.. 다른 분들의 코드를 보면서 요구사항을 잘못 이해한 것을 깨달았습니다.. 추가적으로 말씀 하신대로 로직의 의미를 쉽게 파악할 수 있게 메소드로 분리하여 메소드명으로 표현해보도록 리팩토링 해보겠습니다. 감사합니다 :)

Comment on lines +41 to +46
3. 예외처리 순서
- 1. //로 시작하지만 \n이 없을 경우
- 2. //와 \n 사이에 빈 문자열이거나 공백이 있을 경우
- 3. 토큰화 결과 빈 토큰일 경우
- 4. //와 \n 사이에 양수가 아닌 0 또는 음수가 들어올 경우
- 5. //와 \n 사이에 숫자 외에 문자가 들어올 경우
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

효범님 안녕하세요!
최초에 이 문제를 어떻게 이해하셨는지 궁금해서 읽어보았습니다!
저는 본 문단에 집중해서 리뷰를 진행해보도록 하겠습니다 :)

의도 파악

우선 1,3의 의도는 잘 알 것 같습니다.
그리고 예외처리 순서로 표현하신 것을 보니, 3번부터는 토큰화가 이루어진 이후겠네요

궁금한 점

  1. 저는 "//"와 "\n" 사이에 커스텀 구분자가 들어오는 것으로 알고 있습니다. 하지만 2번과 5번을 함께 보면, 구분자 외에 일반 숫자들도 함께 들어올 수 있다고 생각이 되는데요. 문제를 어떻게 이해하셨나요?
  2. 2번에서 공백이 있는 경우를 예외로 생각하신 것은, 공백(' ')은 커스텀 구분자가 될 수 없다고 생각하신건가요? 그렇게 판단하신 근거가 궁금합니다!
  3. 4번과 5번을 함께 보았을 때, 숫자가 아닌 문자 '-'가 커스텀 구분자로 들어간다면 결과가 어떻게 되어야 한다고 생각하시나요?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

요구사항에 대한 이해도가 부족했습니다. 그럼에도 부족한 코드에 대한 소중한 리뷰 감사합니다.

결과적으로 틀린 코드지만 궁금하신 점에 대해 작성했을 때로 돌아가 답변을 드려보겠습니다.

<1번 답변>
말씀 주신 부분에 대해서는 미쳐 생각하지 못했습니다..! 일반 숫자들도 함께 들어오는 부분에 대해서 리팩토링 해보겠습니다.

의도: 커스텀 구분자 //와 \n 사이에 숫자 외에 문자열이 들어오는 것과 공백 외에는 숫자만 들어오는 것밖에 생각이 나질 않았습니다.

<2번 답변>
공백을 커스텀 구분자로 생각하지 못했습니다. 그래서 0으로 처리할지, 예외처리로 할 지로 기준을 잡았던 것 같습니다.

의도: 기능 요구사항의 내용 일부 발췌
- 쉼표(,) 또는 콜론(:)을 구분자로 가지는 문자열을 전달하는 경우 구분자를 기준으로 분리한 각 숫자의 합을 반환한다.
- 예: "" => 0, "1,2" => 3, "1,2,3" => 6, "1,2:3" => 6
라는 예시를 보았습니다.

예시지만 // \n라고 입력을 받았다면 공백은 0으로 처리를 하려고 했었습니다. 커스텀구분자 전에 1차 검증에서 공백만 들어올 경우 0으로 처리하는 것이 있었기에 공백이 들어온다면 계산을 하지 못한다는 의미를 주기 위해 커스텀구분자에서의 공백은 예외처리로 하게 되었던 것 같습니다.

<3번 답변>
전혀 생각지 못한 부분인 질문입니다. 깊이 생각을 가질 수 있게 질문해주신 점 먼저 감사 인사 드립니다 :)

-가 커스텀 구분자의 결과를 보지는 못했지만. 부족한 지식으로 답변드리겠습니다. 음수를 구분하기 위한 -가 아닌 커스텀구분자로써 - 가 들어온다면 예외 로직을 구현하지 못했기 때문에 예외는 발생하지 않을 것 같지만 "아래 코드에 대한 예외에 대한 검증이 완벽해지지 않는다"라고 생각이 듭니다..

if (customDelimiter.isEmpty() || customDelimiter.isBlank()) throw new IllegalArgumentException();
if (customDelimiter.matches("-?\d+")) throw new IllegalArgumentException(); 이 검증에 추가적인 예외를 더 두어야 할 것 같습니다.

3번의 질문에 대해서는 조금 더 고민해보고 답을 찾아가 보도록 하겠습니다. 좋은 질문 감사드립니다 :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants