✏️ 코드
✅ 예외처리를 어떻게 진행하는 게 좋을까?
이번 미션을 보고 저는 다음과 같이 기능 구현을 큰 단위로 먼저 작성해 보았습니다.
- 덧셈 안내문 출력
- 문자열 입력받기
- 계산 기능 구현
- 결과 출력하기
그리고 2번에 해당하는 기능이 이번 미션의 핵심 기능
이라고 생각했습니다.
특히 2번에서 validate를 어떻게 진행하고 예외처리를 어떻게 잘 거르냐가 중요하다고 생각했습니다.
☑️ 정규 표현식의 사용!
문제를 푸는 것만큼이나 중요한 것이 출제자의 의도를 파악하는 것인데요.
이번 문제의 핵심은 정규표현식의 사용이 아닐까 생각합니다.
문제에서 default 구분자로 ", "와 ":"가 주어졌고,
custom 구분자를 지정해야 하면 입력값에 "//" , "\n" 이 들어가야 하며 추가적으로 다양한 기호들이 들어갈 수 있습니다.
이러한 점을 고려했을 때 기호들을 일일이 예외처리하면 코드가 복잡해질 것입니다
따라서 정규표현식을 이용하여 코드를 간결하고 가독성 있게 바꾸는 것이 중요하다고 생각하였습니다!
이렇게 위의 정규표현식의 문법을 사용해서,
default separator를 이용하는 경우에는 다음과 같이 작성하며
String regex = "[0-9,:]*";
custom separator를 이용하는 경우에는 다음과 같이 작성하여 예외 처리 진행하였습니다!
String regex = "[0-9,:" + customSeparator + "]*";
☑️ 백슬래시 문자 (" \ ")가 커스텀 구분자로 들어가게 된 경우를 고려하자!
위에서 다룬 정규표현식으로 웬만해서는 거의 다 걸러지는데,
걸러지지 않는 특수한 케이스가 있었습니다.
입력 : //\\n1\2\3
바로 위와 같이 "백슬래시"가 커스텀 구분자로 입력된 경우입니다.
이렇게 입력으로 들어가게 되면 백슬래시 문자가 이스케이프 문자로 해석되기 때문에,
의도한 대로 커스텀 구분자를 지정할 수 없게 됩니다.
따라서 이러한 경우 이스케이프 처리가 필요합니다.
🔎 첫 번째 해결 방안) 백슬래시 추가
int start = expression.indexOf(CUSTOM_DELIMITER_PREFIX) + PREFIX_OFFSET;
int end = expression.indexOf(CUSTOM_DELIMITER_SUFFIX);
String customSeparator = expression.substring(start, end);
if (customSeparator.contains(BACKSLASH)) {
customSeparator = BACKSLASH + customSeparator
}
그래서 첫 번째로 생각했던 방안은 위와 같이
단순히 "//"와 "\n" 사이에 있는 구분자 값 앞에다가 백슬래쉬를 붙여주는 방식으로 해결하였습니다.
그러나 위와 같은 방법으로 해결했을 때,
입력 : //;\\n1;\2;\3
위와 같이 커스텀 구분자가 " ;\ "로 백슬래시 앞에 기호가 있는 경우에는
단순히 백슬래시를 앞에다가 붙임으로써
커스텀 구분자 내에 있는 백슬래시를 이스케이프 시키지 못하는 문제점이 발생하였습니다.
🔎 최종 해결 방안) .replace()
customSeparator = customSeparator.replace(BACKSLASH, BACKSLASH + BACKSLASH);
그래서 다음과 같이 .replace() 문법을 사용하여 백슬래시 "\"를 "\\"로 replace 하였습니다.
이렇게 함으로써 커스텀 구분자 내에 백슬래시가 어디에 위치하든,
이스케이프 시키도록 처리하였습니다!
☑️ 기능 요구 사항의 "예시"를 잘 살펴보자!
이번 미션에는 특이한 점이 있었습니다.
보통 빈 여백의 값에 대해서는 예외처리를 하는 경우가 일반적인데,
미션의 과제에서는 빈 값을 0의 값으로 처리하도록 요구하였습니다.
따라서 이번 미션에서 예제를 꼼꼼히 살펴보지 않았다면 이 부분을 놓쳤을 것 같다고 생각이 듭니다..
이러한 요구사항을 적용하기 위해
각 항을 다루는 객체인 Term에서 빈 값이 들어왔을 때,
0으로 return 하도록 로직을 구성하였고, 위의 요구사항에 대해 적용시킬 수 있었습니다!