diff --git a/ReadMe.md b/ReadMe.md index 9ff18ab..f856a18 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,13 +1,51 @@ # 차량에 따른 연료 주입 실습 + ## 기능 요구사항 + 우리 회사는 렌터카를 운영하고 있다. 현재 보유하고 있는 차량은 Sonata 2대, Avante 1대, K5 2대로 총 5대의 차량을 보유하고 있다. 우리 회사는 고객이 인터넷으로부터 예약할 때 여행할 목적지의 대략적인 이동거리를 입력 받는다. 이 이동거리를 활용해 차량 별로 필요한 연료를 주입한다. 차량 별로 주입해야 할 연료량을 확인할 수 있는 보고서를 생성해야 한다. ## 프로그래밍 요구사항 - 1단계 + 상속과 추상 메소드를 활용한다. 위 요구사항을 if/else 절을 쓰지 않고 구현해야 한다. ## 프로그래밍 요구사항 - 2단계 -인터페이스를 적용해 구현한다. \ No newline at end of file + +인터페이스를 적용해 구현한다. + +# 좌표계산기(선 길이) + +## 기능 요구사항 + +사용자가 점에 대한 좌표 정보를 입력하는 메뉴를 구성한다. +좌표 정보는 괄호"(", ")"로 둘러쌓여 있으며 쉼표(,)로 x값과 y값을 구분한다. +X, Y좌표 모두 최대 24까지만 입력할 수 있다. +입력 범위를 초과할 경우 에러 문구를 출력하고 다시 입력을 받는다. +정상적인 좌표값을 입력한 경우, 해당 좌표에 특수문자를 표시한다. +좌표값을 두 개 입력한 경우, 두 점을 있는 직선으로 가정한다. 좌표값과 좌표값 사이는 '-' 문자로 구분한다. +직선인 경우는 두 점 사이 거리를 계산해서 출력한다. + +## 도메인 +- Points +- Point +- Polygon (추상 클래스) + - Straight + - Triangle + - Square +- Calculatable (인터페이스) + - StraightCalculation + - TriangleCalculation + - SquareCalculation +- PolygonFactory +- CalculationFactory +- CoordinatePrinter + +1. 사용자의 입력을 받아서 Points를 만든다 +2. CalculationFactory한테 Points를 던져서 구체적인 Calculation을 받는다 +3. PolygonFactory한테 Points를 던져서 구체적인 Polygon Type을 받는다 +4. Polygon 2에서 받은 계산 전략을 주입한다. +5. Polygon.calculate() 라는 abstract method를 실행해서 값을 구한다. +6. CoordinatePrinter에 Polygon을 보내서 그린다. \ No newline at end of file diff --git a/src/main/java/com/dongko/coordiate/domain/Point.java b/src/main/java/com/dongko/coordiate/domain/Point.java new file mode 100644 index 0000000..9d93b2c --- /dev/null +++ b/src/main/java/com/dongko/coordiate/domain/Point.java @@ -0,0 +1,33 @@ +package com.dongko.coordiate.domain; + +import com.dongko.coordiate.domain.exception.IllegalPointException; + +import java.util.Objects; + +public class Point { + private final int x; + private final int y; + public Point(int x, int y) { + if (x < 0 || x > 24) { + throw new IllegalPointException(); + } + if (y < 0 || y > 24) { + throw new IllegalPointException(); + } + this.x = x; + this.y = y; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Point point = (Point) o; + return x == point.x && y == point.y; + } + + @Override + public int hashCode() { + return Objects.hash(x, y); + } +} diff --git a/src/main/java/com/dongko/coordiate/domain/Points.java b/src/main/java/com/dongko/coordiate/domain/Points.java new file mode 100644 index 0000000..5c8b868 --- /dev/null +++ b/src/main/java/com/dongko/coordiate/domain/Points.java @@ -0,0 +1,40 @@ +package com.dongko.coordiate.domain; + +import com.dongko.coordiate.domain.exception.IllegalPointsException; + +import java.util.List; +import java.util.Objects; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class Points { + private static String regex = "\\((\\d+),(\\d+)\\)-\\((\\d+),(\\d+)\\)"; + + private final List points; + public Points(String pointsString) { + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(pointsString); + if (!matcher.matches()) { + throw new IllegalPointsException(); + } + int x1 = Integer.parseInt(matcher.group(1)); + int y1 = Integer.parseInt(matcher.group(2)); + int x2 = Integer.parseInt(matcher.group(3)); + int y2 = Integer.parseInt(matcher.group(4)); + + points = List.of(new Point(x1, y1), new Point(x2, y2)); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Points points1 = (Points) o; + return Objects.equals(points, points1.points); + } + + @Override + public int hashCode() { + return Objects.hash(points); + } +} diff --git a/src/main/java/com/dongko/coordiate/domain/exception/CoordinateCalculatorDomainException.java b/src/main/java/com/dongko/coordiate/domain/exception/CoordinateCalculatorDomainException.java new file mode 100644 index 0000000..5bd0ba9 --- /dev/null +++ b/src/main/java/com/dongko/coordiate/domain/exception/CoordinateCalculatorDomainException.java @@ -0,0 +1,8 @@ +package com.dongko.coordiate.domain.exception; + +public class CoordinateCalculatorDomainException extends RuntimeException{ + + public CoordinateCalculatorDomainException(String message) { + super(message); + } +} diff --git a/src/main/java/com/dongko/coordiate/domain/exception/IllegalPointException.java b/src/main/java/com/dongko/coordiate/domain/exception/IllegalPointException.java new file mode 100644 index 0000000..b3aea73 --- /dev/null +++ b/src/main/java/com/dongko/coordiate/domain/exception/IllegalPointException.java @@ -0,0 +1,8 @@ +package com.dongko.coordiate.domain.exception; + +public class IllegalPointException extends CoordinateCalculatorDomainException{ + + public IllegalPointException() { + super("좌표는 0 - 24 사이의 값만 가능합니다."); + } +} diff --git a/src/main/java/com/dongko/coordiate/domain/exception/IllegalPointsException.java b/src/main/java/com/dongko/coordiate/domain/exception/IllegalPointsException.java new file mode 100644 index 0000000..d7fc42d --- /dev/null +++ b/src/main/java/com/dongko/coordiate/domain/exception/IllegalPointsException.java @@ -0,0 +1,7 @@ +package com.dongko.coordiate.domain.exception; + +public class IllegalPointsException extends CoordinateCalculatorDomainException{ + public IllegalPointsException() { + super("잘못된 좌표 값 입니다."); + } +} diff --git a/src/test/java/com/dongko/coordiate/domain/PointTest.java b/src/test/java/com/dongko/coordiate/domain/PointTest.java new file mode 100644 index 0000000..2ce8054 --- /dev/null +++ b/src/test/java/com/dongko/coordiate/domain/PointTest.java @@ -0,0 +1,29 @@ +package com.dongko.coordiate.domain; + +import com.dongko.coordiate.domain.Point; +import com.dongko.coordiate.domain.exception.IllegalPointException; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.junit.jupiter.api.Assertions.*; + +class PointTest { + + @ParameterizedTest + @CsvSource({"25,2", "-1,24", "100,1000", "-100,-10", "24,-2"}) + @DisplayName("좌표값은 음수나 24초과 할 수 없다.") + void test(String xString, String yString) { + int x = Integer.parseInt(xString); + int y = Integer.parseInt(yString); + assertThrows(IllegalPointException.class, () -> + new Point(x, y) + ); + } + + @Test + void 객체비교테스트() { + assertEquals(new Point(1,2), new Point(1,2)); + } +} \ No newline at end of file diff --git a/src/test/java/com/dongko/coordiate/domain/PointsTest.java b/src/test/java/com/dongko/coordiate/domain/PointsTest.java new file mode 100644 index 0000000..8ca33f2 --- /dev/null +++ b/src/test/java/com/dongko/coordiate/domain/PointsTest.java @@ -0,0 +1,31 @@ +package com.dongko.coordiate.domain; + +import com.dongko.coordiate.domain.exception.IllegalPointsException; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.junit.jupiter.api.Assertions.*; + +class PointsTest { + + @ParameterizedTest + @CsvSource({"ashjkd", "(10,10,123)-(14,15)", "(10,10)-(14,151,123)", "12379612679"}) + @DisplayName("(x1,y1)-(x2,y2) 형식의 입력 값만 받을 수 있다.") + void test(String pointsString) { + assertThrows(IllegalPointsException.class, () -> + new Points(pointsString) + ); + } + + @Test + void 객체비교테스트() { + assertEquals(new Points("(10,10)-(14,15)"), new Points("(10,10)-(14,15)")); + } + + @Test + void 객체비교테스트2() { + assertNotEquals(new Points("(10,10)-(14,15)"), new Points("(10,9)-(14,15)")); + } +} \ No newline at end of file