From d195c95c7a134c13cb6196728b210f6b5839f816 Mon Sep 17 00:00:00 2001 From: oliviarla Date: Mon, 1 Aug 2022 21:58:50 +0900 Subject: [PATCH 1/2] feat: implements coordinate calculator except rectangle --- src/main/java/CoordinateApplication.java | 16 +++++ src/main/java/coordinate/AbstractFigure.java | 22 +++++++ src/main/java/coordinate/Figure.java | 13 ++++ src/main/java/coordinate/FigureCreator.java | 5 ++ src/main/java/coordinate/FigureFactory.java | 24 +++++++ src/main/java/coordinate/Line.java | 29 ++++++++ src/main/java/coordinate/Point.java | 69 ++++++++++++++++++++ src/main/java/coordinate/Points.java | 24 +++++++ src/main/java/coordinate/Rectangle.java | 29 ++++++++ src/main/java/coordinate/Triangle.java | 42 ++++++++++++ src/main/java/view/InputView.java | 34 ++++++++++ src/main/java/view/OutputView.java | 4 ++ 12 files changed, 311 insertions(+) create mode 100644 src/main/java/CoordinateApplication.java create mode 100644 src/main/java/coordinate/AbstractFigure.java create mode 100644 src/main/java/coordinate/Figure.java create mode 100644 src/main/java/coordinate/FigureCreator.java create mode 100644 src/main/java/coordinate/FigureFactory.java create mode 100644 src/main/java/coordinate/Line.java create mode 100644 src/main/java/coordinate/Point.java create mode 100644 src/main/java/coordinate/Points.java create mode 100644 src/main/java/coordinate/Rectangle.java create mode 100644 src/main/java/coordinate/Triangle.java create mode 100644 src/main/java/view/InputView.java create mode 100644 src/main/java/view/OutputView.java diff --git a/src/main/java/CoordinateApplication.java b/src/main/java/CoordinateApplication.java new file mode 100644 index 00000000..8f334ae1 --- /dev/null +++ b/src/main/java/CoordinateApplication.java @@ -0,0 +1,16 @@ +import coordinate.Figure; +import coordinate.FigureFactory; +import coordinate.Points; +import view.InputView; + +public class CoordinateApplication { + private static InputView inputView; + private static FigureFactory figureFactory = new FigureFactory(); + + public static void main(String[] args) { + inputView = new InputView(); + Points points = inputView.inputPoint(); + Figure figure = figureFactory.getInstance(points); + figure.output(); + } +} diff --git a/src/main/java/coordinate/AbstractFigure.java b/src/main/java/coordinate/AbstractFigure.java new file mode 100644 index 00000000..02e5a9d1 --- /dev/null +++ b/src/main/java/coordinate/AbstractFigure.java @@ -0,0 +1,22 @@ +package coordinate; + +public abstract class AbstractFigure implements Figure { + protected final Points points; + + public AbstractFigure(Points points) { + if (points.size() != size()) { + throw new IllegalArgumentException(getName() + "의 길이는 " + size() + "이어야 합니다."); + } + + this.points = points; + } + +// protected Point getPoint(int index) { +// return points.getPoints().get(index); +// } + + @Override + public Points getPoints() { + return points; + } +} diff --git a/src/main/java/coordinate/Figure.java b/src/main/java/coordinate/Figure.java new file mode 100644 index 00000000..563a7f0f --- /dev/null +++ b/src/main/java/coordinate/Figure.java @@ -0,0 +1,13 @@ +package coordinate; + +public interface Figure { + Points getPoints(); + + int size(); + + String getName(); + + double area(); + + void 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..307d78cb --- /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 points.get(0).getDistance(points.get(1)); + } + + @Override + public void output(){ + System.out.printf("두 점 사이의 거리는 %f", area()); + } +} diff --git a/src/main/java/coordinate/Point.java b/src/main/java/coordinate/Point.java new file mode 100644 index 00000000..370b38c0 --- /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) { + this.x = x; + if (x < 0 || x > 24) { + throw new IllegalArgumentException(); + } + + this.y = y; + if (y < 0 || y > 24) { + throw new IllegalArgumentException(); + } + } + + 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..3265a0bb --- /dev/null +++ b/src/main/java/coordinate/Points.java @@ -0,0 +1,24 @@ +package coordinate; + +import java.util.ArrayList; +import java.util.List; + +public class Points { + protected static final List points = new ArrayList<>(); + + public void addPoint(Point point) { + this.points.add(point); + } + + public Point get(int index) { + return points.get(index); + } + + public static List getPoints() { + return points; + } + + public int size(){ + return this.points.size(); + } +} diff --git a/src/main/java/coordinate/Rectangle.java b/src/main/java/coordinate/Rectangle.java new file mode 100644 index 00000000..cf44e013 --- /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 void output() { + System.out.printf("사각형 넓이는 %d", area()); + } +} diff --git a/src/main/java/coordinate/Triangle.java b/src/main/java/coordinate/Triangle.java new file mode 100644 index 00000000..63604f79 --- /dev/null +++ b/src/main/java/coordinate/Triangle.java @@ -0,0 +1,42 @@ +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(points.get(0).getDistance(points.get(1))); + distances.add(points.get(1).getDistance(points.get(2))); + distances.add(points.get(2).getDistance(points.get(0))); + Double s = distances.stream().mapToDouble(i->i).sum() /2; + Double result = s; + for(Double d: distances){ + result *= (s-d); + } + + return Math.sqrt(result); + } + + @Override + public void output() { + System.out.printf("삼각형 넓이는 %f", area()); + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 00000000..94c40e08 --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,34 @@ +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 { + 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; + 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..d8f9743c --- /dev/null +++ b/src/main/java/view/OutputView.java @@ -0,0 +1,4 @@ +package view; + +public class OutputView { +} From 5cd8f3049bf70418f4771dc0d74ce94c07911d0e Mon Sep 17 00:00:00 2001 From: oliviarla Date: Sat, 13 Aug 2022 23:22:08 +0900 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=EC=BD=94=EB=93=9C=EB=A6=AC=EB=B7=B0?= =?UTF-8?q?=20=EB=B0=98=EC=98=81=20=EB=B0=8F=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/CoordinateApplication.java | 9 +++++---- src/main/java/coordinate/AbstractFigure.java | 15 +++++---------- src/main/java/coordinate/Figure.java | 6 ++---- src/main/java/coordinate/Line.java | 6 +++--- src/main/java/coordinate/Point.java | 6 +++--- src/main/java/coordinate/Points.java | 10 +++------- src/main/java/coordinate/Rectangle.java | 4 ++-- src/main/java/coordinate/Triangle.java | 19 +++++++++---------- src/main/java/view/InputView.java | 5 ++--- src/main/java/view/OutputView.java | 5 +++++ 10 files changed, 39 insertions(+), 46 deletions(-) diff --git a/src/main/java/CoordinateApplication.java b/src/main/java/CoordinateApplication.java index 8f334ae1..48e12320 100644 --- a/src/main/java/CoordinateApplication.java +++ b/src/main/java/CoordinateApplication.java @@ -2,15 +2,16 @@ import coordinate.FigureFactory; import coordinate.Points; import view.InputView; +import view.OutputView; public class CoordinateApplication { - private static InputView inputView; - private static FigureFactory figureFactory = new FigureFactory(); + 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) { - inputView = new InputView(); Points points = inputView.inputPoint(); Figure figure = figureFactory.getInstance(points); - figure.output(); + outputView.output(figure); } } diff --git a/src/main/java/coordinate/AbstractFigure.java b/src/main/java/coordinate/AbstractFigure.java index 02e5a9d1..53ecca36 100644 --- a/src/main/java/coordinate/AbstractFigure.java +++ b/src/main/java/coordinate/AbstractFigure.java @@ -1,7 +1,11 @@ package coordinate; public abstract class AbstractFigure implements Figure { - protected final Points points; + private final Points points; + + protected final Point getPoint(int idx){ + return points.get(idx); + } public AbstractFigure(Points points) { if (points.size() != size()) { @@ -10,13 +14,4 @@ public AbstractFigure(Points points) { this.points = points; } - -// protected Point getPoint(int index) { -// return points.getPoints().get(index); -// } - - @Override - public Points getPoints() { - return points; - } } diff --git a/src/main/java/coordinate/Figure.java b/src/main/java/coordinate/Figure.java index 563a7f0f..64b9e158 100644 --- a/src/main/java/coordinate/Figure.java +++ b/src/main/java/coordinate/Figure.java @@ -1,13 +1,11 @@ package coordinate; -public interface Figure { - Points getPoints(); - +public interface Figure{ int size(); String getName(); double area(); - void output(); + String output(); } diff --git a/src/main/java/coordinate/Line.java b/src/main/java/coordinate/Line.java index 307d78cb..0b416a1f 100644 --- a/src/main/java/coordinate/Line.java +++ b/src/main/java/coordinate/Line.java @@ -19,11 +19,11 @@ public String getName() { @Override public double area() { - return points.get(0).getDistance(points.get(1)); + return getPoint(0).getDistance(getPoint(1)); } @Override - public void output(){ - System.out.printf("두 점 사이의 거리는 %f", area()); + public String output(){ + return String.format("두 점 사이의 거리는 %f", area()); } } diff --git a/src/main/java/coordinate/Point.java b/src/main/java/coordinate/Point.java index 370b38c0..1e28269c 100644 --- a/src/main/java/coordinate/Point.java +++ b/src/main/java/coordinate/Point.java @@ -7,15 +7,15 @@ public class Point { private final int y; private Point(int x, int y) { - this.x = x; if (x < 0 || x > 24) { throw new IllegalArgumentException(); } - - this.y = y; if (y < 0 || y > 24) { throw new IllegalArgumentException(); } + + this.x = x; + this.y = y; } public double getDistance(Point other) { diff --git a/src/main/java/coordinate/Points.java b/src/main/java/coordinate/Points.java index 3265a0bb..df04d8c9 100644 --- a/src/main/java/coordinate/Points.java +++ b/src/main/java/coordinate/Points.java @@ -4,21 +4,17 @@ import java.util.List; public class Points { - protected static final List points = new ArrayList<>(); + private static final List points = new ArrayList<>(); public void addPoint(Point point) { - this.points.add(point); + points.add(point); } public Point get(int index) { return points.get(index); } - public static List getPoints() { - return points; - } - public int size(){ - return this.points.size(); + return points.size(); } } diff --git a/src/main/java/coordinate/Rectangle.java b/src/main/java/coordinate/Rectangle.java index cf44e013..b385f611 100644 --- a/src/main/java/coordinate/Rectangle.java +++ b/src/main/java/coordinate/Rectangle.java @@ -23,7 +23,7 @@ public double area() { } @Override - public void output() { - System.out.printf("사각형 넓이는 %d", area()); + public String output() { + return String.format("사각형 넓이는 %f", area()); } } diff --git a/src/main/java/coordinate/Triangle.java b/src/main/java/coordinate/Triangle.java index 63604f79..673e1759 100644 --- a/src/main/java/coordinate/Triangle.java +++ b/src/main/java/coordinate/Triangle.java @@ -23,20 +23,19 @@ public String getName() { @Override public double area() { List distances = new ArrayList<>(); - distances.add(points.get(0).getDistance(points.get(1))); - distances.add(points.get(1).getDistance(points.get(2))); - distances.add(points.get(2).getDistance(points.get(0))); - Double s = distances.stream().mapToDouble(i->i).sum() /2; - Double result = s; - for(Double d: distances){ - result *= (s-d); - } + 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 void output() { - System.out.printf("삼각형 넓이는 %f", area()); + public String output() { + return String.format("삼각형 넓이는 %f", area()); } } diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 94c40e08..53d4d3b1 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -10,7 +10,7 @@ import java.util.stream.Collectors; public class InputView { - Scanner scanner = new Scanner(System.in); + private final static Scanner scanner = new Scanner(System.in); public Points inputPoint(){ System.out.println("좌표를 입력하세요."); @@ -20,8 +20,7 @@ public Points inputPoint(){ String[] strings = s.split("-"); for(String str: strings){ List numbers = new ArrayList<>(); - List nums; - nums = Arrays.stream(str.split("\\(|,|\\)")).filter(t -> !t.isEmpty()).collect(Collectors.toList()); + List nums = Arrays.stream(str.split("\\(|,|\\)")).filter(t -> !t.isEmpty()).collect(Collectors.toList()); for(String n: nums){ numbers.add(Integer.valueOf(n)); } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index d8f9743c..9189e537 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,4 +1,9 @@ package view; +import coordinate.Figure; + public class OutputView { + public void output(Figure figure) { + System.out.println(figure.output()); + } }