From 673db0e5fdb3f04b881422813bfd80d518df7a0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=EC=84=B8=EC=9D=80?= Date: Sun, 29 Dec 2024 16:14:47 +0900 Subject: [PATCH 1/4] Feat package --- src/main/java/Main.java | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 src/main/java/Main.java diff --git a/src/main/java/Main.java b/src/main/java/Main.java new file mode 100644 index 0000000..7046417 --- /dev/null +++ b/src/main/java/Main.java @@ -0,0 +1,2 @@ +public class Main { +} From d372bd7022ee9e997e819524e35f4ac5eb7605d0 Mon Sep 17 00:00:00 2001 From: ariel-ssen Date: Tue, 14 Jan 2025 16:09:22 +0900 Subject: [PATCH 2/4] =?UTF-8?q?SSEN=20-=20=EC=97=B0=EB=A3=8C=EC=A3=BC?= =?UTF-8?q?=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Main.java | 19 +++++++++++++- src/main/java/Massage/Messages.java | 11 ++++++++ src/main/java/Model/Avante.java | 24 +++++++++++++++++ src/main/java/Model/Car.java | 17 ++++++++++++ src/main/java/Model/K5.java | 24 +++++++++++++++++ src/main/java/Model/Sonata.java | 24 +++++++++++++++++ src/main/java/io/RentCompany.java | 40 +++++++++++++++++++++++++++++ 7 files changed, 158 insertions(+), 1 deletion(-) create mode 100644 src/main/java/Massage/Messages.java create mode 100644 src/main/java/Model/Avante.java create mode 100644 src/main/java/Model/Car.java create mode 100644 src/main/java/Model/K5.java create mode 100644 src/main/java/Model/Sonata.java create mode 100644 src/main/java/io/RentCompany.java diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 7046417..9d3aadd 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,2 +1,19 @@ +import io.RentCompany; +import Model.Avante; +import Model.K5; +import Model.Sonata; + public class Main { -} + public static void main(String[] args) { + RentCompany company = RentCompany.getInstance(); // 싱글톤 인스턴스 사용 + + company.addCar(new Sonata(150)); + company.addCar(new K5(260)); + company.addCar(new Sonata(120)); + company.addCar(new Avante(300)); + company.addCar(new K5(390)); + + String report = company.generateReport(); + System.out.println(report); + } +} \ No newline at end of file diff --git a/src/main/java/Massage/Messages.java b/src/main/java/Massage/Messages.java new file mode 100644 index 0000000..368615e --- /dev/null +++ b/src/main/java/Massage/Messages.java @@ -0,0 +1,11 @@ +package Massage; + +public class Messages { + public static final String REPORT_LINE_FORMAT = "%s : %.0f리터"; + public static final String LINE_SEPARATOR = System.lineSeparator(); + + // 에러 메시지 예시 + public static final String ERROR_INVALID_DISTANCE = "유효하지 않은 이동 거리입니다."; + public static final String ERROR_CAR_TYPE_NOT_FOUND = "해당 차량 유형을 찾을 수 없습니다."; +} + diff --git a/src/main/java/Model/Avante.java b/src/main/java/Model/Avante.java new file mode 100644 index 0000000..9d23a4b --- /dev/null +++ b/src/main/java/Model/Avante.java @@ -0,0 +1,24 @@ +package Model; + +public class Avante extends Car { + private final double tripDistance; + + public Avante(double tripDistance) { + this.tripDistance = tripDistance; + } + + @Override + public double getDistancePerLiter() { + return 15.0; // Avante의 연비 + } + + @Override + public double getTripDistance() { + return tripDistance; + } + + @Override + public String getName() { + return "Avante"; + } +} diff --git a/src/main/java/Model/Car.java b/src/main/java/Model/Car.java new file mode 100644 index 0000000..10ef97b --- /dev/null +++ b/src/main/java/Model/Car.java @@ -0,0 +1,17 @@ +package Model; + +public abstract class Car { + // 리터당 이동 거리 (연비) + public abstract double getDistancePerLiter(); + + // 여행 거리 + public abstract double getTripDistance(); + + // 차종 이름 + public abstract String getName(); + + // 주입해야 할 연료량 계산 + public double getChargeQuantity() { + return getTripDistance() / getDistancePerLiter(); + } +} diff --git a/src/main/java/Model/K5.java b/src/main/java/Model/K5.java new file mode 100644 index 0000000..018d072 --- /dev/null +++ b/src/main/java/Model/K5.java @@ -0,0 +1,24 @@ +package Model; + +public class K5 extends Car { + private final double tripDistance; + + public K5(double tripDistance) { + this.tripDistance = tripDistance; + } + + @Override + public double getDistancePerLiter() { + return 13.0; // K5의 연비 + } + + @Override + public double getTripDistance() { + return tripDistance; + } + + @Override + public String getName() { + return "K5"; + } +} diff --git a/src/main/java/Model/Sonata.java b/src/main/java/Model/Sonata.java new file mode 100644 index 0000000..dd28c4f --- /dev/null +++ b/src/main/java/Model/Sonata.java @@ -0,0 +1,24 @@ +package Model; + +public class Sonata extends Car { + private final double tripDistance; + + public Sonata(double tripDistance) { + this.tripDistance = tripDistance; + } + + @Override + public double getDistancePerLiter() { + return 10.0; // Sonata의 연비 + } + + @Override + public double getTripDistance() { + return tripDistance; + } + + @Override + public String getName() { + return "Sonata"; + } +} diff --git a/src/main/java/io/RentCompany.java b/src/main/java/io/RentCompany.java new file mode 100644 index 0000000..d64cdce --- /dev/null +++ b/src/main/java/io/RentCompany.java @@ -0,0 +1,40 @@ +// RentCompany Class (Singleton Pattern 적용) +package io; + +import java.util.ArrayList; +import java.util.List; +import Model.Car; +import Massage.Messages; // 메시지 상수 클래스 import + +public class RentCompany { + private static RentCompany instance; // RentCompany 싱글톤 인스턴스를 저장할 변수 + private final List cars = new ArrayList<>(); // 자동차 리스트를 저장할 변수 + + private RentCompany() {} // private 생성자: 외부에서 객체 생성 불가 + + // RentCompany 객체를 생성하거나 반환하는 메서드 (싱글톤 구현) + public static RentCompany getInstance() { + if (instance == null) { // 인스턴스가 없으면 새로 생성 + instance = new RentCompany(); + } + return instance; // 기존 인스턴스를 반환 + } + + // 자동차를 추가하는 메서드 + public void addCar(Car car) { + cars.add(car); + } + + // 보고서를 생성하는 메서드 + public String generateReport() { + StringBuilder report = new StringBuilder(); // 보고서를 저장할 변수 + + for (Car car : cars) { + // 자동차 이름과 연료량 정보를 메시지 포맷에 맞게 추가 + report.append(String.format(Messages.REPORT_LINE_FORMAT, car.getName(), car.getChargeQuantity())) + .append(Messages.LINE_SEPARATOR); + } + + return report.toString(); // 최종 보고서 반환 + } +} From e6accfdfde70f6381ab8ca9e3eb08745641da8e0 Mon Sep 17 00:00:00 2001 From: ariel-ssen Date: Tue, 14 Jan 2025 16:41:53 +0900 Subject: [PATCH 3/4] =?UTF-8?q?ssen=20=EC=A2=8C=ED=91=9C=EA=B3=84=EC=82=B0?= =?UTF-8?q?=EA=B8=B0(=EC=84=A0=20=EA=B8=B8=EC=9D=B4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Main.java | 32 +++++++------ src/main/java/io/CoordinateInput.java | 52 +++++++++++++++++++++ src/main/java/io/CoordinateView.java | 9 ++++ src/main/java/model/DistanceCalculator.java | 15 ++++++ src/main/java/model/Point.java | 30 ++++++++++++ src/main/java/util/InputScanner.java | 17 +++++++ 6 files changed, 141 insertions(+), 14 deletions(-) create mode 100644 src/main/java/io/CoordinateInput.java create mode 100644 src/main/java/io/CoordinateView.java create mode 100644 src/main/java/model/DistanceCalculator.java create mode 100644 src/main/java/model/Point.java create mode 100644 src/main/java/util/InputScanner.java diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 9d3aadd..02912cb 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,19 +1,23 @@ -import io.RentCompany; -import Model.Avante; -import Model.K5; -import Model.Sonata; +import io.CoordinateInput; +import model.Point; +import model.DistanceCalculator; +import io.CoordinateView; public class Main { - public static void main(String[] args) { - RentCompany company = RentCompany.getInstance(); // 싱글톤 인스턴스 사용 - company.addCar(new Sonata(150)); - company.addCar(new K5(260)); - company.addCar(new Sonata(120)); - company.addCar(new Avante(300)); - company.addCar(new K5(390)); + public static void main(String[] args) { + // 입력 + CoordinateInput coordinateInput = new CoordinateInput(); + // 출력 + CoordinateView coordinateView = new CoordinateView(); - String report = company.generateReport(); - System.out.println(report); + // 두 좌표 입력 받기 + Point[] points = coordinateInput.getCoordinates(); + // 입력 체크 + if (points.length == 2) { + // 거리 계산 + double distance = DistanceCalculator.calculate(points[0], points[1]); + coordinateView.printDistance(distance); + } } -} \ No newline at end of file +} 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; + } +} From 0d428264292091ea0dc95ee323663cfa254cdb1c Mon Sep 17 00:00:00 2001 From: ariel-ssen Date: Tue, 14 Jan 2025 16:49:39 +0900 Subject: [PATCH 4/4] refactor --- src/main/java/Massage/Messages.java | 11 -------- src/main/java/Model/Avante.java | 24 ----------------- src/main/java/Model/Car.java | 17 ------------ src/main/java/Model/K5.java | 24 ----------------- src/main/java/Model/Sonata.java | 24 ----------------- src/main/java/io/RentCompany.java | 40 ----------------------------- 6 files changed, 140 deletions(-) delete mode 100644 src/main/java/Massage/Messages.java delete mode 100644 src/main/java/Model/Avante.java delete mode 100644 src/main/java/Model/Car.java delete mode 100644 src/main/java/Model/K5.java delete mode 100644 src/main/java/Model/Sonata.java delete mode 100644 src/main/java/io/RentCompany.java diff --git a/src/main/java/Massage/Messages.java b/src/main/java/Massage/Messages.java deleted file mode 100644 index 368615e..0000000 --- a/src/main/java/Massage/Messages.java +++ /dev/null @@ -1,11 +0,0 @@ -package Massage; - -public class Messages { - public static final String REPORT_LINE_FORMAT = "%s : %.0f리터"; - public static final String LINE_SEPARATOR = System.lineSeparator(); - - // 에러 메시지 예시 - public static final String ERROR_INVALID_DISTANCE = "유효하지 않은 이동 거리입니다."; - public static final String ERROR_CAR_TYPE_NOT_FOUND = "해당 차량 유형을 찾을 수 없습니다."; -} - diff --git a/src/main/java/Model/Avante.java b/src/main/java/Model/Avante.java deleted file mode 100644 index 9d23a4b..0000000 --- a/src/main/java/Model/Avante.java +++ /dev/null @@ -1,24 +0,0 @@ -package Model; - -public class Avante extends Car { - private final double tripDistance; - - public Avante(double tripDistance) { - this.tripDistance = tripDistance; - } - - @Override - public double getDistancePerLiter() { - return 15.0; // Avante의 연비 - } - - @Override - public double getTripDistance() { - return tripDistance; - } - - @Override - public String getName() { - return "Avante"; - } -} diff --git a/src/main/java/Model/Car.java b/src/main/java/Model/Car.java deleted file mode 100644 index 10ef97b..0000000 --- a/src/main/java/Model/Car.java +++ /dev/null @@ -1,17 +0,0 @@ -package Model; - -public abstract class Car { - // 리터당 이동 거리 (연비) - public abstract double getDistancePerLiter(); - - // 여행 거리 - public abstract double getTripDistance(); - - // 차종 이름 - public abstract String getName(); - - // 주입해야 할 연료량 계산 - public double getChargeQuantity() { - return getTripDistance() / getDistancePerLiter(); - } -} diff --git a/src/main/java/Model/K5.java b/src/main/java/Model/K5.java deleted file mode 100644 index 018d072..0000000 --- a/src/main/java/Model/K5.java +++ /dev/null @@ -1,24 +0,0 @@ -package Model; - -public class K5 extends Car { - private final double tripDistance; - - public K5(double tripDistance) { - this.tripDistance = tripDistance; - } - - @Override - public double getDistancePerLiter() { - return 13.0; // K5의 연비 - } - - @Override - public double getTripDistance() { - return tripDistance; - } - - @Override - public String getName() { - return "K5"; - } -} diff --git a/src/main/java/Model/Sonata.java b/src/main/java/Model/Sonata.java deleted file mode 100644 index dd28c4f..0000000 --- a/src/main/java/Model/Sonata.java +++ /dev/null @@ -1,24 +0,0 @@ -package Model; - -public class Sonata extends Car { - private final double tripDistance; - - public Sonata(double tripDistance) { - this.tripDistance = tripDistance; - } - - @Override - public double getDistancePerLiter() { - return 10.0; // Sonata의 연비 - } - - @Override - public double getTripDistance() { - return tripDistance; - } - - @Override - public String getName() { - return "Sonata"; - } -} diff --git a/src/main/java/io/RentCompany.java b/src/main/java/io/RentCompany.java deleted file mode 100644 index d64cdce..0000000 --- a/src/main/java/io/RentCompany.java +++ /dev/null @@ -1,40 +0,0 @@ -// RentCompany Class (Singleton Pattern 적용) -package io; - -import java.util.ArrayList; -import java.util.List; -import Model.Car; -import Massage.Messages; // 메시지 상수 클래스 import - -public class RentCompany { - private static RentCompany instance; // RentCompany 싱글톤 인스턴스를 저장할 변수 - private final List cars = new ArrayList<>(); // 자동차 리스트를 저장할 변수 - - private RentCompany() {} // private 생성자: 외부에서 객체 생성 불가 - - // RentCompany 객체를 생성하거나 반환하는 메서드 (싱글톤 구현) - public static RentCompany getInstance() { - if (instance == null) { // 인스턴스가 없으면 새로 생성 - instance = new RentCompany(); - } - return instance; // 기존 인스턴스를 반환 - } - - // 자동차를 추가하는 메서드 - public void addCar(Car car) { - cars.add(car); - } - - // 보고서를 생성하는 메서드 - public String generateReport() { - StringBuilder report = new StringBuilder(); // 보고서를 저장할 변수 - - for (Car car : cars) { - // 자동차 이름과 연료량 정보를 메시지 포맷에 맞게 추가 - report.append(String.format(Messages.REPORT_LINE_FORMAT, car.getName(), car.getChargeQuantity())) - .append(Messages.LINE_SEPARATOR); - } - - return report.toString(); // 최종 보고서 반환 - } -}