Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions src/main/java/CoordinateApplication.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
17 changes: 17 additions & 0 deletions src/main/java/coordinate/AbstractFigure.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
11 changes: 11 additions & 0 deletions src/main/java/coordinate/Figure.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package coordinate;

public interface Figure{
int size();

String getName();

double area();

String output();
}
5 changes: 5 additions & 0 deletions src/main/java/coordinate/FigureCreator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package coordinate;

public interface FigureCreator {
Figure create(Points points);
}
24 changes: 24 additions & 0 deletions src/main/java/coordinate/FigureFactory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package coordinate;

import java.util.HashMap;
import java.util.Map;

public class FigureFactory {
public static final Map<Integer, FigureCreator> 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;
}
}
29 changes: 29 additions & 0 deletions src/main/java/coordinate/Line.java
Original file line number Diff line number Diff line change
@@ -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());
}
}
69 changes: 69 additions & 0 deletions src/main/java/coordinate/Point.java
Original file line number Diff line number Diff line change
@@ -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 +
'}';
}
}
20 changes: 20 additions & 0 deletions src/main/java/coordinate/Points.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package coordinate;

import java.util.ArrayList;
import java.util.List;

public class Points {
private static final List<Point> 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();
}
}
29 changes: 29 additions & 0 deletions src/main/java/coordinate/Rectangle.java
Original file line number Diff line number Diff line change
@@ -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());
}
}
41 changes: 41 additions & 0 deletions src/main/java/coordinate/Triangle.java
Original file line number Diff line number Diff line change
@@ -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<Double> 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());
}
}
33 changes: 33 additions & 0 deletions src/main/java/view/InputView.java
Original file line number Diff line number Diff line change
@@ -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<Integer> numbers = new ArrayList<>();
List<String> 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;
}
}
9 changes: 9 additions & 0 deletions src/main/java/view/OutputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package view;

import coordinate.Figure;

public class OutputView {
public void output(Figure figure) {
System.out.println(figure.output());
}
}