Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add files via upload #10

Open
wants to merge 2 commits into
base: exercise-polymorphism
Choose a base branch
from
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
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
rootProject.name = 'java-coordinate-playground'
24 changes: 24 additions & 0 deletions src/main/java/coordinate/AbstractFigure.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package coordinate;

import java.util.List;

public abstract class AbstractFigure implements Figure {
private final List<Point> points;

public AbstractFigure(List<Point> 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<Point> getPoints() {
return points;
}
}
13 changes: 13 additions & 0 deletions src/main/java/coordinate/Figure.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package coordinate;

import java.util.List;

public interface Figure {
List<Point> getPoints();

int size();

String getName();

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

import java.util.List;

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

import java.util.List;

public class FigureFactory {
static Figure getInstance(List<Point> 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("유효하지 않은 도형입니다.");
}
}
26 changes: 26 additions & 0 deletions src/main/java/coordinate/Line.java
Original file line number Diff line number Diff line change
@@ -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<Point> points) {
super(points);
}

@Override
public int size() {
return LINE_POINT_SIZE;
}

@Override
public String getName() {
return "선";
}

@Override
public double area() {
return 0;
}
}
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) {
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 +
'}';
}
}
26 changes: 26 additions & 0 deletions src/main/java/coordinate/Rectangle.java
Original file line number Diff line number Diff line change
@@ -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<Point> points) {
super(points);
}

@Override
public int size() {
return RECTANGLE_POINT_SIZE;
}

@Override
public String getName() {
return "사각형";
}

@Override
public double area() {
return 0;
}
}
26 changes: 26 additions & 0 deletions src/main/java/coordinate/Triangle.java
Original file line number Diff line number Diff line change
@@ -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<Point> points) {
super(points);
}

@Override
public int size() {
return TRIANGLE_POINT_SIZE;
}

@Override
public String getName() {
return "삼각형";
}

@Override
public double area() {
return 0;
}
}
46 changes: 46 additions & 0 deletions src/test/FigureFactoryTest.java
Original file line number Diff line number Diff line change
@@ -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<Point> 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<Point> 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<Point> 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("사각형");
}
}