diff --git a/src/main/java/CoordinateApplication.java b/src/main/java/CoordinateApplication.java new file mode 100644 index 00000000..48e12320 --- /dev/null +++ b/src/main/java/CoordinateApplication.java @@ -0,0 +1,17 @@ +import coordinate.Figure; +import coordinate.FigureFactory; +import coordinate.Points; +import view.InputView; +import view.OutputView; + +public class CoordinateApplication { + private final static InputView inputView = new InputView(); + private final static OutputView outputView = new OutputView(); + private final static FigureFactory figureFactory = new FigureFactory(); + + public static void main(String[] args) { + Points points = inputView.inputPoint(); + Figure figure = figureFactory.getInstance(points); + outputView.output(figure); + } +} diff --git a/src/main/java/coordinate/AbstractFigure.java b/src/main/java/coordinate/AbstractFigure.java new file mode 100644 index 00000000..53ecca36 --- /dev/null +++ b/src/main/java/coordinate/AbstractFigure.java @@ -0,0 +1,17 @@ +package coordinate; + +public abstract class AbstractFigure implements Figure { + private final Points points; + + protected final Point getPoint(int idx){ + return points.get(idx); + } + + public AbstractFigure(Points points) { + if (points.size() != size()) { + throw new IllegalArgumentException(getName() + "의 길이는 " + size() + "이어야 합니다."); + } + + this.points = points; + } +} diff --git a/src/main/java/coordinate/Figure.java b/src/main/java/coordinate/Figure.java new file mode 100644 index 00000000..64b9e158 --- /dev/null +++ b/src/main/java/coordinate/Figure.java @@ -0,0 +1,11 @@ +package coordinate; + +public interface Figure{ + int size(); + + String getName(); + + double area(); + + String output(); +} diff --git a/src/main/java/coordinate/FigureCreator.java b/src/main/java/coordinate/FigureCreator.java new file mode 100644 index 00000000..b641c66d --- /dev/null +++ b/src/main/java/coordinate/FigureCreator.java @@ -0,0 +1,5 @@ +package coordinate; + +public interface FigureCreator { + Figure create(Points points); +} diff --git a/src/main/java/coordinate/FigureFactory.java b/src/main/java/coordinate/FigureFactory.java new file mode 100644 index 00000000..dd114bc0 --- /dev/null +++ b/src/main/java/coordinate/FigureFactory.java @@ -0,0 +1,24 @@ +package coordinate; + +import java.util.HashMap; +import java.util.Map; + +public class FigureFactory { + public static final Map FIGURE_MAP = new HashMap<>(); + + static{ + FIGURE_MAP.put(Line.LINE_POINT_SIZE, Line::new); + FIGURE_MAP.put(Triangle.TRIANGLE_POINT_SIZE, Triangle::new); + FIGURE_MAP.put(Rectangle.RECTANGLE_POINT_SIZE, Rectangle::new); + } + + public Figure getInstance(Points points) { + Figure figure; + try{ + figure = FIGURE_MAP.get(points.size()).create(points); + } catch (NullPointerException e){ + throw new IllegalArgumentException("점의 개수는 2~4개여야 합니다."); + } + return figure; + } +} diff --git a/src/main/java/coordinate/Line.java b/src/main/java/coordinate/Line.java new file mode 100644 index 00000000..0b416a1f --- /dev/null +++ b/src/main/java/coordinate/Line.java @@ -0,0 +1,29 @@ +package coordinate; + +public class Line extends AbstractFigure{ + public static final int LINE_POINT_SIZE = 2; + + public Line(Points points) { + super(points); + } + + @Override + public int size() { + return LINE_POINT_SIZE; + } + + @Override + public String getName() { + return "선"; + } + + @Override + public double area() { + return getPoint(0).getDistance(getPoint(1)); + } + + @Override + public String output(){ + return String.format("두 점 사이의 거리는 %f", area()); + } +} diff --git a/src/main/java/coordinate/Point.java b/src/main/java/coordinate/Point.java new file mode 100644 index 00000000..1e28269c --- /dev/null +++ b/src/main/java/coordinate/Point.java @@ -0,0 +1,69 @@ +package coordinate; + +import java.util.Objects; + +public class Point { + private final int x; + private final int y; + + private Point(int x, int y) { + if (x < 0 || x > 24) { + throw new IllegalArgumentException(); + } + if (y < 0 || y > 24) { + throw new IllegalArgumentException(); + } + + this.x = x; + this.y = y; + } + + public double getDistance(Point other) { + int xDifference = other.minusX(x); + int yDifference = other.minusY(y); + return Math.sqrt(square(xDifference) + square(yDifference)); + } + + private int minusX(int number) { + return this.x - number; + } + + private int minusY(int number) { + return this.y - number; + } + + private static int square(int number) { + return number * number; + } + + public static Point of(int x, int y) { + return new Point(x, y); + } + + public static Point ofCommaSeparator(String text) { + String[] values = text.split(","); + return new Point(Integer.parseInt(values[0]), Integer.parseInt(values[1])); + } + + @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); + } + + @Override + public String toString() { + return "Point{" + + "x=" + x + + ", y=" + y + + '}'; + } +} diff --git a/src/main/java/coordinate/Points.java b/src/main/java/coordinate/Points.java new file mode 100644 index 00000000..df04d8c9 --- /dev/null +++ b/src/main/java/coordinate/Points.java @@ -0,0 +1,20 @@ +package coordinate; + +import java.util.ArrayList; +import java.util.List; + +public class Points { + private static final List points = new ArrayList<>(); + + public void addPoint(Point point) { + points.add(point); + } + + public Point get(int index) { + return points.get(index); + } + + public int size(){ + return points.size(); + } +} diff --git a/src/main/java/coordinate/Rectangle.java b/src/main/java/coordinate/Rectangle.java new file mode 100644 index 00000000..b385f611 --- /dev/null +++ b/src/main/java/coordinate/Rectangle.java @@ -0,0 +1,29 @@ +package coordinate; + +public class Rectangle extends AbstractFigure { + public static final int RECTANGLE_POINT_SIZE = 4; + + public Rectangle(Points points) { + super(points); + } + + @Override + public int size() { + return RECTANGLE_POINT_SIZE; + } + + @Override + public String getName() { + return "사각형"; + } + + @Override + public double area() { + return 0; + } + + @Override + public String output() { + return String.format("사각형 넓이는 %f", area()); + } +} diff --git a/src/main/java/coordinate/Triangle.java b/src/main/java/coordinate/Triangle.java new file mode 100644 index 00000000..673e1759 --- /dev/null +++ b/src/main/java/coordinate/Triangle.java @@ -0,0 +1,41 @@ +package coordinate; + +import java.util.ArrayList; +import java.util.List; + +public class Triangle extends AbstractFigure { + public static final int TRIANGLE_POINT_SIZE = 3; + + public Triangle(Points points) { + super(points); + } + + @Override + public int size() { + return TRIANGLE_POINT_SIZE; + } + + @Override + public String getName() { + return "삼각형"; + } + + @Override + public double area() { + List distances = new ArrayList<>(); + distances.add(getPoint(0).getDistance(getPoint(1))); + distances.add(getPoint(1).getDistance(getPoint(2))); + distances.add(getPoint(2).getDistance(getPoint(0))); + + Double s = distances.stream().mapToDouble(i->i).reduce(Double::sum).getAsDouble() / 2; + + Double result = distances.stream().reduce(s, (a, b) -> a*(s-b)); + + return Math.sqrt(result); + } + + @Override + public String output() { + return String.format("삼각형 넓이는 %f", area()); + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 00000000..53d4d3b1 --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,33 @@ +package view; + +import coordinate.Point; +import coordinate.Points; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; +import java.util.stream.Collectors; + +public class InputView { + private final static Scanner scanner = new Scanner(System.in); + + public Points inputPoint(){ + System.out.println("좌표를 입력하세요."); + String s = scanner.next(); + + Points points = new Points(); + String[] strings = s.split("-"); + for(String str: strings){ + List numbers = new ArrayList<>(); + List nums = Arrays.stream(str.split("\\(|,|\\)")).filter(t -> !t.isEmpty()).collect(Collectors.toList()); + for(String n: nums){ + numbers.add(Integer.valueOf(n)); + } + + Point point = Point.of(numbers.get(0), numbers.get(1)); + points.addPoint(point); + } + return points; + } +} diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java new file mode 100644 index 00000000..9189e537 --- /dev/null +++ b/src/main/java/view/OutputView.java @@ -0,0 +1,9 @@ +package view; + +import coordinate.Figure; + +public class OutputView { + public void output(Figure figure) { + System.out.println(figure.output()); + } +}