diff --git a/java-coordinate-playground-exercise-polymorphism/java-coordinate-playground-exercise-polymorphism/README.md b/java-coordinate-playground-exercise-polymorphism/java-coordinate-playground-exercise-polymorphism/README.md new file mode 100644 index 00000000..e69de29b diff --git a/java-coordinate-playground-exercise-polymorphism/java-coordinate-playground-exercise-polymorphism/build.gradle b/java-coordinate-playground-exercise-polymorphism/java-coordinate-playground-exercise-polymorphism/build.gradle new file mode 100644 index 00000000..e69de29b diff --git a/java-coordinate-playground-exercise-polymorphism/java-coordinate-playground-exercise-polymorphism/gradle/wrapper/gradle-wrapper.jar b/java-coordinate-playground-exercise-polymorphism/java-coordinate-playground-exercise-polymorphism/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 00000000..e69de29b diff --git a/java-coordinate-playground-exercise-polymorphism/java-coordinate-playground-exercise-polymorphism/gradle/wrapper/gradle-wrapper.properties b/java-coordinate-playground-exercise-polymorphism/java-coordinate-playground-exercise-polymorphism/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..e69de29b diff --git a/java-coordinate-playground-exercise-polymorphism/java-coordinate-playground-exercise-polymorphism/gradlew b/java-coordinate-playground-exercise-polymorphism/java-coordinate-playground-exercise-polymorphism/gradlew new file mode 100644 index 00000000..e69de29b diff --git a/java-coordinate-playground-exercise-polymorphism/java-coordinate-playground-exercise-polymorphism/gradlew.bat b/java-coordinate-playground-exercise-polymorphism/java-coordinate-playground-exercise-polymorphism/gradlew.bat new file mode 100644 index 00000000..e69de29b diff --git a/java-coordinate-playground-exercise-polymorphism/java-coordinate-playground-exercise-polymorphism/settings.gradle b/java-coordinate-playground-exercise-polymorphism/java-coordinate-playground-exercise-polymorphism/settings.gradle new file mode 100644 index 00000000..1fadea20 --- /dev/null +++ b/java-coordinate-playground-exercise-polymorphism/java-coordinate-playground-exercise-polymorphism/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'java-coordinate-playground' diff --git a/src/main/java/coordinate/AbstractFigure.java b/src/main/java/coordinate/AbstractFigure.java new file mode 100644 index 00000000..80d6e69b --- /dev/null +++ b/src/main/java/coordinate/AbstractFigure.java @@ -0,0 +1,24 @@ +package coordinate; + +import java.util.List; + +public abstract class AbstractFigure implements Figure { + private final List points; + + public AbstractFigure(List points) { + if (points.size() != size()) { + throw new IllegalArgumentException(getName() + "의 길이는 " + size() + "이어야 합니다."); + } + + this.points = points; + } + + protected Point getPoint(int index) { + return points.get(index); + } + + @Override + public List 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..f8f00590 --- /dev/null +++ b/src/main/java/coordinate/Figure.java @@ -0,0 +1,13 @@ +package coordinate; + +import java.util.List; + +public interface Figure { + List getPoints(); + + int size(); + + String getName(); + + double area(); +} diff --git a/src/main/java/coordinate/FigureCreator.java b/src/main/java/coordinate/FigureCreator.java new file mode 100644 index 00000000..60910462 --- /dev/null +++ b/src/main/java/coordinate/FigureCreator.java @@ -0,0 +1,7 @@ +package coordinate; + +import java.util.List; + +public interface FigureCreator { + Figure create(List points); +} diff --git a/src/main/java/coordinate/FigureFactory.java b/src/main/java/coordinate/FigureFactory.java new file mode 100644 index 00000000..8657ada2 --- /dev/null +++ b/src/main/java/coordinate/FigureFactory.java @@ -0,0 +1,21 @@ +package coordinate; + +import java.util.List; + +public class FigureFactory { + static Figure getInstance(List points) { + if (points.size() == Line.LINE_POINT_SIZE) { + return new Line(points); + } + + if (points.size() == Triangle.TRIANGLE_POINT_SIZE) { + return new Triangle(points); + } + + if (points.size() == Rectangle.RECTANGLE_POINT_SIZE) { + return new Rectangle(points); + } + + throw new IllegalArgumentException("유효하지 않은 도형입니다."); + } +} diff --git a/src/main/java/coordinate/Line.java b/src/main/java/coordinate/Line.java new file mode 100644 index 00000000..250ce2c0 --- /dev/null +++ b/src/main/java/coordinate/Line.java @@ -0,0 +1,26 @@ +package coordinate; + +import java.util.List; + +public class Line extends AbstractFigure { + public static final int LINE_POINT_SIZE = 2; + + public Line(List points) { + super(points); + } + + @Override + public int size() { + return LINE_POINT_SIZE; + } + + @Override + public String getName() { + return "선"; + } + + @Override + public double area() { + return 0; + } +} 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/Rectangle.java b/src/main/java/coordinate/Rectangle.java new file mode 100644 index 00000000..7a383b11 --- /dev/null +++ b/src/main/java/coordinate/Rectangle.java @@ -0,0 +1,26 @@ +package coordinate; + +import java.util.List; + +public class Rectangle extends AbstractFigure { + public static final int RECTANGLE_POINT_SIZE = 4; + + public Rectangle(List points) { + super(points); + } + + @Override + public int size() { + return RECTANGLE_POINT_SIZE; + } + + @Override + public String getName() { + return "사각형"; + } + + @Override + public double area() { + return 0; + } +} diff --git a/src/main/java/coordinate/Triangle.java b/src/main/java/coordinate/Triangle.java new file mode 100644 index 00000000..4db12636 --- /dev/null +++ b/src/main/java/coordinate/Triangle.java @@ -0,0 +1,26 @@ +package coordinate; + +import java.util.List; + +public class Triangle extends AbstractFigure { + public static final int TRIANGLE_POINT_SIZE = 3; + + public Triangle(List points) { + super(points); + } + + @Override + public int size() { + return TRIANGLE_POINT_SIZE; + } + + @Override + public String getName() { + return "삼각형"; + } + + @Override + public double area() { + return 0; + } +} diff --git a/src/test/FigureFactoryTest.java b/src/test/FigureFactoryTest.java new file mode 100644 index 00000000..91d1a8ff --- /dev/null +++ b/src/test/FigureFactoryTest.java @@ -0,0 +1,46 @@ +package coordinate; + +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class FigureFactoryTest { + @Test + public void line() { + List points = Arrays.asList( + Point.of(1, 2), + Point.of(2, 3)); + + Figure figure = FigureFactory.getInstance(points); + assertThat(figure).isInstanceOfAny(Line.class); + assertThat(figure.getName()).isEqualTo("선"); + } + + @Test + public void triangle() { + List points = Arrays.asList( + Point.of(1, 1), + Point.of(4, 1), + Point.of(1, 4)); + + Figure figure = FigureFactory.getInstance(points); + assertThat(figure).isInstanceOfAny(Triangle.class); + assertThat(figure.getName()).isEqualTo("삼각형"); + } + + @Test + public void rectangle() { + List points = Arrays.asList( + Point.of(1, 1), + Point.of(4, 1), + Point.of(1, 4), + Point.of(4, 4)); + + Figure figure = FigureFactory.getInstance(points); + assertThat(figure).isInstanceOfAny(Rectangle.class); + assertThat(figure.getName()).isEqualTo("사각형"); + } +}