문자열 계산기 TDD
TDD로 바꿔서 진행해보기
1. "," 빈문자 , null , "/" Test (9/25)
- ","를 구별하는 테스트
- "/" , ","를 구별하는 테스트
- 빈 값을 구별하는 테스트
- null 값 구별하는 테스트
총 4가지 테스를 진행해봅니다.
class StringCal{
private StringCalculator st;
@BeforeEach
void 초기() {
st=new StringCalculator();
}
@Test
void testWhenComma(){
String res[]=st.split("1,2,3");
assertArrayEquals(new String[] {"1","2","3"},res);
}
@Test
void testWhenLine_and_Comma(){
String []res=st.split("1/2,3");
assertArrayEquals(new String[] {"1","2","3"},res);
}
@Test
void testWhenEmpty(){
String []res=st.split("");
assertArrayEquals(new String []{""},res);
}
@Test
void testWhenNull(){
String []res=st.split(null);
assertArrayEquals(new String[]{},res);
}
}
public class StringCalculator {
String []split(String text){
if(text == null){
return new String[]{};
}
return text.split(",|/");
}
}
2.문자열 -> 정수형 배열 변환 , 빈 값 ,null 값 검사 (9/26)
- 문자열 -> 정수형 배열로 검사 테스트
- 빈 값 검사 테스트
- null값 검사 테스트
@Test
void tesetToInt(){
//문자열 -> 정수형 검사
String []res=st.split("1,2,3");
int[] numbers =st.toInt(res);
assertArrayEquals(new int[]{1,2,3} ,numbers);
//빈 값 검사
numbers=st.toInt(new String[]{});
assertArrayEquals(new int[]{},numbers);
//널 검사
numbers=st.toInt(null);
assertArrayEquals(new int[]{},numbers);
}
public class Cal {
int numbers[];
int[] toInt(String []text) {
if(text == null){
return new int[]{};
}
numbers=new int[text.length];
for(int i=0; i<text.length; i++){
int num=Integer.parseInt(text[i]);
numbers[i]=num;
}
return numbers;
}
}
3. 덧셈 , 음수값 검사 (10/05)
- 덧셈 테스트
- 음수값 테스트
class StringCal{
private StringCalculator st;
@BeforeEach
void 초기() {
st=new StringCalculator();
}
@Test
void 덧셈() throws Exception {
String []res=st.split("1,2,3");
int []number=st.toInt(res);
assertEquals(6,st.add(number));
}
@Test
void 음수값() throws Exception {
String []res=st.split("-1,2,3");
RuntimeException exception=assertThrows(RuntimeException.class,()->{
st.toInt(res);
});
}
}
public class Cal {
//문자열 입력이 들어오면 ,로 분리해서 다시 반환
int res=0;
String []split(String text){
if(text==null){
return new String[]{};
}
return text.split(",|/");
}
int numbers[];
int[] toInt(String []text) throws Exception {
if(text == null){
return new int[]{};
}
numbers=new int[text.length];
for(int i=0; i<text.length; i++){
int num=Integer.parseInt(text[i]);
if(num <0){
throw new RuntimeException();
}
numbers[i]=num;
}
return numbers;
}
int add(int []numbers){
int sum=0;
for(int i: numbers){
sum+=i;
}
return sum;
}
}
일단 TDD로 진행을 하고 있는데 기존 OOP 문자열 리팩토링과 다른 점을 모르겠다.
내 코드가 잘못된건가? 좀더 공부를 할 필요가 있을 것 같다.
4. 리펙토링 (toInt기능 -> 메서드 분리) (10/08)
- null 값 메서드
- 문자열 -> 정수형 변환 (들여쓰기 줄여보기) 메서드
- 배열 크기 정하는 메서드
public class Cal {
public static int numbers[];
String[] splite(String text){
if(text==null){
return new String[]{};
}
return text.split(",|/");
}
/**
* 기능 분리
* 1. null값 검사
* 2. 문자열 -> 정수형 변환 검사 (들여쓰기 줄여보기)
* 3. 배열 크기 정하는 메서드
*
*/
// 1. null 검사 메서드드
public static int[] Arrnull(String []text){
if(text==null){
return new int[]{};
}
return new int[]{};
}
// 2. 문자열 -> 정수형 변환 검사 (들여쓰기 줄여보기)
public static void changeNumber(String []text){
for(int i=0; i<text.length; i++){
int num=Integer.parseInt(text[i]);
numbers[i]=num;
}
}
// 3. 배열 크기 정하는 메서드
public static void ArrSize(String []text){
numbers=new int[text.length];
}
int[] toInt(String []text){
// 3. 배열 크기 정하는 메서드
ArrSize(text);
// 1. null값 검사
Arrnull(text);
changeNumber(text);
return numbers;
}
}
5. 리펙토링 (사칙연산 기능) (10/09)
- 사칙연산하는 클래스 따로 분리
- 덧셈 , 뺄셈 , 나눗셈 , 곱셈
public class CalculatorGame {
public static Cal cal=new Cal();
int add(String []text){
// 문자열 검사 진행
int numbers[]=cal.toInt(text);
int sum=0;
for(int n: numbers){
sum+=n;
}
return sum;
}
}
@Test
void 덧셈(){
String []res=cal.splite("1,2,3");
int sum=calculatorGame.add(res);
assertEquals(6,sum);
}
뺄셈을 구현하는 메서드는 다음에 다시 해보자 인덱스값을 하나 하나 빼서 연산을 처리하면 될 것 같다
6. 사칙연산 메서드 (Token 사용) (10/09)
- 뺄셈 ,곱셈 메서드 구현
기존에 배열로 뺄셈을 구현할려니깐 생각이 나질않았다 덧셈 처럼 구현하기에는 계속 음수 값이나오고 분리를 해야하는데 계속 찾아보다 Token을 이용해서 분리하면 쉽게 연산을 처리 할 수 있을 것 같아서 도입을 했다.
import java.nio.channels.ScatteringByteChannel;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.StringTokenizer;
public class CalculatorGame {
public static Cal cal=new Cal();
public static int res=1;
public static int sum=0;
public static int minus=0;
public static String token;
/**
*
* @param text
* @return
*
* 1. 덧셈
* 2. 곱셈
* 3. 나눗셈
* 4. 뺄셈
*/
//1.덧셈
public static int add(String []text){
int numbers[]=cal.toInt(text);
for(int n: numbers){
sum+=n;
}
return sum;
}
//2.곱셈
public static int multip(String []text){
int numbers[]=cal.toInt(text);
for(int n: numbers){
res*=n;
}
return res;
}
//3.나눗셈
public static int divison(String []text){
int numbers[]=cal.toInt(text);
return 0;
}
//4.뺄셈
public static int calMinus(/*String text*/String []text){
//여기가 계속 오류가 나오고 있다
//변환을 다시 해보자
String str=text.toString();
//토큰으로 변환
// StringTokenizer st=new StringTokenizer(text,"-");
StringTokenizer st=new StringTokenizer(str);
while(st.hasMoreTokens()){
minus=Integer.valueOf(st.nextToken())-Integer.valueOf(st.nextToken());
}
return minus;
}
@Test
void 뺄셈(){
// int res=calculatorGame.calMinus("3-2");
String[] str=cal.splite("4,3");
int res=calculatorGame.calMinus(str);
assertEquals(1,res);
}
NumberFormatException 에러가 계속 터지고 있다
확인을 해보니 String str=text.toString(); 코드에서 계속 주소값이 출력이 되고 있다. (수정)
//4.뺄셈
public static int calMinus(/*String text*/String []text){
//여기가 계속 오류가 나오고 있다
//변환을 다시 해보자
// String str=text.toString();
String str=String.join(",",text);
//토큰으로 변환
// StringTokenizer st=new StringTokenizer(text,"-");
StringTokenizer st=new StringTokenizer(str,",");
while(st.hasMoreTokens()){
minus=Integer.valueOf(st.nextToken())-Integer.valueOf(st.nextToken());
}
return minus;
}
}
7. 사칙연산 메서드 (Token 사용) (10/14)
- 나눗셈 메서드 구현
- 뺄셈 메서드 이름 수정 (callMinus)
- 클래스 변수 지역변수로 변경 (minus)
public class CalculatorGame {
public static Cal cal=new Cal();
public static int res=1;
public static int sum=0;
public static String token;
/**
*
* @param text
* @return
*
* 1. 덧셈
* 2. 곱셈
* 3. 나눗셈
* 4. 뺄셈
*/
//1.덧셈
public static int add(String []text){
int numbers[]=cal.toInt(text);
for(int n: numbers){
sum+=n;
}
return sum;
}
//2.곱셈
public static int multip(String []text){
int numbers[]=cal.toInt(text);
for(int n: numbers){
res*=n;
}
return res;
}
//3.나눗셈
public static int divison(String []text){
int numbers[]=cal.toInt(text);
return 0;
}
//4.뺄셈
public static int callMinus(/*String text*/String []text){
//여기가 계속 오류가 나오고 있다
//변환을 다시 해보자
// String str=text.toString();
int minus=0;
String str=String.join(",",text);
//토큰으로 변환
// StringTokenizer st=new StringTokenizer(text,"-");
StringTokenizer st=new StringTokenizer(str,",");
while(st.hasMoreTokens()){
minus=Integer.valueOf(st.nextToken())-Integer.valueOf(st.nextToken());
}
return minus;
}
//나눗셈
public static int callDivison(String []text){
int division=0;
String str=String.join(",",text);
StringTokenizer st=new StringTokenizer(str,",");
while(st.hasMoreTokens()){
division=Integer.parseInt(st.nextToken()) / Integer.parseInt(st.nextToken());
}
return division;
}
}
전체적으로 리펙토링을 해야 할 것 같다 사칙연산을 모두 토큰으로 받는 방식으로 바꾸고
토큰 부분은 메서드를 분리해서 구현을 해보자
8. 리펙토링 (사칙연산 기능) (10/14)
- Cal final 추가
- 문자열 배열 -> 문자열 변환 메서드로 분리
- 스테틱 변수로 변경 (StringTokenizer)
public class CalculatorGame {
public static final Cal cal=new Cal();
public static String token;
public static StringTokenizer st;
/**
*
* @param text
* @return
*
* 1. 덧셈
* 2. 곱셈
* 3. 나눗셈
* 4. 뺄셈
*/
//문자 배열 ->문자열로 변경
public static String str(String []text){
return String.join(",",text);
}
//토큰 분리
//1.덧셈
public static int callAdd(String []text){
int sum=0;
String s=str(text);
st=new StringTokenizer(s,",");
while(st.hasMoreTokens()) {
sum = Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken());
}
return sum;
}
//2.곱셈
public static int callMultip(String []text){
int mul=0;
String s=str(text);
st=new StringTokenizer(s,",");
while (st.hasMoreTokens()){
mul=Integer.parseInt(st.nextToken()) * Integer.parseInt(st.nextToken());
}
return mul;
}
//4.뺄셈
public static int callMinus(/*String text*/String []text){
int minus=0;
String s=str(text);
st=new StringTokenizer(s,",");
while(st.hasMoreTokens()){
minus=Integer.valueOf(st.nextToken())-Integer.valueOf(st.nextToken());
}
return minus;
}
//3. 나눗셈
public static int callDivison(String []text){
int division=0;
String s=str(text);
st=new StringTokenizer(s,",");
while(st.hasMoreTokens()){
division=Integer.parseInt(st.nextToken()) / Integer.parseInt(st.nextToken());
}
return division;
}
}
Author And Source
이 문제에 관하여(문자열 계산기 TDD), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ghks285/자바-웹-프로그래밍-Next-Step-1장-TDD저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)