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
23 changes: 23 additions & 0 deletions src/main/java/Main.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
}
52 changes: 52 additions & 0 deletions src/main/java/io/CoordinateInput.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
}

9 changes: 9 additions & 0 deletions src/main/java/io/CoordinateView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package io;

public class CoordinateView {

// 계산된 거리를 출력 (단일 책임 원칙: 출력만 처리).
public void printDistance(double distance) {
System.out.printf("두 점 사이의 거리는 %.6f입니다.\n", distance);
}
}
15 changes: 15 additions & 0 deletions src/main/java/model/DistanceCalculator.java
Original file line number Diff line number Diff line change
@@ -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); // 유클리드 거리 반환.
}
}
30 changes: 30 additions & 0 deletions src/main/java/model/Point.java
Original file line number Diff line number Diff line change
@@ -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) 형식으로 좌표 반환.
}
}
17 changes: 17 additions & 0 deletions src/main/java/util/InputScanner.java
Original file line number Diff line number Diff line change
@@ -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;
}
}