package calculator;
import camp.nextstep.edu.missionutils.Console;
public class Application {
public static void main(String[] args) {
// 프로그램 시작 메시지
System.out.println("덧셈할 문자열을 입력해 주세요");
String input = Console.readLine();
boolean isValidInput = true;
boolean isNegative = false;
// 덧셈 결과를 담을 변수
int sum = 0;
StringBuilder numberBuilder = new StringBuilder(); // 리스트 대신에 사용하는 StringBuilder
// 빈 문자일 경우
if (input.isEmpty()) {
System.out.println("결과 : 0");
return;
}
for (int i = 0; i < input.length(); i++) {
char ch = input.charAt(i);
if (ch == '-') {
// 음수 부호가 나오면 isNegative = true 설정
isNegative = true;
} else if (Character.isDigit(ch)) {
// 숫자인 경우 숫자 빌더에 추가
numberBuilder.append(ch);
} else if (ch == ':' || ch == ',') {
// 기본 구분자를 만나면 그 전까지의 숫자를 합산
if (!numberBuilder.isEmpty()) {
int number = Integer.parseInt(numberBuilder.toString());
// 음수 값인지 확인
if (isNegative) {
number = -number; // 음수로 변환
}
if (number <= 0) {
System.out.println("양수만 입력 가능합니다: " + number);
isValidInput = false;
break;
} else {
sum += number; // 변환한 숫자 합계에 더하기
}
numberBuilder.setLength(0); // 빌더 초기화
isNegative = false; // 음수 플래그 초기화
}
} else {
// 잘못된 입력일 경우
System.out.println("잘못된 입력입니다.");
isValidInput = false;
break;
}
}
// 유효한 입력인 경우 결과 출력
if (isValidInput) {
if (!numberBuilder.isEmpty()) {
int number = Integer.parseInt(numberBuilder.toString());
// 마지막으로 남아 있는 숫자가 음수인지 확인
if (isNegative) {
number = -number; // 음수로 변환
}
if (number < 0) {
System.out.println("양수만 입력 가능합니다: " + number);
return;
} else {
sum += number; // 마지막 숫자 합산
}
}
// 결과 출력
System.out.println("결과 : " + sum);
}
}
}
package calculator;
import camp.nextstep.edu.missionutils.Console;
public class Application {
public static void main(String[] args) {
System.out.println("덧셈할 문자열을 입력해 주세요");
String input = Console.readLine();
boolean isValidInput = true;
boolean isNegative = false;
int sum = 0;
StringBuilder numberBuilder = new StringBuilder(); // 리스트 대신에 사용하는 StringBuilder
// 빈 문자일 경우
if (input.isEmpty()) {
System.out.println("결과 : 0");
return;
}
// 커스텀 구분자 설정
String customDelimiter = null;
// 커스텀 구분자 추출
if (input.startsWith("//")) {
// Escape 문자와 헷갈리는 문제 발생 - > "\\n"을 실제 개행 문자로 변환
input = input.replace("\\n", "\n");
if (input.startsWith("//")) {
// 커스텀 구분자가 여러 글자일 경우를 위한 start, end 인덱스
int delimiterStartIndex = input.indexOf("//") + 2;
int delimiterEndIndex = input.indexOf("\n");
if (delimiterEndIndex > delimiterStartIndex) {
customDelimiter = input.substring(delimiterStartIndex, delimiterEndIndex); // 커스텀 구분자 추출
input = input.substring(delimiterEndIndex + 1); // 구분자 이후의 입력값만 남김
}
}
}
for (int i = 0; i < input.length(); i++) {
char ch = input.charAt(i);
if (ch == '-') {
// 음수 부호가 나오면 isNegative = true 설정
isNegative = true;
} else if (Character.isDigit(ch)) {
// 숫자인 경우 숫자 빌더에 추가
numberBuilder.append(ch);
} else if (ch == ':' || ch == ',' || (customDelimiter != null && input.substring(i).startsWith(customDelimiter))) {
// 기본 구분자 또는 커스텀 구분자를 만나면 그 전까지의 숫자를 합산
if (!numberBuilder.isEmpty()) {
int number = Integer.parseInt(numberBuilder.toString());
// 음수 값인지 확인
if (isNegative) {
number = -number; // 음수로 변환
}
// 양수가 아닌 수 처리
if (number <= 0) {
System.out.println("양수만 입력 가능합니다: " + number);
isValidInput = false;
break;
} else {
sum += number; // 변환한 숫자 합계에 더하기
}
numberBuilder.setLength(0); // 빌더 초기화
isNegative = false; // 음수 플래그 초기화
}
// 커스텀 구분자일 경우 구분자의 길이만큼 건너뜀
if (customDelimiter != null && input.substring(i).startsWith(customDelimiter)) {
i += customDelimiter.length() - 1;
}
} else {
// 잘못된 입력일 경우
System.out.println("잘못된 입력입니다.");
isValidInput = false;
break;
}
}
// 유효한 입력인 경우 결과 출력
if (isValidInput) {
if (!numberBuilder.isEmpty()) {
int number = Integer.parseInt(numberBuilder.toString());
// 마지막으로 남아 있는 숫자가 음수인지 확인
if (isNegative) {
number = -number; // 음수로 변환
}
if (number <= 0) {
System.out.println("양수만 입력 가능합니다: " + number);
return;
} else {
sum += number; // 마지막 숫자 합산
}
}
// 결과 출력
System.out.println("결과 : " + sum);
}
}
}
package calculator;
import camp.nextstep.edu.missionutils.Console;
public class Application {
public static void main(String[] args) {
System.out.println("덧셈할 문자열을 입력해 주세요");
String input = Console.readLine();
boolean isNegative = false;
int sum = 0;
StringBuilder numberBuilder = new StringBuilder(); // 리스트 대신에 사용하는 StringBuilder
// 빈 문자일 경우
if (input.isEmpty()) {
System.out.println("결과 : 0");
return;
}
// 커스텀 구분자 설정
String customDelimiter = null;
// 커스텀 구분자 추출
if (input.startsWith("//")) {
// Escape 문자와 헷갈리는 문제 발생 - > "\\n"을 실제 개행 문자로 변환
input = input.replace("\\n", "\n");
if (input.startsWith("//")) {
// 커스텀 구분자가 여러 글자일 경우를 위한 start, end 인덱스
int delimiterStartIndex = input.indexOf("//") + 2;
int delimiterEndIndex = input.indexOf("\n");
if (delimiterEndIndex > delimiterStartIndex) {
customDelimiter = input.substring(delimiterStartIndex, delimiterEndIndex); // 커스텀 구분자 추출
input = input.substring(delimiterEndIndex + 1); // 구분자 이후의 입력값만 남김
}
}
for (int i = 0; i < input.length(); i++) {
char ch = input.charAt(i);
if (ch == '-') {
// 음수 부호가 나오면 isNegative = true 설정
isNegative = true;
} else if (Character.isDigit(ch)) {
// 숫자인 경우 숫자 빌더에 추가
numberBuilder.append(ch);
} else if (ch == ':' || ch == ',' || (customDelimiter != null && input.substring(i).startsWith(customDelimiter))) {
// 기본 구분자 또는 커스텀 구분자를 만나면 그 전까지의 숫자를 합산
if (!numberBuilder.isEmpty()) {
int number = Integer.parseInt(numberBuilder.toString());
// 음수 값인지 확인
if (isNegative) {
number = -number; // 음수로 변환
}
// 양수가 아닌 수 처리
if (number <= 0) {
throw new IllegalArgumentException("양수만 입력 가능합니다: " + number);
}
sum += number;
numberBuilder.setLength(0);
isNegative = false;
}
// 커스텀 구분자일 경우 구분자의 길이만큼 건너뜀
if (customDelimiter != null && input.substring(i).startsWith(customDelimiter)) {
i += customDelimiter.length() - 1;
}
} else {
throw new IllegalArgumentException("잘못된 입력입니다: " + ch);
}
}
// 마지막 숫자 처리
if (!numberBuilder.isEmpty()) {
int number = Integer.parseInt(numberBuilder.toString());
if (isNegative) {
number = -number;
}
if (number <= 0) {
throw new IllegalArgumentException("양수만 입력 가능합니다: " + number);
}
sum += number;
}
System.out.println("결과 : " + sum);
}
}
}
이렇게까지 했는데 에러 발생!!
잘 보시면, 위에 중복 코드가 있어요... ㅎㅎ 이 커밋 컨벤션과 룰이 익숙하지 않아서 프로젝트를 새로 파서 옮기느라 중복코드가 발생한 것 같습니다. 하지만 옮기고나서 다시 테스트 안하고 올린 제 잘못이죠...
fix(calculator): 커스텀 구분자 및 기본 구분자 동시 처리 에러 해결
- 커스텀 구분자와 기본 구분자(쉼표, 콜론) 모두 사용하여 숫자를 분리하는 기능 추가
- 커스텀 구분자와 기본 구분자 적용 방식을 개선하여 유연한 입력 처리 가능
- Test 실행해 프로그램 확인 진행
package calculator;
import camp.nextstep.edu.missionutils.Console;
public class Application {
public static void main(String[] args) {
System.out.println("덧셈할 문자열을 입력해 주세요");
String input = Console.readLine();
boolean isNegative = false;
int sum = 0;
StringBuilder numberBuilder = new StringBuilder(); // 리스트 대신에 사용하는 StringBuilder
if (input.isEmpty()) {
System.out.println("결과 : 0");
return;
}
// 커스텀 구분자 설정
String customDelimiter = null;
// 커스텀 구분자 추출
if (input.startsWith("//")) {
input = input.replace("\\n", "\n"); // 개행 문자 처리
// 커스텀 구분자가 여러 글자일 경우를 위한 처리
int delimiterStartIndex = input.indexOf("//") + 2;
int delimiterEndIndex = input.indexOf("\n");
if (delimiterEndIndex > delimiterStartIndex) {
customDelimiter = input.substring(delimiterStartIndex, delimiterEndIndex); // 커스텀 구분자 추출
input = input.substring(delimiterEndIndex + 1); // 구분자 이후의 입력값만 남김
}
}
// for 루프는 항상 실행되도록 수정 (커스텀 구분자 여부 상관없이)
for (int i = 0; i < input.length(); i++) {
char ch = input.charAt(i);
if (ch == '-') {
// 음수 부호가 나오면 isNegative = true 설정
isNegative = true;
} else if (Character.isDigit(ch)) {
// 숫자인 경우 숫자 빌더에 추가
numberBuilder.append(ch);
} else if (ch == ':' || ch == ',' || (customDelimiter != null && input.substring(i).startsWith(customDelimiter))) {
// 기본 구분자 또는 커스텀 구분자를 만나면 그 전까지의 숫자를 합산
if (!numberBuilder.isEmpty()) {
int number = Integer.parseInt(numberBuilder.toString());
// 음수 값인지 확인
if (isNegative) {
number = -number; // 음수로 변환
}
// 양수가 아닌 수 처리
if (number <= 0) {
throw new IllegalArgumentException("양수만 입력 가능합니다: " + number);
}
sum += number;
numberBuilder.setLength(0); // 빌더 초기화
isNegative = false; // 음수 플래그 초기화
}
// 커스텀 구분자일 경우 구분자의 길이만큼 건너뜀
if (customDelimiter != null && input.substring(i).startsWith(customDelimiter)) {
i += customDelimiter.length() - 1;
}
} else {
// 잘못된 입력일 경우 예외 발생
throw new IllegalArgumentException("잘못된 입력입니다: " + ch);
}
}
// 마지막 숫자 처리
if (!numberBuilder.isEmpty()) {
int number = Integer.parseInt(numberBuilder.toString());
if (isNegative) {
number = -number;
}
if (number <= 0) {
throw new IllegalArgumentException("양수만 입력 가능합니다: " + number);
}
sum += number;
}
// 결과 출력
System.out.println("결과 : " + sum);
}
}
그래서 이게 최종입니다!
저의 회고를 정리하자면...
Readme 를 작성할때 첫 커밋에 어떤 기능을 먼저 넣을지를 고민하게 되었습니다. 처음에는 깜빡하고 입력문에 대한 양수 검증하는 부분을 만들지 않았습니다. 그래서 레포지토리를 삭제하고 파일을 다시 클론 받고 진행을 기존 코드를 옮기다 보니, 중복해서 코드를 넣는 일이 발생했습니다.
이 경험을 통해, 요구상황에 맞게 세부적으로 기능을 나누고 ReadMe 를 작성 해야겠다는 생각을 하게 되었고, 테스트의 중요성을 알게되었습니다.
처음이라 그런지 많이 그 컨벤션과 룰을 맞추려고 하다보니, 오히려 더 실수를 하고 꼼꼼하게 테스트 하지 못했습니다. 앞으로 진행할 미션에 있어서는 너무 완벽하게 하려고 하지말고, 조금 더 유연하게 과제를 진행 해야겠다는 생각을 하게되었습니다. 또한 늘 테스트 코드를 진행하고 PR 을 올려야겠다는 큰 깨달음을 얻었습니다.
이리고 나서 공통 피드백을 받았습니다
https://meetup.nhncloud.com/posts/106
IntelliJ IDEA: ⌥⌘L, Ctrl+Alt+L
Eclipse: ⇧⌘F, Ctrl+Shift+F
Visual Studio Code: ⇧⌥F, Shift+Alt+F
피드백 영상이 따로 있는데.. 이건 나중에 보도록 해야겠다