
문제발생 : 기초 코드뼈대를 짜고 Git 레파지토리를 먼저 설정하고 프로젝트를 구조를 Git에 맞추면서 src 루트폴더가 안보이는문제발생
원인 : Git 은 폴더의 구조를 보는 것이 아닌 '해당경로에 파일의 변경성' 만을 보기에 아무 파일이 없던 src폴더를 인식하지못함.
문제해결 : 인텔리J 상의 폴더구조로 들어가서 src를 루트폴더로 적용하며 문제해결.

참조 :
https://yjkim-dev.tistory.com/49
https://whyprogrammer.tistory.com/568

문제발생 : 문자열이 꼬인건지 한글입력이 문제가된건지 커밋컨벤션을 어긴 커밋메세지가 push 됨.
문제해결 : git rebase 기능을 이용하여 커밋메세지를 수정 및 재 push.
git rebase HEAD~1 -i // 바로직전 커밋메세지 수정을 위한 에디터 모드 진입

pick 구문을 지우고 rewoed로 교체한다.esc -> :wq! -> enter 순 으로 입력한다.commit message 수정 후, esc -> :wq! -> enter
git push origin 경로 --force
--force 명령어를 통해 원격저장소와 로컬저장소의 내용을 일치시키기위해 원격 저장소의 변경사항을 '강제로' 덮어씌운다.참조 :
https://velog.io/@dev_bomdong/Git-%EC%9D%B4%EB%AF%B8-push%ED%95%9C-commit-message-%EC%88%98%EC%A0%95%ED%95%98%EA%B8%B0
https://mizzo-dev.tistory.com/entry/git-commit-edit

문제발생 : 개발용 dev 브랜치를 생성하고 하위로 dev/lv1 등으로 브랜치를 생성시도했으나 생성오류발생.
원인 : 브랜치는 폴더 개념이 아닌 분기이기 때문에 dev/...같은 하위 분기는 생성할수 없음.
문제해결 : dev 개발브랜치를 하나만 두고 lv별 패키지를 생성, 별도 관리하기로 변경.

