diff --git a/README.md b/README.md
index 00410ae50..929d63475 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,58 @@
+
+# 기능구현 목록
+
+- 상수 관리 클래스
+
+### View
+- 입력 클래스
+ - [x] 기능 선택 입력 함수
+ - [x] 메인뷰 입력함수
+ - [x] 기능뷰 입력함수
+
+- 출력 클래스
+ - [x] 메인 화면 출력 함수
+ - [x] 역, 노선, 구간 관리 화면 출력함수
+ - [x] 선택한 기능 질문 출력함수
+ - [x] 기능결과(INFO) 출력함수
+ - [x] 에러 출력함수
+ - [ ] 지하철 노선도 출력함수
+
+### 비즈니스 로직
+- 역 관리
+ - 역 등록
+ - [x] 중복된 이름 불가
+ - [x] 이름은 2글자 이상
+ - 역 삭제
+ - [ ] 노선에 등록된 역은 삭제 불가
+ - [x] 역 조회
+
+- 노선 관리
+ - 노선 등록
+ - [x] 중복 이름 불가
+ - [x] 이름은 2글자 이상
+ - [ ] 상,하 종점역은 달라야 한다
+ - [x] 노선 삭제
+ - [x] 노선 조회
+
+- 구간 관리
+ - 구간 등록
+ - [ ] 등록되어 있는 노선인지 확인
+ - [ ] 등록된 역인지 확인
+ - [ ] 입력받은 순서가 올바른 순서인지 확인
+ - 구간 삭제
+ - [ ] 등록된 노선인지 확인
+ - [ ] 노선에 등록된 역인지 확인
+
+
+- 지하철 노선도 출력
+ - [ ] 노선이 없을 경우 None 출력
+
+
# 지하철 노선도 미션
- 지하철 역과 노선을 관리하는 지하철 노선도 기능을 구현한다.
+
+
## 🚀 기능 요구사항
diff --git a/src/main/java/Utils/Validator.java b/src/main/java/Utils/Validator.java
new file mode 100644
index 000000000..abcea7952
--- /dev/null
+++ b/src/main/java/Utils/Validator.java
@@ -0,0 +1,14 @@
+package Utils;
+
+import subway.Constant;
+
+import java.util.IllformedLocaleException;
+
+public class Validator {
+
+ public static void checkDataLength(String data){
+ if(data.length() < Constant.MINIMUM_LENGTH){
+ throw new IllegalArgumentException(Constant.ILLEGAL_ARGUMENT_EXCEPTION_MINIMUM_LENGTH);
+ }
+ }
+}
diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java
index 0bcf786cc..d6349ac8d 100644
--- a/src/main/java/subway/Application.java
+++ b/src/main/java/subway/Application.java
@@ -1,10 +1,14 @@
package subway;
+import subway.domain.SubwayMap;
+
import java.util.Scanner;
public class Application {
public static void main(String[] args) {
final Scanner scanner = new Scanner(System.in);
// TODO: 프로그램 구현
+
+ new SubwayMap(scanner); /**프로그램 시작*/
}
}
diff --git a/src/main/java/subway/Constant.java b/src/main/java/subway/Constant.java
new file mode 100644
index 000000000..99b3cf679
--- /dev/null
+++ b/src/main/java/subway/Constant.java
@@ -0,0 +1,39 @@
+package subway;
+
+public class Constant {
+
+ public static final String VIEW_HEADER = "## ";
+ public static final String VIEW_FORMAT = "%s. %s\n";
+ public static final String MAIN_VIEW_HEADER = "메인 화면";
+ public static final String STATION_LIST_HEADER = "역 목록";
+ public static final String LINE_LIST_HEADER = "노선 목록";
+ public static final String RESULT_HEADER = "[INFO] ";
+ public static final String ILLEGAL_ARGUMENT_EXCEPTION_HEADER = "[ERROR] ";
+ public static final String BACK_KEY = "B";
+ public static final int MINIMUM_LENGTH = 2;
+
+ public static final String ASKING_FUNCTION_INPUT_FUNCTION_ORDER = "원하는 기능을 선택하세요.";
+
+ public static final String INPUT_DATA_REGISTER_FORMAT = "등록할 %s 이름을 입력하세요.\n";
+ public static final String INPUT_DATA_DELETE_FORMAT = "삭제할 %s 이름을 입력하세요.\n";
+
+ public static final String INPUT_SECTION_LINE_DATA_REGISTER_FORMAT = "노선을 입력하세요.\n";
+ public static final String INPUT_SECTION_LINE_DATA_DELETE_FORMAT = "삭제할 구간의 노선을 입력하세요.\n";
+ public static final String INPUT_SECTION_STATION_DATA_REGISTER_FORMAT = "역 이름을 입력하세요.\n";
+ public static final String INPUT_SECTION_STATION_DATA_DELETE_FORMAT = "삭제할 구간의 역을 입력하세요.\n";
+
+ public static final String MANAGEMENT_VIEW_HEADER_FORMAT = "%s 관리 화면\n";
+ public static final String MANAGEMENT_VIEW_BODY_FORMAT = "%s. %s %s\n";
+ public static final String MANAGEMENT_VIEW_BODY_BACK_FORMAT = "%s. %s\n";
+
+ public static final String ILLEGAL_ARGUMENT_EXCEPTION_INVALID_MENU_ORDER = "선택할 수 없는 기능입니다.";
+ public static final String ILLEGAL_ARGUMENT_EXCEPTION_MINIMUM_LENGTH = "이름은 "+MINIMUM_LENGTH+" 글자 이상입니다.";
+
+ public static final String REGISTER_DUPLICATE_DATA_ERROR_FORMAT = "이미 등록된 %s 이름입니다.";
+ public static final String REGISTER_RESULT_FORMAT = "%s이 등록되었습니다.";
+ public static final String DELETE_DATA_ERROR_FORMAT = "등록되지 않은 %s 이름입니다.";
+ public static final String DELETE_RESULT_FORMAT = "%s이 삭제되었습니다.";
+
+ public static final String FIND_EMPTY_LIST = "등록된 %s이 없습니다.";
+
+}
diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java
deleted file mode 100644
index f4d738d5a..000000000
--- a/src/main/java/subway/domain/Line.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package subway.domain;
-
-public class Line {
- private String name;
-
- public Line(String name) {
- this.name = name;
- }
-
- public String getName() {
- return name;
- }
-
- // 추가 기능 구현
-}
diff --git a/src/main/java/subway/domain/Services.java b/src/main/java/subway/domain/Services.java
new file mode 100644
index 000000000..2c0213063
--- /dev/null
+++ b/src/main/java/subway/domain/Services.java
@@ -0,0 +1,32 @@
+package subway.domain;
+
+import subway.domain.management.LineManager;
+import subway.domain.management.SectionManager;
+import subway.domain.menu.MainMenu;
+import subway.domain.management.StationManager;
+
+import java.util.Scanner;
+
+public class Services {
+
+ public static void doService(String inputData, Scanner scanner) {
+ if (inputData.equals(MainMenu.STATION.getOrder())) {
+ StationManager stationManager = new StationManager(scanner);
+ stationManager.doStationManagement();
+ return;
+ }
+ if (inputData.equals(MainMenu.LINE.getOrder())) {
+ LineManager lineManager = new LineManager(scanner);
+ lineManager.doStationManagement();
+ return;
+ }
+ if (inputData.equals(MainMenu.SECTION.getOrder())) {
+ SectionManager sectionManager = new SectionManager(scanner);
+ sectionManager.doStationManagement();
+ return;
+ }
+ if (inputData.equals(MainMenu.MAP.getOrder())) {
+
+ }
+ }
+}
diff --git a/src/main/java/subway/domain/SubwayMap.java b/src/main/java/subway/domain/SubwayMap.java
new file mode 100644
index 000000000..fc22c7248
--- /dev/null
+++ b/src/main/java/subway/domain/SubwayMap.java
@@ -0,0 +1,69 @@
+package subway.domain;
+
+import subway.Constant;
+import subway.domain.data.Line;
+import subway.domain.data.LineRepository;
+import subway.domain.data.Station;
+import subway.domain.data.StationRepository;
+import subway.domain.menu.MainMenu;
+import subway.view.InputView;
+import subway.view.OutputView;
+
+import java.util.Scanner;
+
+public class SubwayMap {
+
+ private Scanner scanner;
+ private LineRepository lineRepository;
+ private StationRepository stationRepository;
+
+ public SubwayMap(Scanner scanner) {
+ this.scanner = scanner;
+ initData();
+ startService();
+ }
+
+ private void initData() {
+ initStation();
+ initLine();
+ }
+
+ private void initLine() {
+ String[] initLineData = {
+ "2호선", "3호선", "신분당선"};
+ for(String lineName : initLineData){
+ LineRepository.addLine(new Line(lineName));
+ }
+ }
+
+ private void initStation() {
+ String[] initStationData = {
+ "교대역", "강남역" ,"역삼역" ,"남부터미널역", "양재역", "양재시민의숲역", "매봉역"};
+ for(String stationName : initStationData){
+ StationRepository.addStation(new Station(stationName));
+ }
+ }
+
+ private void startService() {
+ while (true) {
+ OutputView.printMainView();
+ String inputData = selectService();
+ if (inputData.equals(MainMenu.END.getOrder())){
+ return;
+ }
+ Services.doService(inputData, scanner);
+ }
+ }
+
+ private String selectService() {
+ try {
+ OutputView.printAskingFunction(Constant.ASKING_FUNCTION_INPUT_FUNCTION_ORDER);
+ return InputView.inputMainMenu(scanner);
+ } catch (IllegalArgumentException e){
+ OutputView.printError(e.getMessage());
+ return selectService();
+ }
+ }
+
+
+}
diff --git a/src/main/java/subway/domain/data/Line.java b/src/main/java/subway/domain/data/Line.java
new file mode 100644
index 000000000..64d425e21
--- /dev/null
+++ b/src/main/java/subway/domain/data/Line.java
@@ -0,0 +1,47 @@
+package subway.domain.data;
+
+import java.util.List;
+import java.util.Objects;
+
+public class Line {
+ private String name;
+ private Station firstStation;
+ private Station lastStation;
+ private List stations;
+
+ public Line(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public Station getFirstStation() {
+ return firstStation;
+ }
+
+ public Station getLastStation() {
+ return lastStation;
+ }
+
+ public List getStations() {
+ return stations;
+ }
+
+ public void initLineSection(Station firstStation, Station lastStation, List stations){
+ this.firstStation = firstStation;
+ this.lastStation = lastStation;
+ this.stations = stations;
+ }
+
+ public void addSection(Station station, int position){
+
+ }
+
+ public boolean deleteSection(String name) {
+ return stations.removeIf(station -> Objects.equals(station.getName(), name));
+ }
+
+ // 추가 기능 구현
+}
diff --git a/src/main/java/subway/domain/LineRepository.java b/src/main/java/subway/domain/data/LineRepository.java
similarity index 94%
rename from src/main/java/subway/domain/LineRepository.java
rename to src/main/java/subway/domain/data/LineRepository.java
index 49132ddb6..4deb3332d 100644
--- a/src/main/java/subway/domain/LineRepository.java
+++ b/src/main/java/subway/domain/data/LineRepository.java
@@ -1,4 +1,4 @@
-package subway.domain;
+package subway.domain.data;
import java.util.ArrayList;
import java.util.Collections;
diff --git a/src/main/java/subway/domain/Station.java b/src/main/java/subway/domain/data/Station.java
similarity index 87%
rename from src/main/java/subway/domain/Station.java
rename to src/main/java/subway/domain/data/Station.java
index bdb142590..9d2e697a0 100644
--- a/src/main/java/subway/domain/Station.java
+++ b/src/main/java/subway/domain/data/Station.java
@@ -1,4 +1,4 @@
-package subway.domain;
+package subway.domain.data;
public class Station {
private String name;
diff --git a/src/main/java/subway/domain/StationRepository.java b/src/main/java/subway/domain/data/StationRepository.java
similarity index 95%
rename from src/main/java/subway/domain/StationRepository.java
rename to src/main/java/subway/domain/data/StationRepository.java
index b7245c0f3..a67636d3c 100644
--- a/src/main/java/subway/domain/StationRepository.java
+++ b/src/main/java/subway/domain/data/StationRepository.java
@@ -1,4 +1,4 @@
-package subway.domain;
+package subway.domain.data;
import java.util.ArrayList;
import java.util.Collections;
diff --git a/src/main/java/subway/domain/management/LineManager.java b/src/main/java/subway/domain/management/LineManager.java
new file mode 100644
index 000000000..9bd98024f
--- /dev/null
+++ b/src/main/java/subway/domain/management/LineManager.java
@@ -0,0 +1,100 @@
+package subway.domain.management;
+
+import subway.Constant;
+import subway.domain.data.Line;
+import subway.domain.data.LineRepository;
+import subway.domain.menu.ManagementMenu;
+import subway.domain.menu.ServiceList;
+import subway.view.InputView;
+import subway.view.OutputView;
+
+import java.util.Scanner;
+
+public class LineManager extends ServiceManager{
+
+ public LineManager(Scanner scanner) {
+ super(scanner);
+ }
+
+ @Override
+ public void doStationManagement() {
+ OutputView.printManagementView(ServiceList.LINE, menuList);
+ String inputData = getInputData(scanner);
+
+ try {
+ checkInputData(inputData);
+ } catch (IllegalArgumentException e){
+ OutputView.printError(e.getMessage());
+ doStationManagement();
+ }
+ }
+
+ private void checkInputData(String inputData) {
+ if(inputData.equals(ManagementMenu.REGISTER.getOrder())){
+ registerLine(ManagementMenu.REGISTER);
+ return;
+ }
+ if(inputData.equals(ManagementMenu.DELETE.getOrder())){
+ deleteLine(ManagementMenu.DELETE);
+ return;
+ }
+ if(inputData.equals(ManagementMenu.FIND.getOrder())){
+ findLine();
+ return;
+ }
+ }
+
+ private void registerLine(ManagementMenu menu) {
+ String name = getLineName(menu);
+
+ for(Line savedLine : LineRepository.lines()){
+ if(savedLine.getName().equals(name)){
+ OutputView.printErrorWithFormat(Constant.REGISTER_DUPLICATE_DATA_ERROR_FORMAT, ServiceList.LINE.getName());
+ return;
+ }
+ }
+
+ Line line = new Line(name);
+ LineRepository.addLine(line);
+ OutputView.printFunctionResult(Constant.REGISTER_RESULT_FORMAT, ServiceList.LINE.getName());
+ return;
+ }
+
+ private void deleteLine(ManagementMenu menu) {
+ String name = getLineName(menu);
+
+ for(Line savedLine : LineRepository.lines()){
+ if(savedLine.getName().equals(name)){
+ OutputView.printFunctionResult(Constant.DELETE_RESULT_FORMAT, ServiceList.LINE.getName());
+ LineRepository.deleteLineByName(name);
+ return;
+ }
+ }
+
+ OutputView.printErrorWithFormat(Constant.DELETE_DATA_ERROR_FORMAT, ServiceList.LINE.getName());
+ return;
+ }
+
+ private void findLine() {
+ OutputView.printLineList(LineRepository.lines(), ServiceList.LINE.getName());
+ }
+
+ private String getLineName(ManagementMenu menu) {
+ if(menu.equals(ManagementMenu.REGISTER)) {
+ OutputView.printInputData(Constant.INPUT_DATA_REGISTER_FORMAT, ServiceList.LINE.getName());
+ }
+ if(menu.equals(ManagementMenu.DELETE)) {
+ OutputView.printInputData(Constant.INPUT_DATA_DELETE_FORMAT, ServiceList.LINE.getName());
+ }
+ String data = InputView.inputData(scanner);
+ return data;
+ }
+
+ @Override
+ protected void initMenuList() {
+ menuList.add(ManagementMenu.REGISTER);
+ menuList.add(ManagementMenu.DELETE);
+ menuList.add(ManagementMenu.FIND);
+ menuList.add(ManagementMenu.BACK);
+ }
+}
diff --git a/src/main/java/subway/domain/management/SectionManager.java b/src/main/java/subway/domain/management/SectionManager.java
new file mode 100644
index 000000000..b69a6f784
--- /dev/null
+++ b/src/main/java/subway/domain/management/SectionManager.java
@@ -0,0 +1,108 @@
+package subway.domain.management;
+
+import subway.Constant;
+import subway.domain.data.Line;
+import subway.domain.data.LineRepository;
+import subway.domain.data.Station;
+import subway.domain.data.StationRepository;
+import subway.domain.menu.ManagementMenu;
+import subway.domain.menu.ServiceList;
+import subway.view.InputView;
+import subway.view.OutputView;
+
+import java.util.Scanner;
+
+public class SectionManager extends ServiceManager {
+
+ public SectionManager(Scanner scanner) {
+ super(scanner);
+ }
+
+ @Override
+ public void doStationManagement() {
+ OutputView.printManagementView(ServiceList.SECTION, menuList);
+ String inputData = getInputData(scanner);
+
+ try {
+ checkInputData(inputData);
+ } catch (IllegalArgumentException e) {
+ OutputView.printError(e.getMessage());
+ doStationManagement();
+ }
+ }
+
+ private void checkInputData(String inputData) {
+ if (inputData.equals(ManagementMenu.REGISTER.getOrder())) {
+ //registerStation(ManagementMenu.REGISTER);
+ return;
+ }
+ if (inputData.equals(ManagementMenu.DELETE.getOrder())) {
+ deleteSection(ManagementMenu.DELETE);
+ return;
+ }
+ }
+
+ private void deleteSection(ManagementMenu menu) {
+ Line line = getLineName(menu);
+ Station station = getStationName(line, menu);
+
+ line.deleteSection(station.getName());
+ }
+
+ private Line checkValidLineName(String lineName) {
+ for (Line savedLine : LineRepository.lines()) {
+ if (savedLine.getName().equals(lineName)) {
+ return savedLine;
+ }
+ }
+ throw new IllegalArgumentException("등록되지 않은 노선입니다.");
+ }
+
+ private Station checkValidStationName(Line line, String stationName) {
+ for (Station station : line.getStations()) {
+ if (station.getName().equals(stationName)) {
+ return station;
+ }
+ }
+ throw new IllegalArgumentException("해당 구간에 등록되지 않은 노선입니다.");
+ }
+
+ private Line getLineName(ManagementMenu menu) {
+ try {
+ if (menu.equals(ManagementMenu.REGISTER)) {
+ OutputView.printInputData(Constant.INPUT_SECTION_LINE_DATA_REGISTER_FORMAT, ServiceList.SECTION.getName());
+ }
+ if (menu.equals(ManagementMenu.DELETE)) {
+ OutputView.printInputData(Constant.INPUT_SECTION_LINE_DATA_DELETE_FORMAT, ServiceList.SECTION.getName());
+ }
+ String data = InputView.inputData(scanner);
+ return checkValidLineName(data);
+ } catch (IllegalArgumentException e) {
+ OutputView.printError(e.getMessage());
+ return getLineName(menu);
+ }
+ }
+
+ private Station getStationName(Line line, ManagementMenu menu) {
+ try{
+ if (menu.equals(ManagementMenu.REGISTER)) {
+ OutputView.printInputData(Constant.INPUT_SECTION_STATION_DATA_REGISTER_FORMAT, ServiceList.SECTION.getName());
+ }
+ if (menu.equals(ManagementMenu.DELETE)) {
+ OutputView.printInputData(Constant.INPUT_SECTION_STATION_DATA_DELETE_FORMAT, ServiceList.SECTION.getName());
+ }
+ String data = InputView.inputData(scanner);
+ return checkValidStationName(line, data);
+ } catch (IllegalArgumentException e){
+ OutputView.printError(e.getMessage());
+ return getStationName(line, menu);
+ }
+ }
+
+ @Override
+ protected void initMenuList() {
+ menuList.add(ManagementMenu.REGISTER);
+ menuList.add(ManagementMenu.DELETE);
+ menuList.add(ManagementMenu.BACK);
+ }
+}
diff --git a/src/main/java/subway/domain/management/ServiceManager.java b/src/main/java/subway/domain/management/ServiceManager.java
new file mode 100644
index 000000000..56fc21c21
--- /dev/null
+++ b/src/main/java/subway/domain/management/ServiceManager.java
@@ -0,0 +1,36 @@
+package subway.domain.management;
+
+import subway.Constant;
+import subway.domain.menu.ManagementMenu;
+import subway.domain.menu.ServiceList;
+import subway.view.InputView;
+import subway.view.OutputView;
+
+import java.awt.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Scanner;
+
+public abstract class ServiceManager {
+ protected List menuList = new ArrayList<>();
+ protected Scanner scanner;
+
+ public ServiceManager(Scanner scanner) {
+ initMenuList();
+ this.scanner = scanner;
+ }
+
+ protected String getInputData(Scanner scanner){
+ try{
+ OutputView.printAskingFunction(Constant.ASKING_FUNCTION_INPUT_FUNCTION_ORDER);
+ return InputView.inputManagementMenu(scanner, menuList);
+ } catch (IllegalArgumentException e){
+ OutputView.printError(e.getMessage());
+ return getInputData(scanner);
+ }
+ }
+
+ public abstract void doStationManagement();
+
+ protected abstract void initMenuList();
+}
diff --git a/src/main/java/subway/domain/management/StationManager.java b/src/main/java/subway/domain/management/StationManager.java
new file mode 100644
index 000000000..d9f118ec2
--- /dev/null
+++ b/src/main/java/subway/domain/management/StationManager.java
@@ -0,0 +1,103 @@
+package subway.domain.management;
+
+import subway.Constant;
+import subway.domain.data.Station;
+import subway.domain.data.StationRepository;
+import subway.domain.menu.ManagementMenu;
+import subway.domain.menu.ServiceList;
+import subway.view.InputView;
+import subway.view.OutputView;
+
+import java.util.List;
+import java.util.Scanner;
+
+
+public class StationManager extends ServiceManager {
+
+ public StationManager(Scanner scanner) {
+ super(scanner);
+ }
+
+ @Override
+ public void doStationManagement() {
+ OutputView.printManagementView(ServiceList.STATION, menuList);
+ String inputData = getInputData(scanner);
+
+ try {
+ checkInputData(inputData);
+ } catch (IllegalArgumentException e){
+ OutputView.printError(e.getMessage());
+ doStationManagement();
+ }
+ }
+
+ private void checkInputData(String inputData) {
+ if(inputData.equals(ManagementMenu.REGISTER.getOrder())){
+ registerStation(ManagementMenu.REGISTER);
+ return;
+ }
+ if(inputData.equals(ManagementMenu.DELETE.getOrder())){
+ deleteStation(ManagementMenu.DELETE);
+ return;
+ }
+ if(inputData.equals(ManagementMenu.FIND.getOrder())){
+ findStation();
+ return;
+ }
+ }
+
+ private void deleteStation(ManagementMenu menu) {
+ String name = getStationName(menu);
+
+ for(Station savedStation : StationRepository.stations()){
+ if(savedStation.getName().equals(name)){
+ OutputView.printFunctionResult(Constant.DELETE_RESULT_FORMAT, ServiceList.STATION.getName());
+ StationRepository.deleteStation(name);
+ return;
+ }
+ }
+
+ OutputView.printErrorWithFormat(Constant.DELETE_DATA_ERROR_FORMAT, ServiceList.STATION.getName());
+ return;
+ }
+
+ private void findStation() {
+ OutputView.printStationList(StationRepository.stations(), ServiceList.STATION.getName());
+ }
+
+ private void registerStation(ManagementMenu menu) {
+ String name = getStationName(menu);
+
+ for(Station savedStation : StationRepository.stations()){
+ if(savedStation.getName().equals(name)){
+ OutputView.printErrorWithFormat(Constant.REGISTER_DUPLICATE_DATA_ERROR_FORMAT, ServiceList.STATION.getName());
+ return;
+ }
+ }
+
+ Station station = new Station(name);
+ StationRepository.addStation(station);
+ OutputView.printFunctionResult(Constant.REGISTER_RESULT_FORMAT, ServiceList.STATION.getName());
+ return;
+ }
+
+ private String getStationName(ManagementMenu menu) {
+ if(menu.equals(ManagementMenu.REGISTER)) {
+ OutputView.printInputData(Constant.INPUT_DATA_REGISTER_FORMAT, ServiceList.STATION.getName());
+ }
+ if(menu.equals(ManagementMenu.DELETE)) {
+ OutputView.printInputData(Constant.INPUT_DATA_DELETE_FORMAT, ServiceList.STATION.getName());
+ }
+ String data = InputView.inputData(scanner);
+ return data;
+ }
+
+
+ @Override
+ protected void initMenuList() {
+ menuList.add(ManagementMenu.REGISTER);
+ menuList.add(ManagementMenu.DELETE);
+ menuList.add(ManagementMenu.FIND);
+ menuList.add(ManagementMenu.BACK);
+ }
+}
diff --git a/src/main/java/subway/domain/menu/MainMenu.java b/src/main/java/subway/domain/menu/MainMenu.java
new file mode 100644
index 000000000..4855548d9
--- /dev/null
+++ b/src/main/java/subway/domain/menu/MainMenu.java
@@ -0,0 +1,35 @@
+package subway.domain.menu;
+
+public enum MainMenu {
+ STATION(String.valueOf(ServiceList.STATION.ordinal()+1), ServiceList.STATION.getName()+" 관리")
+ , LINE(String.valueOf(ServiceList.LINE.ordinal()+1), ServiceList.LINE.getName()+" 관리")
+ , SECTION(String.valueOf(ServiceList.SECTION.ordinal()+1), ServiceList.SECTION.getName()+" 관리")
+ , MAP(String.valueOf(ServiceList.MAP.ordinal()+1), ServiceList.MAP.getName()+" 출력")
+ , END("Q", "종료");
+
+ final private String order;
+ final private String message;
+
+ MainMenu(String order, String message) {
+ this.order = order;
+ this.message = message;
+ }
+
+ public String getOrder() {
+ return order;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public static boolean isValidOrder(String order){
+ for(MainMenu mainMenu : MainMenu.values()){
+ if(mainMenu.getOrder().equals(order)){
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/src/main/java/subway/domain/menu/ManagementMenu.java b/src/main/java/subway/domain/menu/ManagementMenu.java
new file mode 100644
index 000000000..b27cf7328
--- /dev/null
+++ b/src/main/java/subway/domain/menu/ManagementMenu.java
@@ -0,0 +1,26 @@
+package subway.domain.menu;
+
+public enum ManagementMenu {
+
+ REGISTER("1", "등록")
+ , DELETE("2", "삭제")
+ , FIND("3", "조회")
+ , BACK("B", "돌아가기");
+
+ final private String order;
+ final private String message;
+
+ ManagementMenu(String order, String message) {
+ this.order = order;
+ this.message = message;
+ }
+
+ public String getOrder() {
+ return order;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+}
diff --git a/src/main/java/subway/domain/menu/ServiceList.java b/src/main/java/subway/domain/menu/ServiceList.java
new file mode 100644
index 000000000..c5bd3d2d1
--- /dev/null
+++ b/src/main/java/subway/domain/menu/ServiceList.java
@@ -0,0 +1,15 @@
+package subway.domain.menu;
+
+public enum ServiceList {
+ STATION("역"), LINE("노선"), SECTION("구간"), MAP("지하철 노선도");
+
+ final private String name;
+
+ ServiceList(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+}
diff --git a/src/main/java/subway/view/InputView.java b/src/main/java/subway/view/InputView.java
new file mode 100644
index 000000000..c964af355
--- /dev/null
+++ b/src/main/java/subway/view/InputView.java
@@ -0,0 +1,39 @@
+package subway.view;
+
+import Utils.Validator;
+import subway.Constant;
+import subway.domain.menu.MainMenu;
+import subway.domain.menu.ManagementMenu;
+
+import java.util.List;
+import java.util.Scanner;
+
+public class InputView {
+
+ public InputView() {
+ }
+
+ public static String inputMainMenu(Scanner scanner) {
+ String inputData = scanner.nextLine();
+ if (!MainMenu.isValidOrder(inputData)) {
+ throw new IllegalArgumentException(Constant.ILLEGAL_ARGUMENT_EXCEPTION_INVALID_MENU_ORDER);
+ }
+ return inputData;
+ }
+
+ public static String inputManagementMenu(Scanner scanner, List menuList) {
+ String inputData = scanner.nextLine();
+ for (ManagementMenu menu : menuList) {
+ if (menu.getOrder().equals(inputData)) {
+ return inputData;
+ }
+ }
+ throw new IllegalArgumentException(Constant.ILLEGAL_ARGUMENT_EXCEPTION_INVALID_MENU_ORDER);
+ }
+
+ public static String inputData(Scanner scanner) {
+ String inputData = scanner.nextLine();
+ Validator.checkDataLength(inputData);
+ return inputData;
+ }
+}
diff --git a/src/main/java/subway/view/OutputView.java b/src/main/java/subway/view/OutputView.java
new file mode 100644
index 000000000..c4aecec5e
--- /dev/null
+++ b/src/main/java/subway/view/OutputView.java
@@ -0,0 +1,106 @@
+package subway.view;
+
+import subway.Constant;
+import subway.domain.data.Line;
+import subway.domain.data.Station;
+import subway.domain.menu.MainMenu;
+import subway.domain.menu.ManagementMenu;
+import subway.domain.menu.ServiceList;
+
+import java.util.List;
+
+public class OutputView {
+
+ public OutputView() {
+ }
+
+ public static void printMainView(){
+ System.out.println();
+ System.out.print(Constant.VIEW_HEADER);
+ System.out.println(Constant.MAIN_VIEW_HEADER);
+ for(MainMenu menu : MainMenu.values()) {
+ System.out.printf(Constant.VIEW_FORMAT, menu.getOrder(), menu.getMessage());
+ }
+ }
+
+ public static void printManagementView(ServiceList service, List menuList){
+ System.out.println();
+ System.out.print(Constant.VIEW_HEADER);
+ System.out.printf(Constant.MANAGEMENT_VIEW_HEADER_FORMAT, service.getName());
+ for(ManagementMenu menu : menuList) {
+ if(menu.getOrder().equals(Constant.BACK_KEY)){
+ System.out.printf(Constant.MANAGEMENT_VIEW_BODY_BACK_FORMAT, menu.getOrder(), menu.getMessage());
+ continue;
+ }
+ System.out.printf(Constant.MANAGEMENT_VIEW_BODY_FORMAT, menu.getOrder(), service.getName(), menu.getMessage());
+ }
+ }
+
+ public static void printSubwayMap(){
+
+ }
+
+ public static void printAskingFunction(String askingMessage){
+ System.out.println();
+ System.out.print(Constant.VIEW_HEADER);
+ System.out.println(askingMessage);
+ }
+
+ public static void printInputData(String format, String service){
+ System.out.println();
+ System.out.print(Constant.VIEW_HEADER);
+ System.out.printf(format, service);
+ }
+
+ public static void printFunctionResult(String resultMessageFormat, String service){
+ System.out.println();
+ System.out.print(Constant.RESULT_HEADER);
+ System.out.printf(resultMessageFormat, service);
+ System.out.println();
+ }
+
+ public static void printError(String errorMessage){
+ System.out.println();
+ System.out.print(Constant.ILLEGAL_ARGUMENT_EXCEPTION_HEADER);
+ System.out.println(errorMessage);
+ System.out.println();
+ }
+
+ public static void printErrorWithFormat(String errorFormat, String service){
+ System.out.println();
+ System.out.print(Constant.ILLEGAL_ARGUMENT_EXCEPTION_HEADER);
+ System.out.printf(errorFormat, service);
+ System.out.println();
+ }
+
+ public static void printStationList(List list, String service){
+ System.out.println();
+ if(list.isEmpty()){
+ System.out.print(Constant.ILLEGAL_ARGUMENT_EXCEPTION_HEADER);
+ System.out.printf(Constant.FIND_EMPTY_LIST + "\n", service);
+ return;
+ }
+
+ System.out.print(Constant.VIEW_HEADER);
+ System.out.println(Constant.STATION_LIST_HEADER);
+ for(Station station : list) {
+ System.out.println(Constant.RESULT_HEADER + station.getName());
+ }
+ System.out.println();
+ }
+ public static void printLineList(List list, String service){
+ System.out.println();
+ if(list.isEmpty()){
+ System.out.print(Constant.ILLEGAL_ARGUMENT_EXCEPTION_HEADER);
+ System.out.printf(Constant.FIND_EMPTY_LIST + "\n", service);
+ return;
+ }
+
+ System.out.print(Constant.VIEW_HEADER);
+ System.out.println(Constant.LINE_LIST_HEADER);
+ for(Line line : list) {
+ System.out.println(Constant.RESULT_HEADER + line.getName());
+ }
+ System.out.println();
+ }
+}