diff --git a/README.md b/README.md
index 450e7753a..7445305b1 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,62 @@
# 지하철 노선도 미션
- 지하철 역과 노선을 관리하는 지하철 노선도 기능을 구현한다.
+## 구현할 기능 목록
+* 데이터 초기 값 설정 기능
+ * 지하철 역 초기값 설정 기능
+ * 노선 초기값 설정 기능
+* 메인 메뉴를 출력한다.
+* 원하는 메인 메뉴를 입력 받는다.
+ * 선택할 수 없는 메뉴인지 검증한다.
+* 지하철 역 메뉴를 출력한다.
+* 지하철 역 메뉴를 입력 받는다.
+ * 선택할 수 없는 메뉴인지 검증한다.
+* 지하철 역을 등록한다.
+ * 지하철 역 이름이 중복 되는지 검증한다.
+ * 지하철 역 이름이 2글자 이상인지 검증한다.
+* 지하철 역을 삭제한다.
+ * 등록된 지하철 역인지 확인한다.
+* 지하철 역 목록을 출력한다.
+* 노선 메뉴를 출력한다.
+* 원하는 노션 메뉴를 입력 받는다.
+ * 선택할 수 없는 메뉴인지 검증한다.
+* 지하철 노선을 등록한다.
+ * 노선 이름이 중복 되는지 검증한다.
+ * 노선 이름이 2글자 이상인지 검증한다.
+* 노선 종점역을 초기화 한다.
+ * 노선 상행 종점역을 등록한다.
+ * 노선 하행 종점역을 등록한다.
+ * 하행과 상행 종점에 등록된 역이 있는지 검증한다.
+ * 노선 하행과 상행 종점이 같은지 검증한다.
+* 노선의 목록을 출력한다.
+* 노선에 역을 추가한다.
+ * 같은 노선에 중복 된 역이 등록 되는지 검증한다.
+ * 노선의 상행 종점역 보다 앞에 역 등록을 하는지 검증한다.
+ * 노선의 하행 종점역 보다 뒤에 역 등록을 하는지 검증한다.
+* 노선을 제거한다.
+ * 등록 된 노선인지 확인한다.
+* 노선에 등록 된 역을 제거한다.
+ * 노선에서 제거 된 역이 종점인지 검증한다.
+* 구간 메뉴를 출력한다.
+* 원하는 메인 메뉴를 입력 받는다.
+ * 선택할 수 없는 메뉴인지 검증한다.
+
+## 미구현 기능 목록
+* 구간을 등록한다.
+ * 노선에 등록 된 지하철 역 보다 큰 숫자인지 검증
+ * 음수 입력 검증
+* 구간을 삭제한다.
+ * 노선에 포함 된 역이 2개 이하인지 검증한다.
+ * 노선에 등록 된 역의 범위를 확인한다.
+* 노선에 등록된 지하철인지 검증한다. ( 노선에 등록 된 역은 삭제 불가)
+* 종점이 제거 될 경우 마지막 노선이 종점이 된다.
+* 노선의 상행 종점부터 하행 종점까지 연결된 순서대로 역 목록을 출력한다.
+
## 🚀 기능 요구사항
+
+더보기
### 초기 설정
- 프로그램 시작 시 역, 노선 등 필요한 정보를 미리 셋팅할 수 있다.
@@ -397,6 +450,7 @@ B. 돌아가기
### 프로그래밍 요구사항 - Application
- Application 클래스를 활용해 구현해야 한다.
- Application의 패키지 구조는 변경하지 않는다.
+- 주석을 참고하여 구현할 수 있으며 주석대로 구현하지 않아도 되고 삭제해도 무관하다.
```java
public class Application {
public static void main(String[] args) {
@@ -453,6 +507,8 @@ public class StationRepository {
}
```
+
+
## 📈 진행 요구사항
diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java
index 0bcf786cc..47c9184e7 100644
--- a/src/main/java/subway/Application.java
+++ b/src/main/java/subway/Application.java
@@ -6,5 +6,7 @@ public class Application {
public static void main(String[] args) {
final Scanner scanner = new Scanner(System.in);
// TODO: 프로그램 구현
+ SubwayMap subway = new SubwayMap();
+ subway.run(scanner);
}
}
diff --git a/src/main/java/subway/SubwayMap.java b/src/main/java/subway/SubwayMap.java
new file mode 100644
index 000000000..a8fa2c849
--- /dev/null
+++ b/src/main/java/subway/SubwayMap.java
@@ -0,0 +1,36 @@
+package subway;
+
+import subway.domain.Line;
+import subway.domain.LineRepository;
+import subway.domain.Station;
+import subway.domain.StationRepository;
+import subway.manager.MainManager;
+import subway.utils.InitLine;
+import subway.utils.InitStation;
+import subway.view.Input;
+import java.util.Arrays;
+import java.util.Scanner;
+
+public class SubwayMap {
+
+ public void run(Scanner scanner) {
+ init(scanner);
+ MainManager.run();
+ }
+
+ private void init(Scanner scanner) {
+ Input.init(scanner);
+ initStations();
+ initLines();
+ }
+
+ private void initStations() {
+ Arrays.stream(InitStation.values())
+ .forEach(station -> StationRepository.addStation(new Station(station.name())));
+ }
+
+ private void initLines() {
+ Arrays.stream(InitLine.values())
+ .forEach(line -> LineRepository.addLine(new Line(line.getName())));
+ }
+}
diff --git a/src/main/java/subway/controller/LineController.java b/src/main/java/subway/controller/LineController.java
new file mode 100644
index 000000000..a5ae052c3
--- /dev/null
+++ b/src/main/java/subway/controller/LineController.java
@@ -0,0 +1,43 @@
+package subway.controller;
+
+import subway.domain.Line;
+import subway.service.LineService;
+import subway.view.Input;
+import subway.view.Output;
+
+public class LineController {
+
+ private LineController() {
+ }
+
+ public void save() {
+ try {
+ LineService.save(new Line(Input.input(Input.PLEASE_INPUT_LINE_NAME)));
+ } catch (IllegalArgumentException e) {
+ Output.printNewLine();
+ System.out.println(e.getMessage());
+ }
+ }
+
+ public void remove() {
+ try {
+ LineService.remove(Input.input(Input.PLEASE_INPUT_REMOVE_LINE_NAME));
+ } catch (IllegalArgumentException e) {
+ Output.printNewLine();
+ System.out.println(e.getMessage());
+ }
+ }
+
+ public void getList() {
+ Output.print(Output.LINE_LIST);
+ Output.printByList(LineService.getAllLines());
+ }
+
+ public static LineController getInstance() {
+ return LineController.LazyHolder.INSTANCE;
+ }
+
+ private static class LazyHolder {
+ private static final LineController INSTANCE = new LineController();
+ }
+}
diff --git a/src/main/java/subway/controller/SectionController.java b/src/main/java/subway/controller/SectionController.java
new file mode 100644
index 000000000..121fe4143
--- /dev/null
+++ b/src/main/java/subway/controller/SectionController.java
@@ -0,0 +1,21 @@
+package subway.controller;
+
+public class SectionController {
+
+ private SectionController () {
+ }
+
+ public void save() {
+ }
+
+ public void remove() {
+ }
+
+ public static SectionController getInstance() {
+ return SectionController.LazyHolder.INSTANCE;
+ }
+
+ private static class LazyHolder {
+ private static final SectionController INSTANCE = new SectionController();
+ }
+}
diff --git a/src/main/java/subway/controller/StationController.java b/src/main/java/subway/controller/StationController.java
new file mode 100644
index 000000000..60523fd74
--- /dev/null
+++ b/src/main/java/subway/controller/StationController.java
@@ -0,0 +1,44 @@
+package subway.controller;
+
+import subway.domain.Station;
+import subway.service.StationService;
+import subway.view.Input;
+import subway.view.Output;
+
+public class StationController {
+
+ private StationController() {
+ }
+
+ public void save() {
+ try {
+ StationService.save(new Station(Input.input(Input.PLEASE_INPUT_STATION_NAME)));
+ } catch (IllegalArgumentException e) {
+ Output.printNewLine();
+ System.out.println(e.getMessage());
+ }
+ }
+
+ public void remove() {
+ try {
+ Output.printNewLine();
+ StationService.remove(Input.input(Input.PLEASE_INPUT_REMOVE_STATION_NAME));
+ } catch (IllegalArgumentException e) {
+ Output.printNewLine();
+ System.out.println(e.getMessage());
+ }
+ }
+
+ public void getList() {
+ Output.print(Output.STATION_LIST);
+ Output.printByList(StationService.getAllStations());
+ }
+
+ public static StationController getInstance() {
+ return LazyHolder.INSTANCE;
+ }
+
+ private static class LazyHolder {
+ private static final StationController INSTANCE = new StationController();
+ }
+}
diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java
index f4d738d5a..e3b19daec 100644
--- a/src/main/java/subway/domain/Line.java
+++ b/src/main/java/subway/domain/Line.java
@@ -1,7 +1,13 @@
package subway.domain;
+import subway.exception.TerminalNamesOverlapException;
+import subway.service.StationService;
+import subway.view.Input;
+
public class Line {
private String name;
+ private Station upwardTerminalStation;
+ private Station downTerminalStation;
public Line(String name) {
this.name = name;
@@ -12,4 +18,23 @@ public String getName() {
}
// 추가 기능 구현
+ public void initTerminalStations() {
+ Station upwardTerminalStation = StationService.isExists(
+ Input.input(Input.PLEASE_INPUT_UPWARD_TERMINAL_STATION_NAME));
+
+ Station downTerminalStation = StationService.isExists(
+ Input.input(Input.PLEASE_INPUT_DOWN_TERMINAL_STATION_NAME));
+
+ if (upwardTerminalStation.equals(downTerminalStation)) {
+ throw new TerminalNamesOverlapException();
+ }
+
+ this.upwardTerminalStation = upwardTerminalStation;
+ this.downTerminalStation = downTerminalStation;
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
}
diff --git a/src/main/java/subway/domain/LineRepository.java b/src/main/java/subway/domain/LineRepository.java
index 49132ddb6..6eedfee98 100644
--- a/src/main/java/subway/domain/LineRepository.java
+++ b/src/main/java/subway/domain/LineRepository.java
@@ -4,6 +4,7 @@
import java.util.Collections;
import java.util.List;
import java.util.Objects;
+import java.util.Optional;
public class LineRepository {
private static final List lines = new ArrayList<>();
@@ -19,4 +20,10 @@ public static void addLine(Line line) {
public static boolean deleteLineByName(String name) {
return lines.removeIf(line -> Objects.equals(line.getName(), name));
}
+
+ public static Optional findByName(String name) {
+ return lines().stream()
+ .filter(line -> line.getName().equals(name))
+ .findFirst();
+ }
}
diff --git a/src/main/java/subway/domain/Station.java b/src/main/java/subway/domain/Station.java
index bdb142590..bc2dac960 100644
--- a/src/main/java/subway/domain/Station.java
+++ b/src/main/java/subway/domain/Station.java
@@ -12,4 +12,24 @@ public String getName() {
}
// 추가 기능 구현
+
+ @Override
+ public String toString() {
+ return name;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ Station station = (Station) o;
+
+ return name != null ? name.equals(station.name) : station.name == null;
+ }
+
+ @Override
+ public int hashCode() {
+ return name != null ? name.hashCode() : 0;
+ }
}
diff --git a/src/main/java/subway/domain/StationRepository.java b/src/main/java/subway/domain/StationRepository.java
index b7245c0f3..678875394 100644
--- a/src/main/java/subway/domain/StationRepository.java
+++ b/src/main/java/subway/domain/StationRepository.java
@@ -4,6 +4,7 @@
import java.util.Collections;
import java.util.List;
import java.util.Objects;
+import java.util.Optional;
public class StationRepository {
private static final List stations = new ArrayList<>();
@@ -19,4 +20,10 @@ public static void addStation(Station station) {
public static boolean deleteStation(String name) {
return stations.removeIf(station -> Objects.equals(station.getName(), name));
}
+
+ public static Optional findByName(String name) {
+ return stations().stream()
+ .filter(station -> station.getName().equals(name))
+ .findFirst();
+ }
}
diff --git a/src/main/java/subway/exception/LineNameDuplicateException.java b/src/main/java/subway/exception/LineNameDuplicateException.java
new file mode 100644
index 000000000..9ba3ec58e
--- /dev/null
+++ b/src/main/java/subway/exception/LineNameDuplicateException.java
@@ -0,0 +1,9 @@
+package subway.exception;
+
+public class LineNameDuplicateException extends IllegalArgumentException {
+ private static final String message = "[ERROR] 이미 등록된 노선 이름입니다.";
+
+ public LineNameDuplicateException() {
+ super(message);
+ }
+}
diff --git a/src/main/java/subway/exception/LineNameNotFoundException.java b/src/main/java/subway/exception/LineNameNotFoundException.java
new file mode 100644
index 000000000..35a36eeba
--- /dev/null
+++ b/src/main/java/subway/exception/LineNameNotFoundException.java
@@ -0,0 +1,9 @@
+package subway.exception;
+
+public class LineNameNotFoundException extends IllegalArgumentException {
+ private static final String message = "[ERROR] 등록 되어 있지 않은 노선입니다.";
+
+ public LineNameNotFoundException() {
+ super(message);
+ }
+}
diff --git a/src/main/java/subway/exception/NameLengthException.java b/src/main/java/subway/exception/NameLengthException.java
new file mode 100644
index 000000000..cfa94241f
--- /dev/null
+++ b/src/main/java/subway/exception/NameLengthException.java
@@ -0,0 +1,9 @@
+package subway.exception;
+
+public class NameLengthException extends IllegalArgumentException {
+ private static final String message = "[ERROR] 이름은 2글자 이상입니다.";
+
+ public NameLengthException() {
+ super(message);
+ }
+}
diff --git a/src/main/java/subway/exception/StationNameDuplicateException.java b/src/main/java/subway/exception/StationNameDuplicateException.java
new file mode 100644
index 000000000..a6982389b
--- /dev/null
+++ b/src/main/java/subway/exception/StationNameDuplicateException.java
@@ -0,0 +1,9 @@
+package subway.exception;
+
+public class StationNameDuplicateException extends IllegalArgumentException{
+ private static final String message = "[ERROR] 이미 등록된 역 이름입니다.";
+
+ public StationNameDuplicateException() {
+ super(message);
+ }
+}
diff --git a/src/main/java/subway/exception/StationNameNotFoundException.java b/src/main/java/subway/exception/StationNameNotFoundException.java
new file mode 100644
index 000000000..ccd96ba06
--- /dev/null
+++ b/src/main/java/subway/exception/StationNameNotFoundException.java
@@ -0,0 +1,9 @@
+package subway.exception;
+
+public class StationNameNotFoundException extends IllegalArgumentException {
+ private static final String message = "[ERROR] 등록 되어 있지 않은 역입니다.";
+
+ public StationNameNotFoundException() {
+ super(message);
+ }
+}
diff --git a/src/main/java/subway/exception/TerminalNamesOverlapException.java b/src/main/java/subway/exception/TerminalNamesOverlapException.java
new file mode 100644
index 000000000..1556735d0
--- /dev/null
+++ b/src/main/java/subway/exception/TerminalNamesOverlapException.java
@@ -0,0 +1,9 @@
+package subway.exception;
+
+public class TerminalNamesOverlapException extends IllegalArgumentException {
+ private static final String message = "[ERROR] 하행 종점과 상행 종점이 같은 역입니다.";
+
+ public TerminalNamesOverlapException() {
+ super(message);
+ }
+}
diff --git a/src/main/java/subway/manager/LineManager.java b/src/main/java/subway/manager/LineManager.java
new file mode 100644
index 000000000..23cc62e0a
--- /dev/null
+++ b/src/main/java/subway/manager/LineManager.java
@@ -0,0 +1,26 @@
+package subway.manager;
+
+import subway.controller.LineController;
+import subway.manager.menu.LineMenu;
+import subway.view.Input;
+import subway.view.Output;
+
+public class LineManager {
+
+ public static void run() {
+ do {
+ LineMenu.initMenuStatus();
+ LineMenu.printMenu();
+ chooseMenu().execute(LineController.getInstance());
+ } while (LineMenu.isRestart());
+ }
+
+ private static LineMenu chooseMenu() {
+ try {
+ return LineMenu.getLineMenuType(Input.input(Input.CHOOSE_FUNCTION));
+ } catch (IllegalArgumentException e) {
+ Output.print(e.getMessage());
+ return chooseMenu();
+ }
+ }
+}
diff --git a/src/main/java/subway/manager/MainManager.java b/src/main/java/subway/manager/MainManager.java
new file mode 100644
index 000000000..5b16a3908
--- /dev/null
+++ b/src/main/java/subway/manager/MainManager.java
@@ -0,0 +1,27 @@
+package subway.manager;
+
+import subway.view.Input;
+import subway.manager.menu.MainMenu;
+import subway.view.Output;
+
+public class MainManager {
+
+ private MainManager() {
+ }
+
+ public static void run() {
+ do {
+ MainMenu.printMenu();
+ chooseMenu().execute();
+ } while (MainMenu.isExit());
+ }
+
+ private static MainMenu chooseMenu() {
+ try {
+ return MainMenu.getMainMenuType(Input.input(Input.CHOOSE_FUNCTION));
+ } catch (IllegalArgumentException e) {
+ Output.print(e.getMessage());
+ return chooseMenu();
+ }
+ }
+}
diff --git a/src/main/java/subway/manager/SectionManager.java b/src/main/java/subway/manager/SectionManager.java
new file mode 100644
index 000000000..4b59593f6
--- /dev/null
+++ b/src/main/java/subway/manager/SectionManager.java
@@ -0,0 +1,27 @@
+package subway.manager;
+
+import subway.controller.SectionController;
+import subway.manager.menu.LineMenu;
+import subway.manager.menu.SectionMenu;
+import subway.view.Input;
+import subway.view.Output;
+
+public class SectionManager {
+
+ public static void run() {
+ do {
+ SectionMenu.initMenuStatus();
+ SectionMenu.printMenu();
+ chooseMenu().execute(SectionController.getInstance());
+ } while (SectionMenu.isRestart());
+ }
+
+ private static SectionMenu chooseMenu() {
+ try {
+ return SectionMenu.getSectionMenuType(Input.input(Input.CHOOSE_FUNCTION));
+ } catch (IllegalArgumentException e) {
+ Output.print(e.getMessage());
+ return chooseMenu();
+ }
+ }
+}
diff --git a/src/main/java/subway/manager/StationManager.java b/src/main/java/subway/manager/StationManager.java
new file mode 100644
index 000000000..994789902
--- /dev/null
+++ b/src/main/java/subway/manager/StationManager.java
@@ -0,0 +1,26 @@
+package subway.manager;
+
+import subway.controller.StationController;
+import subway.view.Input;
+import subway.view.Output;
+import subway.manager.menu.StationMenu;
+
+public class StationManager {
+
+ public static void run() {
+ do {
+ StationMenu.initMenuStatus();
+ StationMenu.printMenu();
+ chooseMenu().execute(StationController.getInstance());
+ } while (StationMenu.isRestart());
+ }
+
+ private static StationMenu chooseMenu() {
+ try {
+ return StationMenu.getStationMenuType(Input.input(Input.CHOOSE_FUNCTION));
+ } catch (IllegalArgumentException e) {
+ Output.print(e.getMessage());
+ return chooseMenu();
+ }
+ }
+}
diff --git a/src/main/java/subway/manager/menu/LineMenu.java b/src/main/java/subway/manager/menu/LineMenu.java
new file mode 100644
index 000000000..a537ac42c
--- /dev/null
+++ b/src/main/java/subway/manager/menu/LineMenu.java
@@ -0,0 +1,60 @@
+package subway.manager.menu;
+
+import subway.controller.LineController;
+import subway.view.Output;
+import java.util.Arrays;
+import java.util.function.Consumer;
+
+public enum LineMenu {
+ ADD("1", "1. 노선 등록", LineController::save),
+ REMOVE("2", "2. 노선 삭제", LineController::remove),
+ MANAGEMENT("3", "3. 노선 조회", LineController::getList),
+ BACK("B", "B. 돌아가기", (LineController) -> LineMenu.goBackMenu());
+
+ private static final String menu = "## 노선 관리 화면";
+ private static boolean restart = true;
+ private String number;
+ private String name;
+ private Consumer nextAction;
+
+
+ LineMenu(String number, String name, Consumer nextAction) {
+ this.number = number;
+ this.name = name;
+ this.nextAction = nextAction;
+ }
+
+ public static void printMenu() {
+ Output.print(menu);
+ Arrays.stream(LineMenu.values())
+ .forEach(System.out::println);
+ }
+
+ public static LineMenu getLineMenuType(String selectMenu) {
+ return Arrays.stream(LineMenu.values())
+ .filter(lineMenu -> lineMenu.number.equals(selectMenu))
+ .findFirst()
+ .orElseThrow(() -> new IllegalArgumentException("[ERROR] 선택할 수 없는 기능입니다."));
+ }
+
+ public void execute(LineController lineController) {
+ nextAction.accept(lineController);
+ }
+
+ public static void initMenuStatus() {
+ restart = true;
+ }
+
+ private static void goBackMenu() {
+ restart = false;
+ }
+
+ public static boolean isRestart() {
+ return restart;
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+}
diff --git a/src/main/java/subway/manager/menu/MainMenu.java b/src/main/java/subway/manager/menu/MainMenu.java
new file mode 100644
index 000000000..5a80ad541
--- /dev/null
+++ b/src/main/java/subway/manager/menu/MainMenu.java
@@ -0,0 +1,58 @@
+package subway.manager.menu;
+
+import subway.manager.LineManager;
+import subway.manager.RouteMapManager;
+import subway.manager.SectionManager;
+import subway.manager.StationManager;
+import subway.view.Output;
+import java.util.Arrays;
+
+public enum MainMenu {
+ STATION_MENU("1", "1. 역 관리", StationManager::run),
+ LINE_MENU("2", "2. 노선 관리", LineManager::run),
+ SECTION_MENU("3", "3. 구간 관리", SectionManager::run),
+ ROUTE_MAP_MENU("4", "4. 지하철 노선도 출력", RouteMapManager::run),
+ EXIT("Q", "Q. 종료", MainMenu::exitGame);
+
+ private static final String menu = "## 메인 화면";
+ private static boolean gameExit = true;
+ private String number;
+ private String name;
+ private Runnable nextAction;
+
+ MainMenu(String number, String name, Runnable nextAction) {
+ this.number = number;
+ this.name = name;
+ this.nextAction = nextAction;
+ }
+
+ public static void printMenu() {
+ Output.print(menu);
+ Arrays.stream(MainMenu.values())
+ .forEach(System.out::println);
+ }
+
+ public static MainMenu getMainMenuType(String selectMenu) {
+ return Arrays.stream(MainMenu.values())
+ .filter(mainMenu -> mainMenu.number.equals(selectMenu))
+ .findFirst()
+ .orElseThrow(() -> new IllegalArgumentException("[ERROR] 선택할 수 없는 기능입니다."));
+ }
+
+ private static void exitGame() {
+ gameExit = false;
+ }
+
+ public void execute() {
+ nextAction.run();
+ }
+
+ public static boolean isExit() {
+ return gameExit;
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+}
diff --git a/src/main/java/subway/manager/menu/SectionMenu.java b/src/main/java/subway/manager/menu/SectionMenu.java
new file mode 100644
index 000000000..6361cac34
--- /dev/null
+++ b/src/main/java/subway/manager/menu/SectionMenu.java
@@ -0,0 +1,58 @@
+package subway.manager.menu;
+
+import subway.controller.SectionController;
+import subway.view.Output;
+import java.util.Arrays;
+import java.util.function.Consumer;
+
+public enum SectionMenu {
+ ADD("1", "1. 구간 등록", SectionController::save),
+ REMOVE("2", "2. 구간 삭제", SectionController::remove),
+ BACK("B", "B. 돌아가기", (sectionController) -> SectionMenu.goBackMenu());
+
+ private static final String menu = "## 구간 관리 화면";
+ private static boolean restart = true;
+ private String number;
+ private String name;
+ private Consumer nextAction;
+
+ SectionMenu(String number, String name, Consumer nextAction) {
+ this.number = number;
+ this.name = name;
+ this.nextAction = nextAction;
+ }
+
+ public static void printMenu() {
+ Output.print(menu);
+ Arrays.stream(SectionMenu.values())
+ .forEach(System.out::println);
+ }
+
+ public static SectionMenu getSectionMenuType(String selectMenu) {
+ return Arrays.stream(SectionMenu.values())
+ .filter(SectionMenu -> SectionMenu.number.equals(selectMenu))
+ .findFirst()
+ .orElseThrow(() -> new IllegalArgumentException("[ERROR] 선택할 수 없는 기능입니다."));
+ }
+
+ public void execute(SectionController sectionController) {
+ nextAction.accept(sectionController);
+ }
+
+ public static void initMenuStatus() {
+ restart = true;
+ }
+
+ private static void goBackMenu() {
+ restart = false;
+ }
+
+ public static boolean isRestart() {
+ return restart;
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+}
diff --git a/src/main/java/subway/manager/menu/StationMenu.java b/src/main/java/subway/manager/menu/StationMenu.java
new file mode 100644
index 000000000..50b133f9a
--- /dev/null
+++ b/src/main/java/subway/manager/menu/StationMenu.java
@@ -0,0 +1,59 @@
+package subway.manager.menu;
+
+import subway.controller.StationController;
+import subway.view.Output;
+import java.util.Arrays;
+import java.util.function.Consumer;
+
+public enum StationMenu {
+ ADD("1", "1. 역 등록", StationController::save),
+ REMOVE("2", "2. 역 삭제", StationController::remove),
+ MANAGEMENT("3", "3. 역 조회", StationController::getList),
+ BACK("B", "B. 돌아가기", (StationController) -> goBackMenu());
+
+ private static final String menu = "## 역 관리 화면";
+ private static boolean restart = true;
+ private String number;
+ private String name;
+ private Consumer nextAction;
+
+ StationMenu(String number, String name, Consumer nextAction) {
+ this.number = number;
+ this.name = name;
+ this.nextAction = nextAction;
+ }
+
+ public static void printMenu() {
+ Output.print(menu);
+ Arrays.stream(StationMenu.values())
+ .forEach(System.out::println);
+ }
+
+ public static StationMenu getStationMenuType(String selectMenu) {
+ return Arrays.stream(StationMenu.values())
+ .filter(stationMenu -> stationMenu.number.equals(selectMenu))
+ .findFirst()
+ .orElseThrow(() -> new IllegalArgumentException("[ERROR] 선택할 수 없는 기능입니다."));
+ }
+
+ public void execute(StationController stationController) {
+ nextAction.accept(stationController);
+ }
+
+ public static void initMenuStatus() {
+ restart = true;
+ }
+
+ private static void goBackMenu() {
+ restart = false;
+ }
+
+ public static boolean isRestart() {
+ return restart;
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+}
diff --git a/src/main/java/subway/service/LineService.java b/src/main/java/subway/service/LineService.java
new file mode 100644
index 000000000..66fd79aaa
--- /dev/null
+++ b/src/main/java/subway/service/LineService.java
@@ -0,0 +1,45 @@
+package subway.service;
+
+import subway.domain.Line;
+import subway.domain.LineRepository;
+import subway.exception.LineNameDuplicateException;
+import subway.exception.LineNameNotFoundException;
+import subway.exception.NameLengthException;
+import java.util.List;
+
+public class LineService {
+ private static final int MIN_NAME_LENGTH = 2;
+
+ public static void save(Line line) {
+ validateNameLength(line.getName());
+ validateDuplicateName(line.getName());
+ line.initTerminalStations();
+ LineRepository.addLine(line);
+ }
+
+ public static void remove(String name) {
+ validateNameLength(name);
+ LineRepository.deleteLineByName(isExists(name).getName());
+ }
+
+ public static Line isExists(String name) {
+ return LineRepository.findByName(name)
+ .orElseThrow(LineNameNotFoundException::new);
+ }
+
+ private static void validateNameLength(String name) {
+ if (name.length() < MIN_NAME_LENGTH) {
+ throw new NameLengthException();
+ }
+ }
+
+ private static void validateDuplicateName(String name) {
+ if (LineRepository.findByName(name).isPresent()) {
+ throw new LineNameDuplicateException();
+ }
+ }
+
+ public static List getAllLines() {
+ return LineRepository.lines();
+ }
+}
diff --git a/src/main/java/subway/service/StationService.java b/src/main/java/subway/service/StationService.java
new file mode 100644
index 000000000..aac66d08e
--- /dev/null
+++ b/src/main/java/subway/service/StationService.java
@@ -0,0 +1,44 @@
+package subway.service;
+
+import subway.domain.Station;
+import subway.domain.StationRepository;
+import subway.exception.NameLengthException;
+import subway.exception.StationNameDuplicateException;
+import subway.exception.StationNameNotFoundException;
+import java.util.List;
+
+public class StationService {
+ private static final int MIN_NAME_LENGTH = 2;
+
+ public static void save(Station station) {
+ validateNameLength(station.getName());
+ validateDuplicateName(station.getName());
+ StationRepository.addStation(station);
+ }
+
+ public static void remove(String name) {
+ validateNameLength(name);
+ StationRepository.deleteStation(isExists(name).getName());
+ }
+
+ public static Station isExists(String name) {
+ return StationRepository.findByName(name)
+ .orElseThrow(StationNameNotFoundException::new);
+ }
+
+ private static void validateNameLength(String name) {
+ if (name.length() < MIN_NAME_LENGTH) {
+ throw new NameLengthException();
+ }
+ }
+
+ private static void validateDuplicateName(String name) {
+ if (StationRepository.findByName(name).isPresent()) {
+ throw new StationNameDuplicateException();
+ }
+ }
+
+ public static List getAllStations() {
+ return StationRepository.stations();
+ }
+}
diff --git a/src/main/java/subway/utils/InitLine.java b/src/main/java/subway/utils/InitLine.java
new file mode 100644
index 000000000..e18734654
--- /dev/null
+++ b/src/main/java/subway/utils/InitLine.java
@@ -0,0 +1,15 @@
+package subway.utils;
+
+public enum InitLine {
+ LINE2("2호선"), LINE3("3호선"), SINBUNDANG("신분당선");
+
+ private String name;
+
+ InitLine(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+}
diff --git a/src/main/java/subway/utils/InitStation.java b/src/main/java/subway/utils/InitStation.java
new file mode 100644
index 000000000..b29e2a2d7
--- /dev/null
+++ b/src/main/java/subway/utils/InitStation.java
@@ -0,0 +1,5 @@
+package subway.utils;
+
+public enum InitStation {
+ 교대역, 강남역, 역삼역, 남부터미널역, 양재역, 양재시민의숲역, 매봉역
+}
diff --git a/src/main/java/subway/view/Input.java b/src/main/java/subway/view/Input.java
new file mode 100644
index 000000000..f90f47ae3
--- /dev/null
+++ b/src/main/java/subway/view/Input.java
@@ -0,0 +1,30 @@
+package subway.view;
+
+import java.util.Scanner;
+
+public class Input {
+ private static Scanner scanner;
+
+ public static final String CHOOSE_FUNCTION = "## 원하는 기능을 선택하세요.";
+ public static final String PLEASE_INPUT_STATION_NAME = "## 등록할 역 이름을 입력하세요.";
+ public static final String PLEASE_INPUT_REMOVE_STATION_NAME = "## 삭제할 역 이름을 입력하세요.";
+ public static final String PLEASE_INPUT_LINE_NAME = "## 등록할 노선 이름을 입력하세요.";
+ public static final String PLEASE_INPUT_UPWARD_TERMINAL_STATION_NAME = "## 등록할 노선의 상행 종점역 이름을 입력하세요.";
+ public static final String PLEASE_INPUT_DOWN_TERMINAL_STATION_NAME = "## 등록할 노선의 하행 종점역 이름을 입력하세요.";
+ public static final String PLEASE_INPUT_REMOVE_LINE_NAME = "## 삭제할 노션 이름을 입력하세요.";
+
+ private Input() {
+ }
+
+ public static void init(Scanner scanner) {
+ if (Input.scanner == null) {
+ Input.scanner = scanner;
+ }
+ }
+
+ public static String input(String message) {
+ Output.printNewLine();
+ System.out.println(message);
+ return Input.scanner.nextLine();
+ }
+}
diff --git a/src/main/java/subway/view/Output.java b/src/main/java/subway/view/Output.java
new file mode 100644
index 000000000..dedec4908
--- /dev/null
+++ b/src/main/java/subway/view/Output.java
@@ -0,0 +1,26 @@
+package subway.view;
+
+import java.util.List;
+
+public class Output {
+
+ private static final String INFO_MESSAGE = "[INFO] %s\n";
+ public static final String STATION_LIST = "## 역 목록";
+ public static final String LINE_LIST = "## 역 노선";
+
+ private Output() {
+ }
+
+ public static void print(String message) {
+ printNewLine();
+ System.out.println(message);
+ }
+
+ public static void printByList(List> list) {
+ list.forEach(obj -> System.out.printf(INFO_MESSAGE, obj));
+ }
+
+ public static void printNewLine() {
+ System.out.println();
+ }
+}