diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..97626ba
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 3cae2d7..8431fdd 100644
--- a/build.gradle
+++ b/build.gradle
@@ -10,6 +10,7 @@ repositories {
}
dependencies {
+ testImplementation 'org.assertj:assertj-core:3.11.1'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
}
diff --git a/markdown_practice.md b/markdown_practice.md
new file mode 100644
index 0000000..bfc9c65
--- /dev/null
+++ b/markdown_practice.md
@@ -0,0 +1,60 @@
+
+# Heading 1
+___
+## Heading 2
+### Heading 3
+#### Heading 4
+##### Heading 5
+###### Heading 6
+Paragraph
+
+
+This is the **bold** text and this is the *italic* text and let's
+do ~~strikethrough~~.
+
+
+>Don't forget to code your dream.
+
+
+Fruits
+* Apple
+* Banana
+
+Players
+- kane
+- son
+
+
+Numbers
+1. first
+2. second
+3. third
+
+
+CLick [wapago's github](https://github.com/wapago)
+
+
+
+
+
+
+| Header | Description |
+|-------:|-------------:|
+| cell1 | cell2 |
+|cell3|cell4|
+
+
+To print message in the console, use
+`console.log('your message')` and ...
+```java
+public class Example {
+ public static void main(String[] args) {
+ console.log('your messages');
+ }
+}
+```
+
+
+
+
+
diff --git a/src/Readme.md b/src/Readme.md
new file mode 100644
index 0000000..2201849
--- /dev/null
+++ b/src/Readme.md
@@ -0,0 +1,59 @@
+# *좌표계산기(선 길이)*
+___
+### 기능 요구사항
+- 사용자가 점에 대한 좌표 정보를 입력하는 메뉴를 구성한다.
+- 좌표정보는 괄호(",")로 둘러쌓여 있으며 쉼표(,)로 x값과 y값을 구분한다.
+- x , y 좌표 모두 최대 24까지만 입력할 수 있다.
+- 입력 범위를 초과할 경우 에러 문구를 출력하고 다시 입력을 받는다.
+- 정상적인 좌표값을 입력한 경우, 해당 좌표에 특수문자를 표시한다.
+- 좌표값을 두 개 입력한 경우, 두 점을 잇는 직선으로 가정한다. 좌표값과 좌표값 사이는 '-' 문자로 구분한다.
+- 직선인 경우는 두 점 사이 거리를 계산해서 출력한다.
+
+### 실행결과
+```java
+좌표를 입력하세요.
+(10,10)-(14,15)
+```
+
+### 힌트
+- 두 점 사이 거리는 제곱근((A.x - B.x)^제곱 + (A.y - B.y)^제곱)공식으로 계산할 수 있다.
+- 제곱근을 구하는 수학 함수는 Math.sqrt()를 활용한다.
+- 테스트 코드의 경우 double일 때 근사치를 테스트하는 경우가 많다.
+### 테스트 assert 힌트
+- junit은 `assertEquals(1.414, line.length(), 0.001);` 과 같이 세번째 인자에 정밀도를 지정할 수 있다.
+- assertj는 `assertThat(line.length()).isEqualTo(1.414, offset(o.00099));` 과 같이 offset 메소드르 정밀도를 지정할 수 있다.
+
+# *좌표계산기(사각형 면적)*
+___
+### 기능 요구사항
+- 좌표값을 두 개 입력한 경우, 두 점을 잇는 직선으로 가정한다. 좌표값과 좌표값 사이는 '-'문자로 구분한다.
+- 좌표값을 네 개 입력한 경우, 네 점을 연결하는 사각형으로 가정한다.
+- 네 점이 뒤틀어진 사다리꼴이나 마름모는 제외하고 직사각형만 허용하도록 검사한다.
+- 사각형인 경우 사각형의 넓이를 계산해서 출력한다.
+
+### 실행결과
+```java
+좌표를 입력하세요.
+(10,10)-(22,10)-(22,18)-(10,18)
+```
+
+### 힌트
+- 사각형 면적은 width * height 방식으로 계산할 수 있다.
+- Point라는 객체를 추가해 x,y좌표를 관리하도록 한다.
+
+
+# *좌표계산기(삼각형 면적)*
+___
+### 기능 요구사항
+- 좌표값을 두 개 입력한 경우, 두 점을 잇는 직선으로 가정한다. 좌표값과 좌표값 사이는 '-'문자로 구분한다.
+- 좌표값을 세 개 입력한 경우, 세 점을 연결하는 삼각형으로 가정한다.
+- 삼각형인 경우 삼각형의 넓이를 계산해서 출력한다.
+
+### 실행결과
+```java
+좌표를 입력하세요.
+(10,10)-(14,15)-(20,8)
+```
+
+### 힌트
+- 세 변의 길이를 알 때 삼각형의 넓이를 구하는 공식은 헤론의 공식을 이용해 구할 수 있다.
\ No newline at end of file
diff --git a/src/main/java/Main.java b/src/main/java/Main.java
new file mode 100644
index 0000000..45746fd
--- /dev/null
+++ b/src/main/java/Main.java
@@ -0,0 +1,7 @@
+import coordinate.CoordinateCalculator;
+
+public class Main {
+ public static void main(String[] args) {
+ new CoordinateCalculator().start();
+ }
+}
diff --git a/src/main/java/coffee/CaffeineBeverage.java b/src/main/java/coffee/CaffeineBeverage.java
new file mode 100644
index 0000000..5be6867
--- /dev/null
+++ b/src/main/java/coffee/CaffeineBeverage.java
@@ -0,0 +1,21 @@
+package coffee;
+
+public abstract class CaffeineBeverage {
+ abstract void brew();
+ abstract void addCondiments();
+
+ void prepareRecipe() {
+ boilWater();
+ brew();
+ pourInCup();
+ addCondiments();
+ }
+
+ public void boilWater() {
+ System.out.println("물을 끓인다.");
+ }
+
+ public void pourInCup() {
+ System.out.println("컵에 붓는다.");
+ }
+}
diff --git a/src/main/java/coffee/Coffee.java b/src/main/java/coffee/Coffee.java
new file mode 100644
index 0000000..3b1ee3a
--- /dev/null
+++ b/src/main/java/coffee/Coffee.java
@@ -0,0 +1,14 @@
+package coffee;
+
+public class Coffee extends CaffeineBeverage {
+
+ @Override
+ void brew() {
+ System.out.println("필터를 활용해 커피를 내린다.");
+ }
+
+ @Override
+ void addCondiments() {
+ System.out.println("설탕과 우유를 추가한다.");
+ }
+}
diff --git a/src/main/java/coffee/Tea.java b/src/main/java/coffee/Tea.java
new file mode 100644
index 0000000..d4f88dd
--- /dev/null
+++ b/src/main/java/coffee/Tea.java
@@ -0,0 +1,14 @@
+package coffee;
+
+public class Tea extends CaffeineBeverage{
+
+ @Override
+ void brew() {
+ System.out.println("티백을 담근다.");
+ }
+
+ @Override
+ void addCondiments() {
+ System.out.println("레몬을 추가한다.");
+ }
+}
diff --git a/src/main/java/coordinate/CoordinateCalculator.java b/src/main/java/coordinate/CoordinateCalculator.java
new file mode 100644
index 0000000..5b6ca46
--- /dev/null
+++ b/src/main/java/coordinate/CoordinateCalculator.java
@@ -0,0 +1,28 @@
+package coordinate;
+
+import coordinate.calculatorview.InputView;
+//import coordinate.factory.CalculationFactory;
+import coordinate.factory.CalculationFactory;
+import coordinate.factory.PolygonFactory;
+import coordinate.shape.Polygon;
+
+public class CoordinateCalculator {
+ private Points points;
+
+ public void start() {
+ init();
+ Polygon polygon = PolygonFactory.getPolygonType(this.points);
+ double result = CalculationFactory.calculate(polygon);
+
+ System.out.println("result = " + result);
+ }
+
+ public void init() {
+ InputView.askPoints();
+ initPoints(InputView.getPoints());
+ }
+
+ public void initPoints(String points) {
+ this.points = new Points(points);
+ }
+}
diff --git a/src/main/java/coordinate/Point.java b/src/main/java/coordinate/Point.java
new file mode 100644
index 0000000..ed8d303
--- /dev/null
+++ b/src/main/java/coordinate/Point.java
@@ -0,0 +1,52 @@
+package coordinate;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Point {
+
+ private final List strPointList = new ArrayList<>();
+ private final int[] pointArray = new int[2];
+
+ private final List pointList = new ArrayList<>();
+
+ private int x;
+ private int y;
+
+ public Point(String points) {
+ pointsToList(points);
+ parseStrPointList(this.strPointList);
+ setPoint(pointList);
+ }
+
+ public void pointsToList(String points) {
+ strPointList.add(points.split(","));
+ }
+
+ public void parseStrPointList(List strPointList) {
+ for (String[] point : strPointList) {
+ pointArray[0] = Integer.parseInt(point[0]);
+ pointArray[1] = Integer.parseInt(point[1]);
+
+ pointList.add(pointArray);
+ }
+ }
+
+ public void setPoint(List pointList) {
+ for (int[] point : pointList) {
+ this.x = point[0];
+ this.y = point[1];
+ }
+ }
+
+ public int getX() {
+ return x;
+ }
+
+ public int getY() {
+ return y;
+ }
+
+
+
+}
diff --git a/src/main/java/coordinate/Points.java b/src/main/java/coordinate/Points.java
new file mode 100644
index 0000000..c73d226
--- /dev/null
+++ b/src/main/java/coordinate/Points.java
@@ -0,0 +1,47 @@
+package coordinate;
+
+import java.util.*;
+
+public class Points {
+
+ private final List points;
+ private final int length;
+
+ public Points(String points) {
+ String[] splitPoints = splitPointsInput(points);
+
+ this.length = splitPoints.length;
+ this.points = makePoints(splitPoints);
+ }
+
+ public List getPoints() {
+ return points;
+ }
+
+ public int getLength() {
+ return length;
+ }
+
+ public String[] splitPointsInput(String points) {
+ points = points.replace("(","").replace(")","");
+
+ return points.split("-");
+ }
+
+ public List makePoints(String[] splitPoints) {
+ return Arrays.stream(splitPoints).map(Point::new).toList();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Points points1 = (Points) o;
+ return length == points1.length && Objects.equals(points, points1.points);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(points, length);
+ }
+}
diff --git a/src/main/java/coordinate/calculatorview/InputView.java b/src/main/java/coordinate/calculatorview/InputView.java
new file mode 100644
index 0000000..aaeebc4
--- /dev/null
+++ b/src/main/java/coordinate/calculatorview/InputView.java
@@ -0,0 +1,30 @@
+package coordinate.calculatorview;
+
+import java.util.Scanner;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class InputView {
+ private static final Scanner SCANNER = new Scanner(System.in);
+ private static final String NATURAL_NUMBER = "[0-9][0-9]*";
+ private static final String POINT = "\\((" + NATURAL_NUMBER + "," + NATURAL_NUMBER + ")\\)";
+ private static final Pattern POINTS_PATTERN = Pattern.compile(POINT + "(?:-" + POINT + "){1,3}");
+
+ public static void askPoints() {
+ System.out.println("좌표를 입력하세요");
+ }
+
+ public static String getPoints() {
+ try {
+ String input = SCANNER.nextLine();
+ Matcher matcher = POINTS_PATTERN.matcher(input);
+ if (!matcher.find()) {
+ throw new IllegalArgumentException("좌표 입력 형식이 맞지 않습니다.");
+ }
+
+ return input;
+ } catch(IllegalArgumentException e) {
+ throw new IllegalArgumentException(e.getMessage());
+ }
+ }
+}
diff --git a/src/main/java/coordinate/domain/Calculatable.java b/src/main/java/coordinate/domain/Calculatable.java
new file mode 100644
index 0000000..b6bf6a0
--- /dev/null
+++ b/src/main/java/coordinate/domain/Calculatable.java
@@ -0,0 +1,8 @@
+package coordinate.domain;
+
+
+public interface Calculatable {
+ double calculateArea();
+
+ String getPolygonName();
+}
diff --git a/src/main/java/coordinate/factory/CalculationFactory.java b/src/main/java/coordinate/factory/CalculationFactory.java
new file mode 100644
index 0000000..9a04b53
--- /dev/null
+++ b/src/main/java/coordinate/factory/CalculationFactory.java
@@ -0,0 +1,32 @@
+package coordinate.factory;
+
+import coordinate.Point;
+import coordinate.Points;
+import coordinate.shape.Polygon;
+import coordinate.shape.Straight;
+
+public class CalculationFactory {
+
+ public static double calculate(Polygon polygon) {
+ String name = polygon.getPolygonName();
+
+ if (name.equals("STRAIGHT")) {
+ Points points = polygon.getPoints();
+
+ Point point1 = points.getPoints().get(0);
+ Point point2 = points.getPoints().get(1);
+
+ return Straight.calculateDistance(point1, point2);
+ }
+
+ if (name.equals("TRIANGLE")) {
+ return polygon.calculateArea();
+ }
+
+ if (name.equals("SQUARE")) {
+ return polygon.calculateArea();
+ }
+
+ return 0;
+ }
+}
diff --git a/src/main/java/coordinate/factory/PolygonFactory.java b/src/main/java/coordinate/factory/PolygonFactory.java
new file mode 100644
index 0000000..210770c
--- /dev/null
+++ b/src/main/java/coordinate/factory/PolygonFactory.java
@@ -0,0 +1,34 @@
+package coordinate.factory;
+
+import coordinate.Points;
+import coordinate.shape.Polygon;
+import coordinate.shape.Square;
+import coordinate.shape.Straight;
+import coordinate.shape.Triangle;
+
+public class PolygonFactory {
+
+ public static Polygon getPolygonType(Points points) {
+ int length = points.getLength();
+
+ if (length == 2) {
+ Polygon straight = new Straight(points);
+
+ return straight;
+ }
+
+ if (length == 3) {
+ Triangle triangle = new Triangle(points);
+
+ return triangle;
+ }
+
+ if (length == 4) {
+ Square square = new Square(points);
+
+ return square;
+ }
+
+ throw new IllegalArgumentException();
+ }
+}
diff --git a/src/main/java/coordinate/shape/Polygon.java b/src/main/java/coordinate/shape/Polygon.java
new file mode 100644
index 0000000..6b99029
--- /dev/null
+++ b/src/main/java/coordinate/shape/Polygon.java
@@ -0,0 +1,38 @@
+package coordinate.shape;
+
+import coordinate.Points;
+import coordinate.domain.Calculatable;
+
+public abstract class Polygon implements Calculatable {
+ protected final Points points;
+ protected final String polygonName;
+
+ public Polygon(Points points, int pointNumber, String polygonName) {
+ if (points.getLength() != pointNumber)
+ errorMessage();
+
+ this.points = points;
+ this.polygonName = polygonName;
+
+ }
+
+ abstract void errorMessage();
+
+ public Points getPoints() {
+ return points;
+ }
+
+ @Override
+ public double calculateArea() {
+ if (points.getLength() >= 3){
+ return calculateArea();
+ }
+
+ return 0;
+ }
+
+ @Override
+ public String getPolygonName() {
+ return this.polygonName;
+ }
+}
diff --git a/src/main/java/coordinate/shape/Square.java b/src/main/java/coordinate/shape/Square.java
new file mode 100644
index 0000000..0718685
--- /dev/null
+++ b/src/main/java/coordinate/shape/Square.java
@@ -0,0 +1,51 @@
+package coordinate.shape;
+
+import coordinate.Points;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public class Square extends Polygon {
+
+ private static final String POLYGON_NAME = "SQUARE";
+ private static final int POINT_NUMBER = 4;
+ protected final Points points;
+
+ public Square(Points points) {
+ super(points, POINT_NUMBER, POLYGON_NAME);
+ this.points = points;
+ }
+
+ @Override
+ public double calculateArea() {
+ Set xPoints = new HashSet();
+ Set yPoints = new HashSet();
+
+ int result = 0;
+
+ for (int i = 0; i < POINT_NUMBER; i++) {
+ xPoints.add(this.points.getPoints().get(i).getX());
+ yPoints.add(this.points.getPoints().get(i).getY());
+ }
+
+ if (xPoints.size() == 2 && yPoints.size() == 2) {
+ Integer[] vertical = new Integer[2];
+ Integer[] horizonal = new Integer[2];
+
+ vertical[0] = (Integer)xPoints.stream().sorted().toArray()[0];
+ vertical[1] = (Integer)xPoints.stream().sorted().toArray()[1];
+
+ horizonal[0] = (Integer)yPoints.stream().sorted().toArray()[0];
+ horizonal[1] = (Integer)yPoints.stream().sorted().toArray()[1];
+
+ result = (horizonal[1] - horizonal[0]) * (vertical[1] - vertical[0]);
+ }
+
+ return (double) result;
+ }
+
+ @Override
+ void errorMessage() {
+ throw new IllegalArgumentException("사각형은 최소 4개의 점이 필요합니다.");
+ }
+}
diff --git a/src/main/java/coordinate/shape/Straight.java b/src/main/java/coordinate/shape/Straight.java
new file mode 100644
index 0000000..b1c875a
--- /dev/null
+++ b/src/main/java/coordinate/shape/Straight.java
@@ -0,0 +1,32 @@
+package coordinate.shape;
+
+import coordinate.Point;
+import coordinate.Points;
+
+public class Straight extends Polygon {
+
+ protected static final String POLYGON_NAME = "STRAIGHT";
+ protected static final int POINT_NUMBER = 2;
+ protected final Points points;
+
+ public Straight(Points points) {
+ super(points, POINT_NUMBER, POLYGON_NAME);
+ this.points = points;
+ }
+
+ public static double calculateDistance(Point point1, Point point2) {
+ int x1 = point1.getX();
+ int y1 = point1.getY();
+
+ int x2 = point2.getX();
+ int y2 = point2.getY();
+
+
+ return Math.sqrt(Math.pow((x1 - x2), 2) + Math.pow((y1 - y2), 2));
+ }
+
+ @Override
+ void errorMessage() {
+ throw new IllegalArgumentException("선은 최소 2개의 점이 필요함.");
+ }
+}
diff --git a/src/main/java/coordinate/shape/Triangle.java b/src/main/java/coordinate/shape/Triangle.java
new file mode 100644
index 0000000..5894ae3
--- /dev/null
+++ b/src/main/java/coordinate/shape/Triangle.java
@@ -0,0 +1,51 @@
+package coordinate.shape;
+
+import coordinate.Point;
+import coordinate.Points;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class Triangle extends Polygon {
+
+ private static final String POLYGON_NAME = "TRIANGLE";
+ private static final int POINT_NUMBER = 3;
+ protected final Points points;
+
+ public Triangle(Points points) {
+ super(points, POINT_NUMBER, POLYGON_NAME);
+ this.points = points;
+ }
+
+ @Override
+ public double calculateArea() {
+ List distances = getDistances();
+
+ double a = distances.get(0);
+ double b = distances.get(1);
+ double c = distances.get(2);
+
+ double s = (a + b + c) / 2;
+
+ return Math.sqrt(s * (s - a) * (s - b) * (s - c));
+ }
+
+ private List getDistances() {
+ List vertexes = points.getPoints();
+ Point point1 = vertexes.get(0);
+ Point point2 = vertexes.get(1);
+ Point point3 = vertexes.get(2);
+
+ double distance1 = Straight.calculateDistance(point1, point2);
+ double distance2 = Straight.calculateDistance(point2, point3);
+ double distance3 = Straight.calculateDistance(point1, point3);
+
+ return Arrays.asList(distance1, distance2, distance3);
+ }
+
+
+ @Override
+ void errorMessage() {
+ throw new IllegalArgumentException("삼각형은 최소 3개의 점이 필요합니다.");
+ }
+}