-
Notifications
You must be signed in to change notification settings - Fork 1.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
자동차 경주 1단계 미션 리뷰 수정 및 2단계 문자열 계산 소스 생성 #5173
base: seojigyeong
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,137 @@ | ||||||||||||||||||
package study; | ||||||||||||||||||
|
||||||||||||||||||
import javafx.css.Match; | ||||||||||||||||||
|
||||||||||||||||||
import java.util.regex.Matcher; | ||||||||||||||||||
import java.util.regex.Pattern; | ||||||||||||||||||
|
||||||||||||||||||
public class StringAddCalculator { | ||||||||||||||||||
|
||||||||||||||||||
private static final StringAddCalculator instance = new StringAddCalculator(); | ||||||||||||||||||
public static int ZERO = 0; | ||||||||||||||||||
public static String COMMA = ","; | ||||||||||||||||||
public static String COLON = ":"; | ||||||||||||||||||
|
||||||||||||||||||
public int splitAndSum(String input) { | ||||||||||||||||||
|
||||||||||||||||||
int result = ZERO; | ||||||||||||||||||
|
||||||||||||||||||
// 1. 빈 문자열 또는 null 값을 입력할 경우 0을 반환해야 한다. | ||||||||||||||||||
if(_checkValidNull(input)) { | ||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 자바 코드 컨벤션을 맞춰주시면 좋을 것 같습니다! 함수명 혹은 변수명등 모두 언더바로 시작하지 않고 알파벳 소문자로 시작하도록 가이드하고 있습니다. 참고: https://naver.github.io/hackday-conventions-java/#identifier-char-scope |
||||||||||||||||||
return result; | ||||||||||||||||||
} | ||||||||||||||||||
|
||||||||||||||||||
// 2. 숫자 하나를 문자열로 입력할 경우 해당 숫자를 반환한다. | ||||||||||||||||||
|
||||||||||||||||||
if(_isNumeric(input)) { | ||||||||||||||||||
result = _parseInt(input); | ||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 숫자 하나일 경우, 아래 다음 로직들을 탈 필요가 없을 것 같지 않나요?
Suggested change
|
||||||||||||||||||
} | ||||||||||||||||||
|
||||||||||||||||||
|
||||||||||||||||||
// 3. 숫자 두개를 컴마(,)구분자로 입력할 경우 두 숫자의 합을 반환한다. | ||||||||||||||||||
// 4. 구분자를 컴마(,) 이외에 콜론(:)을 사용할 수 있다. | ||||||||||||||||||
if(_containsCharacter(input, COMMA) || _containsCharacter(input, COLON)) { | ||||||||||||||||||
result =_sumNumbericSplitByCommaOrColon(input); | ||||||||||||||||||
} | ||||||||||||||||||
|
||||||||||||||||||
// 5. "//"와 "\n" 문자 사이에 커스텀 구분자를 지정할 수 있다. | ||||||||||||||||||
|
||||||||||||||||||
Matcher m = _containsCharacter(input); | ||||||||||||||||||
if(m != null) { | ||||||||||||||||||
result = _sumNumbericSplitByCharacter(input, m); | ||||||||||||||||||
} | ||||||||||||||||||
|
||||||||||||||||||
return result; | ||||||||||||||||||
|
||||||||||||||||||
} | ||||||||||||||||||
|
||||||||||||||||||
private void _checkMinusNumeric(int input) { | ||||||||||||||||||
if(input < 0) { | ||||||||||||||||||
throw new RuntimeException(); | ||||||||||||||||||
} | ||||||||||||||||||
|
||||||||||||||||||
} | ||||||||||||||||||
private boolean _checkValidNull(String input) { | ||||||||||||||||||
if(input == null ) { | ||||||||||||||||||
return true; | ||||||||||||||||||
} | ||||||||||||||||||
if(input.isEmpty()) { | ||||||||||||||||||
return true; | ||||||||||||||||||
} | ||||||||||||||||||
return false; | ||||||||||||||||||
Comment on lines
+55
to
+61
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
여러 조건들을 묶을 수 없을까요? |
||||||||||||||||||
} | ||||||||||||||||||
|
||||||||||||||||||
private int _parseInt(String input){ | ||||||||||||||||||
|
||||||||||||||||||
int inputInteger = ZERO; | ||||||||||||||||||
if(!_isNumeric(input)) { | ||||||||||||||||||
return inputInteger; | ||||||||||||||||||
} | ||||||||||||||||||
|
||||||||||||||||||
inputInteger = Integer.parseInt(input); | ||||||||||||||||||
|
||||||||||||||||||
/** | ||||||||||||||||||
* 6. 음수 체크 | ||||||||||||||||||
* */ | ||||||||||||||||||
_checkMinusNumeric(inputInteger); | ||||||||||||||||||
|
||||||||||||||||||
return inputInteger; | ||||||||||||||||||
} | ||||||||||||||||||
|
||||||||||||||||||
private boolean _isNumeric(String input) { | ||||||||||||||||||
return Pattern.matches("-?\\d+", input); | ||||||||||||||||||
} | ||||||||||||||||||
|
||||||||||||||||||
private boolean _containsCharacter(String input, String Character) { | ||||||||||||||||||
// 문자열에 컴마가 포함되어 있는지 확인 | ||||||||||||||||||
if(COMMA.equals(Character)) { | ||||||||||||||||||
return input.contains(COMMA); | ||||||||||||||||||
} else if(COLON.equals(Character)) { | ||||||||||||||||||
return input.contains(COLON); | ||||||||||||||||||
} | ||||||||||||||||||
return false; | ||||||||||||||||||
} | ||||||||||||||||||
|
||||||||||||||||||
private int _sumNumbericSplitByCommaOrColon(String input) { | ||||||||||||||||||
int sumResult = 0; | ||||||||||||||||||
String[] numbers = input.split(COMMA); | ||||||||||||||||||
for(String number : numbers) { | ||||||||||||||||||
if (_isNumeric(number)) { | ||||||||||||||||||
sumResult += _parseInt(number); | ||||||||||||||||||
} else { | ||||||||||||||||||
if(_containsCharacter(number, COLON)) { | ||||||||||||||||||
String[] numbersColon = number.split(COLON); | ||||||||||||||||||
for(String numberColon : numbersColon) { | ||||||||||||||||||
sumResult += _parseInt(numberColon); | ||||||||||||||||||
} | ||||||||||||||||||
} | ||||||||||||||||||
} | ||||||||||||||||||
} | ||||||||||||||||||
|
||||||||||||||||||
return sumResult; | ||||||||||||||||||
} | ||||||||||||||||||
Comment on lines
+95
to
+112
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||||||||||||||||||
|
||||||||||||||||||
private Matcher _containsCharacter(String input) { | ||||||||||||||||||
Matcher m = Pattern.compile("//(.)\n(.*)").matcher(input); | ||||||||||||||||||
if (m.find()) { | ||||||||||||||||||
return m; | ||||||||||||||||||
} else { | ||||||||||||||||||
return null; | ||||||||||||||||||
} | ||||||||||||||||||
} | ||||||||||||||||||
Comment on lines
+114
to
+121
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||||||||||||||||||
private int _sumNumbericSplitByCharacter(String input, Matcher m) { | ||||||||||||||||||
int sumResult = 0; | ||||||||||||||||||
|
||||||||||||||||||
String customDelimiter = m.group(1); | ||||||||||||||||||
String[] tokens= m.group(2).split(customDelimiter); | ||||||||||||||||||
Comment on lines
+125
to
+126
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 1과 2가 무엇을 의미하는지 알기 쉬울까요? 매직넘버는 상수로 분리해주면 좋을 것 같습니다 |
||||||||||||||||||
for(String token : tokens) { | ||||||||||||||||||
sumResult += _parseInt(token); | ||||||||||||||||||
} | ||||||||||||||||||
|
||||||||||||||||||
return sumResult; | ||||||||||||||||||
} | ||||||||||||||||||
|
||||||||||||||||||
public static StringAddCalculator getInstance() { | ||||||||||||||||||
return instance; | ||||||||||||||||||
} | ||||||||||||||||||
Comment on lines
+134
to
+136
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 싱글턴 패턴으로 만드셨군요. 그렇다면 생성자 제한을 통해 해당 함수가 아니면 객체 생성을 못하도록 막는게 어떨까요? |
||||||||||||||||||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
package study; | ||
|
||
import org.junit.jupiter.api.Test; | ||
|
||
import static org.assertj.core.api.Assertions.assertThat; | ||
import static org.assertj.core.api.Assertions.assertThatThrownBy; | ||
|
||
public class StringAddCalculatorTest { | ||
|
||
StringAddCalculator stringAddCalculator = StringAddCalculator.getInstance(); | ||
|
||
@Test | ||
public void splitAndSum_null_또는_빈문자() { | ||
|
||
int result = stringAddCalculator.splitAndSum(null); | ||
assertThat(result).isEqualTo(0); | ||
|
||
result = stringAddCalculator.splitAndSum(""); | ||
assertThat(result).isEqualTo(0); | ||
} | ||
|
||
@Test | ||
public void splitAndSum_숫자하나() throws Exception { | ||
int result = stringAddCalculator.splitAndSum("1"); | ||
assertThat(result).isEqualTo(1); | ||
} | ||
|
||
@Test | ||
public void splitAndSum_쉼표구분자() throws Exception { | ||
int result = stringAddCalculator.splitAndSum("1,2"); | ||
assertThat(result).isEqualTo(3); | ||
} | ||
|
||
@Test | ||
public void splitAndSum_쉼표_또는_콜론_구분자() throws Exception { | ||
int result = stringAddCalculator.splitAndSum("1,2:3"); | ||
assertThat(result).isEqualTo(6); | ||
} | ||
|
||
@Test | ||
public void splitAndSum_custom_구분자() throws Exception { | ||
int result = stringAddCalculator.splitAndSum("//;\n1;2;3"); | ||
assertThat(result).isEqualTo(6); | ||
} | ||
|
||
@Test | ||
public void splitAndSum_negative() throws Exception { | ||
assertThatThrownBy(() -> stringAddCalculator.splitAndSum("-1,2,3")) | ||
.isInstanceOf(RuntimeException.class); | ||
} | ||
|
||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
주석은 보통 함수가 의미를 충분히 전달할 수 없는 이름이거나, 상황이나 조건에 따라 성능이 달라지거나 외부적인 요인등 함수 시그니처로 충분히 설명이 되지 않고 인수인계가 필요한 경우 작성하는 편이에요.
그 외에는 불필요한 주석은 함수명과 중복되어 의미의 혼동 혹은 중복을 야기하며 가독성을 떨어트리는 편입니다.