์๊ตฌ์ฌํญ
โข ๊ฐ๋จํ ์ฌ์น์ฐ์ฐ์ ํ ์ ์๋ค. โ๏ธ
โข ์์๋ก๋ง ๊ณ์ฐํ ์ ์๋ค. โ๏ธ
โข ๋๋์ ์์ 0์ ๋๋๋ ๊ฒฝ์ฐ IllegalArgument ์์ธ๋ฅผ ๋ฐ์์ํจ๋ค. โ๏ธ
โข MVCํจํด(Model-View-Controller) ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํํ๋ค. โ๏ธ
๐ enum์ ํ์ฉํ ์ฌ์น์ฐ์ฐ ๊ณ์ฐ๊ธฐ
ArithmeticOperator
public enum ArithmeticOperator {
ADDITION("+") {
@Override
public int arithmeticCalculate(PositiveNumber operand1, PositiveNumber operand2) {
return operand1.toint() + operand2.toint();
}
}, SUBSTRACTION("-") {
@Override
public int arithmeticCalculate(PositiveNumber operand1, PositiveNumber operand2) {
return operand1.toint() - operand2.toint();
}
}, MULTIPLICATION("*") {
@Override
public int arithmeticCalculate(PositiveNumber operand1, PositiveNumber operand2) {
return operand1.toint() * operand2.toint();
}
}, DIVISION("/") {
@Override
public int arithmeticCalculate(PositiveNumber operand1, PositiveNumber operand2) {
return operand1.toint() / operand2.toint();
}
};
private final String operator;
ArithmeticOperator(String operator) {
this.operator = operator;
}
public abstract int arithmeticCalculate(final PositiveNumber operand1, final PositiveNumber operand2);
public static int calculate(PositiveNumber operand1, String operator, PositiveNumber operand2) {
ArithmeticOperator arithmeticOperator = Arrays.stream(values())
.filter(v -> v.operator.equals(operator))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("์ฌ๋ฐ๋ฅธ ์ฌ์น์ฐ์ฐ์ด ์๋๋๋ค."));
return arithmeticOperator.arithmeticCalculate(operand1, operand2);
}
}
Calculator
public class Calculator {
public static int calculate(PositiveNumber operand1, String operator, PositiveNumber operand2) {
return ArithmeticOperator.calculate(operand1, operator, operand2);
}
}
๋จผ์ , ์ ๋ฒ ์๊ฐ์๋ Calculator ํด๋์ค ๋ด์์ ์ฌ์น์ฐ์ฐ์ ๊ตฌํํ์์ง๋ง ์ด๋ฒ์๋ enum์ ํตํด ์ฌ์น์ฐ์ฐ์ ๊ตฌํํ์๋ค. ์์ง enum์ ๋ง์ด ์ฌ์ฉํด๋ณธ์ ์ด ์์ด ๋ฏ์ค์๋ค. ์ฌ๊ธฐ์ stream์ ์ฌ์ฉํ๋๋ฐ stream์ ํ๋ฒ ๋ ๊ณต๋ถํด๋ณด์์ผ ํ ๋ฏ ํ๋ค.
Calculator ํด๋์ค์ calculate ๋ฉ์๋๋ ArithmeticOperator ๋ด์ calculate ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๊ฒฐ๊ณผ๊ฐ์ ์ ๋ฌํ๋ค.
๋ํ, ArithmeticOperator calculate๋ ๋ค์๊ณผ ๊ฐ์ ์ญํ ์ ์ํํ๋ค.
- values() ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ArithmeticOperator ์ด๊ฑฐํ์ ์ ์๋ ๋ชจ๋ ์ฐ์ฐ์๋ค์ ๊ฐ์ ธ์จ๋ค.
- ๊ฐ์ ธ์จ ์ฐ์ฐ์๋ค ์ค์์ ์ ๋ ฅ๋ operator์ ์ผ์นํ๋ ์ฐ์ฐ์๋ฅผ ์ฐพ๋๋ค.
- findFirst() ๋ฉ์๋๋ฅผ ํตํด ์ผ์นํ๋ ์ฒซ ๋ฒ์งธ ์ฐ์ฐ์๋ฅผ ๊ฐ์ ธ์จ๋ค. ๋ง์ฝ ์ผ์นํ๋ ์ฐ์ฐ์๊ฐ ์๋ค๋ฉด, orElseThrow() ๋ฉ์๋๋ฅผ ํตํด "์ฌ๋ฐ๋ฅธ ์ฌ์น์ฐ์ฐ์ด ์๋๋๋ค."๋ผ๋ ์์ธ๋ฅผ ๋์ง๋ค.
- ์ฐพ์ ์ฐ์ฐ์๋ฅผ ์ด์ฉํ์ฌ operand1๊ณผ operand2๋ฅผ ๊ฐ์ง๊ณ ํด๋น ์ฐ์ฐ์์ arithmeticCalculate ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ค์ ์ฌ์น์ฐ์ฐ์ ์ํํ๋ค.
์๊ตฌ์ฌํญ ์ค ๋๋ฒ์งธ, '์์๋ก๋ง ๊ณ์ฐํ ์ ์๋ค'๋ฅผ ์ถฉ์กฑํ๊ธฐ ์ํด PositiveNumber class๋ฅผ ๋ง๋ค๊ณ value๊ฐ์ด ์์์ผ ๋ IllegalArgumentException์ ๋์ง๋ค.
PositiveNumber
public class PositiveNumber {
private final int value;
public PositiveNumber(int value) {
validate(value);
this.value = value;
}
private void validate(int value) {
if(isNegativeNumber(value)) {
throw new IllegalArgumentException("0๋๋ ์์๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค.");
}
}
private boolean isNegativeNumber(int value) {
return value <=0;
}
public int toint() {
return value;
}
}
์ด์ ๊ฐ์ด ์ฒ๋ฆฌํ๋ฉด ๋๋์ ์์ 0์ผ๋ก ๋๋๋ ๊ฒฝ์ฐ ์ญ์ ์ ์ธ๋๋ค.
๋ง์ง๋ง์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด Test ํ ์ ์๋ค.
CalculatorTest
public class CalculatorTest {
// 1 + 2 ---> Calculator
// 3 ---<
@DisplayName("๋ง์
์ฐ์ฐ์ ์ํํ๋ค.")
@Test
void additionTest() {
int result = Calculator.calculate(new PositiveNumber(1), "+", new PositiveNumber(2));
assertThat(result).isEqualTo(3);
}
@DisplayName("๋บ์
์ฐ์ฐ์ ์ํํ๋ค")
@Test
void subtractionTest() {
int result = Calculator.calculate(new PositiveNumber(2), "-", new PositiveNumber(1));
assertThat(result).isEqualTo(1);
}
@DisplayName("์ฌ์น์ฐ์ฐ์ ์ํํ๋ค.")
@ParameterizedTest
@MethodSource("fomulaAndResult")
void calculatorTest(int operand1, String operator, int operand2, int expect) {
int result = Calculator.calculate(new PositiveNumber(operand1), operator, new PositiveNumber(operand2));
assertThat(result).isEqualTo(expect);
}
private static Stream<Arguments> fomulaAndResult() {
return Stream.of(
arguments(1, "+", 2, 3),
arguments(1, "-", 2, -1),
arguments(1, "*", 2, 2),
arguments(1, "/", 1, 1)
);
}
@DisplayName("๋๋์
์์ 0์ ๋๋๋ ๊ฒฝ์ฐ IllegalArgument ์์ธ ๋ฐ์")
@Test
void calculateExceptionTest() {
assertThatCode(() -> Calculator.calculate(new PositiveNumber(10), "/",new PositiveNumber(0)))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("0๋๋ ์์๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค.");
}
}
AssertThatCode๋ฅผ ํตํด 0์ ๋๋๋ ๊ฒฝ์ฐ์ ์์ธ ๋ฐ์ ํ ์คํธ๋ฅผ ํ์์ง๋ง, ์ด๋ PositiveNumber ์ ์ฉ ์ ์ ํ ์คํธ ํ๊ธฐ ์ํ ์ฝ๋์์ผ๋ฉฐ ์์๋ง์ผ๋ก ์ฌ์น์ฐ์ฐ์ด ์ด๋ฃจ์ด์ ธ ์๋์ง๋ฅผ ํ์ธํ์์ผ๋ฉด ์ ํ ์คํธ๋ ์งํํ ํ์ ์๋ค.
'๐ต java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JAVA | ํ์ ๊ณ์ฐ๊ธฐ ์ค์ต - (2) (0) | 2023.09.06 |
---|---|
JAVA | ํ์ ๊ณ์ฐ๊ธฐ ์ค์ต - (1) (0) | 2023.09.04 |
JAVA | ์ฌ์น ์ฐ์ฐ ๊ณ์ฐ๊ธฐ ์ค์ต - (1) (0) | 2023.08.15 |
JAVA | STREAM์ด๋ ? (์ฌ์ฉ๋ฒ, ๋ฐฑ์ค ๋ฌธ์ ๊น์ง ๊ฐ์ด ํ์ด๋ณด๊ธฐ) (5) | 2023.08.10 |
JAVA | JPA Repository์ ์ฌ์ฉ๋ฒ๊ณผ ๋ฉ์๋ (0) | 2023.07.14 |
์๊ตฌ์ฌํญ
โข ๊ฐ๋จํ ์ฌ์น์ฐ์ฐ์ ํ ์ ์๋ค. โ๏ธ
โข ์์๋ก๋ง ๊ณ์ฐํ ์ ์๋ค. โ๏ธ
โข ๋๋์ ์์ 0์ ๋๋๋ ๊ฒฝ์ฐ IllegalArgument ์์ธ๋ฅผ ๋ฐ์์ํจ๋ค. โ๏ธ
โข MVCํจํด(Model-View-Controller) ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํํ๋ค. โ๏ธ
๐ enum์ ํ์ฉํ ์ฌ์น์ฐ์ฐ ๊ณ์ฐ๊ธฐ
ArithmeticOperator
public enum ArithmeticOperator {
ADDITION("+") {
@Override
public int arithmeticCalculate(PositiveNumber operand1, PositiveNumber operand2) {
return operand1.toint() + operand2.toint();
}
}, SUBSTRACTION("-") {
@Override
public int arithmeticCalculate(PositiveNumber operand1, PositiveNumber operand2) {
return operand1.toint() - operand2.toint();
}
}, MULTIPLICATION("*") {
@Override
public int arithmeticCalculate(PositiveNumber operand1, PositiveNumber operand2) {
return operand1.toint() * operand2.toint();
}
}, DIVISION("/") {
@Override
public int arithmeticCalculate(PositiveNumber operand1, PositiveNumber operand2) {
return operand1.toint() / operand2.toint();
}
};
private final String operator;
ArithmeticOperator(String operator) {
this.operator = operator;
}
public abstract int arithmeticCalculate(final PositiveNumber operand1, final PositiveNumber operand2);
public static int calculate(PositiveNumber operand1, String operator, PositiveNumber operand2) {
ArithmeticOperator arithmeticOperator = Arrays.stream(values())
.filter(v -> v.operator.equals(operator))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("์ฌ๋ฐ๋ฅธ ์ฌ์น์ฐ์ฐ์ด ์๋๋๋ค."));
return arithmeticOperator.arithmeticCalculate(operand1, operand2);
}
}
Calculator
public class Calculator {
public static int calculate(PositiveNumber operand1, String operator, PositiveNumber operand2) {
return ArithmeticOperator.calculate(operand1, operator, operand2);
}
}
๋จผ์ , ์ ๋ฒ ์๊ฐ์๋ Calculator ํด๋์ค ๋ด์์ ์ฌ์น์ฐ์ฐ์ ๊ตฌํํ์์ง๋ง ์ด๋ฒ์๋ enum์ ํตํด ์ฌ์น์ฐ์ฐ์ ๊ตฌํํ์๋ค. ์์ง enum์ ๋ง์ด ์ฌ์ฉํด๋ณธ์ ์ด ์์ด ๋ฏ์ค์๋ค. ์ฌ๊ธฐ์ stream์ ์ฌ์ฉํ๋๋ฐ stream์ ํ๋ฒ ๋ ๊ณต๋ถํด๋ณด์์ผ ํ ๋ฏ ํ๋ค.
Calculator ํด๋์ค์ calculate ๋ฉ์๋๋ ArithmeticOperator ๋ด์ calculate ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๊ฒฐ๊ณผ๊ฐ์ ์ ๋ฌํ๋ค.
๋ํ, ArithmeticOperator calculate๋ ๋ค์๊ณผ ๊ฐ์ ์ญํ ์ ์ํํ๋ค.
- values() ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ArithmeticOperator ์ด๊ฑฐํ์ ์ ์๋ ๋ชจ๋ ์ฐ์ฐ์๋ค์ ๊ฐ์ ธ์จ๋ค.
- ๊ฐ์ ธ์จ ์ฐ์ฐ์๋ค ์ค์์ ์ ๋ ฅ๋ operator์ ์ผ์นํ๋ ์ฐ์ฐ์๋ฅผ ์ฐพ๋๋ค.
- findFirst() ๋ฉ์๋๋ฅผ ํตํด ์ผ์นํ๋ ์ฒซ ๋ฒ์งธ ์ฐ์ฐ์๋ฅผ ๊ฐ์ ธ์จ๋ค. ๋ง์ฝ ์ผ์นํ๋ ์ฐ์ฐ์๊ฐ ์๋ค๋ฉด, orElseThrow() ๋ฉ์๋๋ฅผ ํตํด "์ฌ๋ฐ๋ฅธ ์ฌ์น์ฐ์ฐ์ด ์๋๋๋ค."๋ผ๋ ์์ธ๋ฅผ ๋์ง๋ค.
- ์ฐพ์ ์ฐ์ฐ์๋ฅผ ์ด์ฉํ์ฌ operand1๊ณผ operand2๋ฅผ ๊ฐ์ง๊ณ ํด๋น ์ฐ์ฐ์์ arithmeticCalculate ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ค์ ์ฌ์น์ฐ์ฐ์ ์ํํ๋ค.
์๊ตฌ์ฌํญ ์ค ๋๋ฒ์งธ, '์์๋ก๋ง ๊ณ์ฐํ ์ ์๋ค'๋ฅผ ์ถฉ์กฑํ๊ธฐ ์ํด PositiveNumber class๋ฅผ ๋ง๋ค๊ณ value๊ฐ์ด ์์์ผ ๋ IllegalArgumentException์ ๋์ง๋ค.
PositiveNumber
public class PositiveNumber {
private final int value;
public PositiveNumber(int value) {
validate(value);
this.value = value;
}
private void validate(int value) {
if(isNegativeNumber(value)) {
throw new IllegalArgumentException("0๋๋ ์์๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค.");
}
}
private boolean isNegativeNumber(int value) {
return value <=0;
}
public int toint() {
return value;
}
}
์ด์ ๊ฐ์ด ์ฒ๋ฆฌํ๋ฉด ๋๋์ ์์ 0์ผ๋ก ๋๋๋ ๊ฒฝ์ฐ ์ญ์ ์ ์ธ๋๋ค.
๋ง์ง๋ง์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด Test ํ ์ ์๋ค.
CalculatorTest
public class CalculatorTest {
// 1 + 2 ---> Calculator
// 3 ---<
@DisplayName("๋ง์
์ฐ์ฐ์ ์ํํ๋ค.")
@Test
void additionTest() {
int result = Calculator.calculate(new PositiveNumber(1), "+", new PositiveNumber(2));
assertThat(result).isEqualTo(3);
}
@DisplayName("๋บ์
์ฐ์ฐ์ ์ํํ๋ค")
@Test
void subtractionTest() {
int result = Calculator.calculate(new PositiveNumber(2), "-", new PositiveNumber(1));
assertThat(result).isEqualTo(1);
}
@DisplayName("์ฌ์น์ฐ์ฐ์ ์ํํ๋ค.")
@ParameterizedTest
@MethodSource("fomulaAndResult")
void calculatorTest(int operand1, String operator, int operand2, int expect) {
int result = Calculator.calculate(new PositiveNumber(operand1), operator, new PositiveNumber(operand2));
assertThat(result).isEqualTo(expect);
}
private static Stream<Arguments> fomulaAndResult() {
return Stream.of(
arguments(1, "+", 2, 3),
arguments(1, "-", 2, -1),
arguments(1, "*", 2, 2),
arguments(1, "/", 1, 1)
);
}
@DisplayName("๋๋์
์์ 0์ ๋๋๋ ๊ฒฝ์ฐ IllegalArgument ์์ธ ๋ฐ์")
@Test
void calculateExceptionTest() {
assertThatCode(() -> Calculator.calculate(new PositiveNumber(10), "/",new PositiveNumber(0)))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("0๋๋ ์์๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค.");
}
}
AssertThatCode๋ฅผ ํตํด 0์ ๋๋๋ ๊ฒฝ์ฐ์ ์์ธ ๋ฐ์ ํ ์คํธ๋ฅผ ํ์์ง๋ง, ์ด๋ PositiveNumber ์ ์ฉ ์ ์ ํ ์คํธ ํ๊ธฐ ์ํ ์ฝ๋์์ผ๋ฉฐ ์์๋ง์ผ๋ก ์ฌ์น์ฐ์ฐ์ด ์ด๋ฃจ์ด์ ธ ์๋์ง๋ฅผ ํ์ธํ์์ผ๋ฉด ์ ํ ์คํธ๋ ์งํํ ํ์ ์๋ค.
'๐ต java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JAVA | ํ์ ๊ณ์ฐ๊ธฐ ์ค์ต - (2) (0) | 2023.09.06 |
---|---|
JAVA | ํ์ ๊ณ์ฐ๊ธฐ ์ค์ต - (1) (0) | 2023.09.04 |
JAVA | ์ฌ์น ์ฐ์ฐ ๊ณ์ฐ๊ธฐ ์ค์ต - (1) (0) | 2023.08.15 |
JAVA | STREAM์ด๋ ? (์ฌ์ฉ๋ฒ, ๋ฐฑ์ค ๋ฌธ์ ๊น์ง ๊ฐ์ด ํ์ด๋ณด๊ธฐ) (5) | 2023.08.10 |
JAVA | JPA Repository์ ์ฌ์ฉ๋ฒ๊ณผ ๋ฉ์๋ (0) | 2023.07.14 |