do {
try {
// 스캐너를 통한 숫자 1,2 입력 후 변수저장.
System.out.print("첫 번째 숫자를 입력하세요 : ");
firstNum = sc.nextInt();
System.out.print("두 번째 숫자를 입력하세요 : ");
secondNum = sc.nextInt();
} catch (InputMismatchException e) {
System.out.println("숫자를 입력해주세요.");
continue;
}

문제 발생 : 숫자 입력중 정해진 변수타입외 문자 예외를 처리시 예외를 처리하고 continue문을 만나 반복문으로 돌아가 입력을 받지않고 무한루프가 생기는 문제가 발생.
가설 : do 구문과 continue 키워드가 문제가 발생하는게 아닐까? 코드를 일반적인 While()반복문으로 교체했지만 결과는 동일.
원인 : Scanner 객체의 문제로 값을 입력버퍼에 저장하였지만 인터럽트가 발생하여 입력버퍼가 지워지기전에 반복문이 재생, 오입력이 계속 발생.
문제 해결 : sc.nextLine() 구문을 통해 예외 발생시 처리 후 버퍼를 초기화시켜주면서 해결.
catch (InputMismatchException e) {
System.out.println("숫자 혹은 정수를 입력해주세요.");
sc.nextLine();
}

try {
// 스캐너를 통한 숫자 1,2 입력 후 변수저장.
System.out.print("첫 번째 숫자를 입력하세요 : ");
firstNum = sc.nextInt();
System.out.print("두 번째 숫자를 입력하세요 : ");
secondNum = sc.nextInt();
} catch (InputMismatchException e) {
System.out.println("숫자를 입력해주세요.");
System.exit(0);
}
// ...
try {
// 연산자의 따른 연산 진행 제어문
switch (operator) {
case '+':
result = firstNum + secondNum;
System.out.println(firstNum + " " + operator + " " + secondNum + " = " + result);
break;
// 사칙연산 계산로직 ...
} catch (ArithmeticException e) {
System.out.println("0으로는 나눌 수 없습니다.");
}
문제 발생 : 코드작성 컨벤션 중 하나로 try - catch 문을 예외발생 구역마다 설정으로 인한 가독성 저하.
원인 : 예외가 발생하는 두구역을 별도의 try - catch가 담당하도록 코드를 작성.
문제해결 : try구문 영역을 늘리고 다중 catch문을 이용하여 예외를 한번에 잡으며 가독성 문제 해결.
생각해볼점 :
try {
// 사칙연산 계산로직...
// 0 으로 나누기 연산시 예외발생 처리
} catch (ArithmeticException e) {
System.out.println("0으로는 나눌 수 없습니다.");
// 숫자 실수 및 문자 입력시 예외발생 처리
} catch (InputMismatchException e) {
System.out.println("숫자 혹은 정수를 입력해주세요.");
sc.nextLine();
}

문제발생 : LV2 과정으로 코드를 재구성하면서 규정된 사칙연산자외에 연산자가들어올시 연산을 시도하려는 상황 발생.
원인 : 코드를 구성하면서 연산자구별 제어문에 그외 문자일경우 상황이 빠져있는것을 확인.
문제해결 : default 구문으로 콘솔출력을 뺄 순있지만 커스텀예외클래스를 만들어 throw 를 통한 예외객체 발생방식으로 해결
//연산자 외 문자 입력시 예외 발생 유도
default:
throw new OperatorInputException("+,-,*,% 연산자만 입력해주세요");
public class OperatorInputException extends RuntimeException {
OperatorInputException() {
super();
}
OperatorInputException(String message) {
super(message);
}
}
catch (OperatorInputException e) {
System.out.println(e.getMessage());
}


public class App {
public static void main(String[] args) {
// 서비스 매니저 객체생성 및 프로그램 실행
ServiceManager sm = new ServiceManager();
sm.run();
}
}


if (!selIndex.matches("[0-9]+")) {
System.out.println("0 ~ 9 사이에서만 입력이 가능합니다.");
}
case "3":
System.out.println("알고싶은 순번의 번호를 입력해주세요.");
selIndex = sc.nextLine();
System.out.println("지정 순번의 결과는 = " + calc.getResult(Integer.parseInt(selIndex)) + " 입니다.");
break;


operatorType = OperatorType.valueOf(operator);
enum OperatorType {
ADD("+"),
SUB("-"),
MULT("*"),
DIV("/"),
REM("%");
private final String operator;
// 생성자를 통한 String 매칭
OperatorType(String operator) {
this.operator = operator;
}
public String getOperator() {
return operator;
}
}
enum OperatorType {
ADD("+"),
SUB("-"),
MULT("*"),
DIV("/"),
REM("%");
// 프로그램이 실행되면 Map을 캐싱해 찾고자 하는 키값과 필드값을 매칭
private static final Map<String, OperatorType> OPERATOR_MAP =
Collections.unmodifiableMap(Stream.of(values()).collect(Collectors.toMap(OperatorType::getOperator, Function.identity())));
private final String operator;
// 생성자를 통한 String 매칭
OperatorType(String operator) {
this.operator = operator;
}
// 입력된 연산자를 통해 Map 안에서 열거 객체 리턴
public static OperatorType find(String operator) {
if (OPERATOR_MAP.containsKey(operator)) {
return OPERATOR_MAP.get(operator);
}
//연산자 외 문자 입력시 예외 발생 유도
throw new IllegalArgumentException("맞지 않는 연산자 입력 : " + operator);
}
public String getOperator() {
return operator;
}
}
참조 :
https://itellyhood.tistory.com/70
https://velog.io/@ljinsk3/Enum%EC%9D%98-%EC%9A%94%EC%86%8C%EB%A5%BC-%EC%A1%B0%ED%9A%8C%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%EB%B9%84%EA%B5%90-%ED%8C%A9%ED%86%A0%EB%A6%AC-%EB%A9%94%EC%84%9C%EB%93%9C-vs-HashMap


문제 발생 : 제네릭 주입을 위해 Number class의 하위클래스들 객체만이 Type의 들어올수 있게 지정하고 해당 변수들로 연산을 진행하였으나, Type T는 피연산자가 됄수 없다는 오류발생.
가설 : Type T가 어떤형태의 Type인지 선언되있지않기에 확실한 연산을 진행하지 못하는가?
원인 : 해당 Type이 Number의 하위 객체인것은 알지만 정확한 Type에 대한 명시가 필요.
문제해결 : 들어온 매개변수에 Number.doubleValue() 메소드를 통해 double 화 시키고 연산을 진행해 문제해결
switch (operatorType) {
case ADD:
result = firstNum.doubleValue() + secondNum.doubleValue();
// 연산 과정 및 결과 저장 메서드 호출.
saveCalculationProcess(firstNum, secondNum, result, operator);
break;
System.out.print("첫 번째 숫자를 입력하세요 : ");
number = sc.nextLine();
// 입력받은 숫자가 정수인지 실수인지 검사.
if (number.contains(".")) {
firstNumDouble = Double.parseDouble(number);
fisrtdoublecnt++;
} else {
firstNumInt = Integer.parseInt(number);
firstintcnt++;
}
if (fisrtdoublecnt != 0 && seconddoublecnt != 0) {
if (calc.negativeIntegerChecker(firstNumDouble, secondNumDouble)) {
System.out.println("양수만 입력해주세요.");
continue;
}
System.out.println(firstNumDouble + " " + operator + " " + secondNumDouble + " = " + calc.calculate(firstNumDouble, secondNumDouble, operator));
}