diff --git a/src/main/java/Main.java b/src/main/java/Main.java new file mode 100644 index 0000000..02912cb --- /dev/null +++ b/src/main/java/Main.java @@ -0,0 +1,23 @@ +import io.CoordinateInput; +import model.Point; +import model.DistanceCalculator; +import io.CoordinateView; + +public class Main { + + public static void main(String[] args) { + // 입력 + CoordinateInput coordinateInput = new CoordinateInput(); + // 출력 + CoordinateView coordinateView = new CoordinateView(); + + // 두 좌표 입력 받기 + Point[] points = coordinateInput.getCoordinates(); + // 입력 체크 + if (points.length == 2) { + // 거리 계산 + double distance = DistanceCalculator.calculate(points[0], points[1]); + coordinateView.printDistance(distance); + } + } +} diff --git a/src/main/java/io/CoordinateInput.java b/src/main/java/io/CoordinateInput.java new file mode 100644 index 0000000..4878f97 --- /dev/null +++ b/src/main/java/io/CoordinateInput.java @@ -0,0 +1,52 @@ +// File: input/CoordinateInput.java +package io; + +import model.Point; +import util.InputScanner; + +import java.util.Scanner; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class CoordinateInput { + + private static final String COORDINATE_PATTERN = "\\((\\d+),(\\d+)\\)"; // 좌표 형식에 대한 정규식. + + // 사용자 입력을 통해 좌표를 얻음 (단일 책임 원칙: 입력 처리만 수행). + public Point[] getCoordinates() { + Scanner scanner = InputScanner.getInstance(); // Scanner 유틸리티 사용. + Pattern pattern = Pattern.compile(COORDINATE_PATTERN); + + while (true) { + System.out.println("좌표를 (x1,y1)-(x2,y2) 형식으로 입력하세요:"); + String input = scanner.nextLine(); // 사용자 입력 읽기. + String[] parts = input.split("-"); // 입력을 두 부분으로 나눔. + + if (parts.length == 2) { // 두 점 입력 여부 확인. + Point[] points = new Point[2]; + try { + points[0] = parsePoint(parts[0], pattern); // 첫 번째 점 파싱. + points[1] = parsePoint(parts[1], pattern); // 두 번째 점 파싱. + return points; // 파싱된 점 반환. + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); // 에러 메시지 출력. + } + } else { + System.out.println("잘못된 형식입니다. (x1,y1)-(x2,y2) 형식으로 입력하세요."); + } + } + } + + // 단일 점을 문자열에서 파싱하는 메서드 (단일 책임 원칙: 파싱만 처리). + private Point parsePoint(String part, Pattern pattern) { + Matcher matcher = pattern.matcher(part.trim()); + if (matcher.matches()) { + int x = Integer.parseInt(matcher.group(1)); // X 좌표 추출. + int y = Integer.parseInt(matcher.group(2)); // Y 좌표 추출. + return new Point(x, y); // 새 Point 객체 반환. + } else { + throw new IllegalArgumentException("잘못된 좌표 형식: " + part); + } + } +} + diff --git a/src/main/java/io/CoordinateView.java b/src/main/java/io/CoordinateView.java new file mode 100644 index 0000000..83f5fed --- /dev/null +++ b/src/main/java/io/CoordinateView.java @@ -0,0 +1,9 @@ +package io; + +public class CoordinateView { + + // 계산된 거리를 출력 (단일 책임 원칙: 출력만 처리). + public void printDistance(double distance) { + System.out.printf("두 점 사이의 거리는 %.6f입니다.\n", distance); + } +} \ No newline at end of file diff --git a/src/main/java/model/DistanceCalculator.java b/src/main/java/model/DistanceCalculator.java new file mode 100644 index 0000000..ff823fb --- /dev/null +++ b/src/main/java/model/DistanceCalculator.java @@ -0,0 +1,15 @@ +package model; + +public class DistanceCalculator { + + // 객체 생성을 방지하기 위해 private 생성자를 선언. + private DistanceCalculator() { + } + + // 두 점 사이의 거리를 계산 (단일 책임 원칙: 거리 계산만 수행). + public static double calculate(Point p1, Point p2) { + int dx = p1.getX() - p2.getX(); // X 좌표 차이 계산. + int dy = p1.getY() - p2.getY(); // Y 좌표 차이 계산. + return Math.sqrt(dx * dx + dy * dy); // 유클리드 거리 반환. + } +} \ No newline at end of file diff --git a/src/main/java/model/Point.java b/src/main/java/model/Point.java new file mode 100644 index 0000000..629c88f --- /dev/null +++ b/src/main/java/model/Point.java @@ -0,0 +1,30 @@ +package model; + +public class Point { + private final int x; // 점의 X 좌표. + private final int y; // 점의 Y 좌표. + + // 생성자에서 좌표를 초기화하며 유효성 검사. + public Point(int x, int y) { + if (x > 24 || y > 24) { + throw new IllegalArgumentException("좌표 값은 0에서 24 사이여야 합니다."); + } + this.x = x; + this.y = y; + } + + // X 좌표 반환. + public int getX() { + return x; + } + + // Y 좌표 반환. + public int getY() { + return y; + } + + @Override + public String toString() { + return "(" + x + "," + y + ")"; // (x, y) 형식으로 좌표 반환. + } +} \ No newline at end of file diff --git a/src/main/java/util/InputScanner.java b/src/main/java/util/InputScanner.java new file mode 100644 index 0000000..73f618e --- /dev/null +++ b/src/main/java/util/InputScanner.java @@ -0,0 +1,17 @@ +package util; + +import java.util.Scanner; + +public class InputScanner { + + private static final Scanner INSTANCE = new Scanner(System.in); // Scanner의 단일 인스턴스. + + private InputScanner() { + // 객체 생성을 방지. + } + + // 공유 Scanner 인스턴스를 반환 (단일 책임 원칙: Scanner 관리만 수행). + public static Scanner getInstance() { + return INSTANCE; + } +}