diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 000000000..af0f300a2
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,362 @@
+# 지하철 노선도 미션
+우아한테크코스 웹 백엔드 프리코스 3주차 미션 프로젝트입니다.
+
+
+
+## 👩💻 구현할 기능 목록
+### 초기 설정
+#### 지하철 역
+- [x] 교대역, 강남역, 역삼역, 남부터미널역, 양재역, 양재시민의숲역, 매봉역을 등록한다.
+
+#### 지하철 노선
+- [x] 2호선, 3호선, 신분당선을 등록한다.
+
+#### 지하철 노선도
+- [x] 2호선에는 `상행 종점` 교대역 - 강남역 - 역삼역 `하행 종점`을 등록한다.
+- [x] 3호선에는 `상행 종점` 교대역 - 남부터미널역 - 양재역 - 매봉역 `하행 종점`을 등록한다.
+- [x] 신분당선에는 `상행 종점` 강남역 - 양재역 - 양재시민의숲역 `하행 종점`을 등록한다.
+
+### 지하철 역
+- [x] 지하철 역을 등록한다. [`예외 1`](#exception1)
+- [x] 지하철 역을 삭제한다. [`예외 2`](#exception2)
+- [x] 지하철 역의 목록을 조회한다.
+
+### 지하철 노선
+- [x] 지하철 노선을 등록한다. [`예외 3`](#exception3)
+ - [x] 지하철 노선 등록 시 상행 종점역과 하행 종점역을 입력한다. [`예외 4`](#exception4)
+- [x] 지하철 노선을 삭제한다. [`예외 5`](#exception5)
+- [x] 지하철 노선의 목록을 조회한다.
+
+### 지하철 구간
+- [x] 지하철 구간을 추가한다.
+ - [x] 하나의 역은 여러 개의 노선에 추가될 수 있다.
+ - [x] 새로운 역은 역과 역 사이에 추가될 수 있다.
+ - [x] 새로운 역을 삽입할 노선을 입력한다. [`예외 6`](#exception6)
+ - [x] 새로운 역의 이름을 입력한다. [`예외 7`](#exception7)
+ - [x] 새로운 역의 순서를 입력한다. [`예외 8`](#exception8)
+ - [x] 지하철 노선에 갈래길은 생길 수 없다.
+- [x] 지하철 구간을 삭제한다.
+ - [x] 지하철 노선에 등록된 역을 제거할 수 있다. [`예외 9`](#exception9)
+ - [x] 삭제할 구간의 노선을 입력한다. [`예외 10`](#exception10)
+ - [x] 삭제할 구간의 역을 입력한다. [`예외 11`](#exception11)
+ - [x] 상행 종점역을 제거할 경우 다음 역이 종점이 된다.
+ - [x] 하행 종점역을 제거할 경우 이전 역이 종점이 된다.
+
+### 지하철 노선도
+- [x] 지하철 노선도를 조회한다.
+ - [x] 지하철 노선의 상행 종점부터 하행 종점까지 연결된 순서대로 역 목록을 조회한다.
+
+### 입출력
+#### 입력
+- [x] 메인 화면에서 1~4 숫자 또는 Q 문자만 입력한다. [`예외 12`](#exception12)
+- [x] 역 관리 화면에서 1~3 숫자 또는 B 문자만 입력한다. [`예외 13`](#exception13)
+- [x] 노선 관리 화면에서 1~3 숫자 또는 B 문자만 입력한다. [`예외 14`](#exception14)
+- [x] 구간 관리 화면에서 1~2 숫자 또는 B 문자만 입력한다. [`예외 15`](#exception15)
+
+#### 출력
+- [x] 메인 화면을 출력한다.
+- [x] 역 관리 화면을 출력한다.
+- [x] 노선 관리 화면을 출력한다.
+- [x] 구간 관리 화면을 출력한다.
+- [x] 각 화면 기능에 대한 실행 결과는 `[INFO]`를 붙여서 출력한다.
+- [x] 각 화면 기능에 대한 에러 발생은 `[ERROR]`를 붙여서 출력한다.
+
+### 돌아가기
+- [x] 관리/출력 화면에서 메인 화면으로 돌아간다.
+ - [x] B 문자를 입력한다.
+ - [x] 기능 실행이 완료되면 자동으로 돌아간다.
+
+### 종료
+- [x] 메인 화면에서 프로그램을 종료한다.
+ - [x] Q 문자를 입력한다.
+
+### 에러
+- [x] 에러가 발생하면 다음 입력을 기다린다.
+ - [x] 프로그램은 강제 종료되지 않는다.
+
+### 예외 처리
+#### `예외 1`
+- [x] 지하철 역 이름이 중복되는 경우
+- [x] 지하철 역 이름은 2글자 미만인 경우
+- [x] 지하철 역 이름이 '역'으로 끝나지 않는 경우
+
+#### `예외 2`
+- [x] 지하철 역이 지하철 노선에 등록된 경우
+- [x] 삭제할 역이 없는 경우
+
+#### `예외 3`
+- [x] 지하철 노선 이름이 중복되는 경우
+- [x] 지하철 노선 이름이 2글자 미만인 경우
+- [x] 지하철 노선 이름이 '선'으로 끝나지 않는 경우
+
+#### `예외 4`
+- [x] 상행 종점역과 하행 종점역이 지하철 역에 존재하지 않는 경우
+- [x] 상행 종점역과 하행 종점역이 같은 경우
+
+#### `예외 5`
+- [x] 삭제할 노선이 없는 경우
+
+#### `예외 6`
+- [x] 삽입할 노선이 없는 경우
+
+#### `에외 7`
+- [x] 해당 역이 없는 경우
+- [x] 해당 역이 이미 노선에 존재하는 경우
+
+#### `예외 8`
+- [x] 순서가 문자인 경우
+- [x] 순서가 음수 또는 0인 경우
+- [x] 순서가 노선에 있는 역 개수+1 보다 큰 수인 경우
+
+#### `예외 9`
+- [x] 지하철 노선에 포함된 역이 2개 이하인 경우
+
+#### `예외 10`
+- [x] 해당 노선이 없는 경우
+
+#### `예외 11`
+- [x] 해당 역이 없는 경우
+
+#### `예외 12`
+- [x] 메인 화면에서 1~4 숫자 또는 Q 문자 이외를 입력하는 경우
+
+#### `예외 13`
+- [x] 역 관리 화면에서 1~3 숫자 또는 B 문자 이외를 입력하는 경우
+
+#### `예외 14`
+- [x] 노선 관리 화면에서 1~3 숫자 또는 B 문자 이외를 입력하는 경우
+
+#### `예외 15`
+- [x] 구간 관리 화면에서 1~2 숫자 또는 B 문자 이외를 입력하는 경우
+
+
+
+## ✅ 확인할 프로그래밍 목록
+### 요구사항
+- [x] 자바 코드 컨벤션을 지키면서 프로그래밍한다.
+ - [x] 들여쓰기는 `4 spaces`로 한다.
+- [x] (1 <= indent depth) && (indent depth <= 2)이다.
+- [x] 3항 연산자를 쓰지 않는다.
+- [x] 함수의 길이는 `15라인`을 넘지 않는다.
+ - [x] 함수가 한 가지 일만 하도록 최대한 작게 만든다.
+- [x] else 예약어를 쓰지 않는다.
+ - [x] `early return`하는 코드를 작성한다.
+ - [x] switch/case 문도 사용하지 않는다.
+
+### 추가사항
+- [x] 코드 리팩토링을 진행한다.
+ - [x] 1주차 피드백을 반영한다.
+ - [x] 2주차 피드백을 반영한다.
+- [x] 주석은 Javadoc 형태로 작성한다.
+- [x] README 문서를 상세하게 작성한다.
+
+## 📂 완성된 디렉토리 구조
+```
+└─java-subway-map-precourse
+ │
+ ├─docs
+ │ └─README.md
+ └─src
+ └─main
+ └─java
+ └─subway
+ ├─controller
+ │ ├─LineController.java
+ │ ├─SectionController.java
+ │ ├─StationController.java
+ │ ├─SubwayController.java
+ │ └─TransitMapController.java
+ ├─domain
+ │ ├─Line.java
+ │ ├─Section.java
+ │ ├─Station.java
+ │ ├─Stations.java
+ │ └─TransitMap.java
+ ├─repository
+ │ ├─LineRepository.java
+ │ ├─StataionRepository.java
+ │ └─TransitMapRepository.java
+ ├─service
+ │ ├─initialization
+ │ │ ├─LineInitialization.java
+ │ │ ├─StationInitialization.java
+ │ │ └─TransitMapInitialization.java
+ │ ├─line
+ │ │ ├─addition
+ │ │ │ ├─LineAdditionService.java
+ │ │ │ └─LineAdditionValidation.java
+ │ │ ├─deletion
+ │ │ │ ├─LineDeletionService.java
+ │ │ │ └─LineDeletionValidation.java
+ │ │ ├─show
+ │ │ │ └─LineShowService.java
+ │ │ └─LineService.java
+ │ ├─section
+ │ │ ├─addition
+ │ │ │ ├─SectionAdditionService.java
+ │ │ │ └─SectionAdditionValidation.java
+ │ │ ├─deletion
+ │ │ │ ├─SectionDeletionService.java
+ │ │ │ └─SectionDeletionValidation.java
+ │ │ └─SectionService.java
+ │ ├─station
+ │ │ ├─addition
+ │ │ │ ├─StationAdditionValidation.java
+ │ │ │ └─StationAdditionValidationInterface.java
+ │ │ ├─deletion
+ │ │ │ ├─StationDeletionValidation.java
+ │ │ │ └─StationDeletionValidationInterface.java
+ │ │ ├─show
+ │ │ │ ├─StationShowInterface.java
+ │ │ │ └─StationShowService.java
+ │ │ └─StationService.java
+ │ ├─subway
+ │ │ ├─SubwayInterface.java
+ │ │ └─SubwayService.java
+ │ ├─transitmap
+ │ │ ├─show
+ │ │ │ └─TransitMapShowService.java
+ │ │ └─TransitMapService.java
+ │ └─util
+ │ ├─ChoiceInterface.java
+ │ ├─ChoiceService.java
+ │ └─FeatureInterface.java
+ ├─type
+ │ ├─BoundaryType.java
+ │ ├─CheckType.java
+ │ ├─ExceptionType.java
+ │ ├─InformationType.java
+ │ ├─InputType.java
+ │ ├─LineType.java
+ │ ├─ScreenType.java
+ │ ├─StationType.java
+ │ └─TextType.java
+ ├─view
+ │ ├─input
+ │ │ ├─line
+ │ │ │ └─LineScanView.java
+ │ │ ├─section
+ │ │ │ └─SectionScanView.java
+ │ │ ├─station
+ │ │ │ └─StationScanView.java
+ │ │ └─subway
+ │ │ └─SubwayScanView.java
+ │ └─output
+ │ ├─line
+ │ │ ├─LineExceptionView.java
+ │ │ ├─LineInformationView.java
+ │ │ └─LineTextView.java
+ │ ├─section
+ │ │ ├─SectionExceptionView.java
+ │ │ ├─SectionInformationView.java
+ │ │ └─SectionTextView.java
+ │ ├─station
+ │ │ ├─StationExceptionView.java
+ │ │ ├─StationInformationView.java
+ │ │ └─StationTextView.java
+ │ └─util
+ │ ├─FeatureChoiceExceptionView.java
+ │ └─ScreenView.java
+ └─Application.java
+```
+### subwaymap
+- Application.java : 메인 클래스
+
+#### controller
+- LineController.java : 지하철 노선에 대한 컨트롤러 클래스
+- SectionController.java : 지하철 구간에 대한 컨트롤러 클래스
+- StationController.java : 지하철 역에 대한 컨트롤러 클래스
+- SubwayController.java : 지하철에 대한 컨트롤러 클래스
+- TransitMapController.java : 지하철 노선도에 대한 컨트롤러 클래스
+
+#### domain
+- Line.java : 지하철 노선에 대한 도메인 모델 클래스
+- Section.java : 지하철 구간에 대한 도메인 모델 클래스
+- Station.java : 지하철 역에 대한 도메인 모델 클래스
+- Stations.java : 지하철 상행 종점역, 하행 종점역에 대한 도메인 모델 클래스
+- TransitMap.java : 지하철 노선도에 대한 도메인 모델 클래스
+
+#### repository
+- LineRepository.java : 지하철 노선에 대한 저장소 클래스
+- StationRepository.java : 지하철 역에 대한 저장소 클래스
+- TransitMapRepository.java : 지하철 노선도에 대한 저장소 클래스
+
+#### service
+##### initialization
+- LineInitialization.java : 지하철 노선 초기화에 대한 클래스
+- StationInitialization.java : 지하철 역 초기화에 대한 클래스
+- TransitMapInitialization.java : 지하철 노선도 초기화에 대한 클래스
+
+##### line
+- addition/LineAdditionService.java : 지하철 노선 추가 로직에 대한 서비스 클래스
+- addition/LineAdditionValidation.java : 지하철 노선 추가 로직 검증에 대한 클래스
+- deletion/LineDeletionService.java : 지하철 노선 삭제 로직에 대한 서비스 클래스
+- deletion/LineDeletionValidation.java : 지하철 노선 삭제 로직 검증에 대한 클래스
+- show/LineShowService.java : 지하철 노선 조회 로직에 대한 서비스 클래스
+- LineService.java : 지하철 노선 비즈니스 로직에 대한 서비스 클래스
+
+##### section
+- addition/SectionAdditionService.java : 지하철 구간 추가 로직에 대한 서비스 클래스
+- addition/SectionAdditionValidation.java : 지하철 구간 추가 로직 검증에 대한 클래스
+- deletion/SectionDeletionService.java : 지하철 구간 삭제 로직에 대한 서비스 클래스
+- deletion/SectionDeletionValidation.java : 지하철 구간 삭제 로직 검증에 대한 클래스
+- SectionService.java : 지하철 구간 비즈니스 로직에 대한 서비스 클래스
+
+##### station
+- addition/StationAdditionValidation.java : 지하철 역 추가 로직 검증에 대한 클래스
+- addition/StationAdditionValidationInterface.java : 지하철 역 추가 로직 검증에 대한 인터페이스
+- deletion/StationDeletionValidation.java : 지하철 역 삭제 로직 검증에 대한 클래스
+- deletion/StationDeletionValidationInterface.java : 지하철 역 삭제 로직 검증에 대한 인터페이스
+- show/StationShowInterface.java : 지하철 역 조회 로직에 대한 인터페이스
+- show/StationShowService.java : 지하철 역 조회 로직에 대한 서비스 클래스
+- StationService.java : 지하철 역 비즈니스 로직에 대한 서비스 클래스
+
+##### subway
+- SubwayInterface.java : 지하철 비즈니스 로직에 대한 인터페이스
+- SubwayService.java : 지하철 비즈니스 로직에 대한 서비스 클래스
+
+##### transitmap
+- show/TransitMapShowService.java : 지하철 노선도 출력 로직에 대한 서비스 클래스
+- TransitMapService.java : 지하철 노선도 비즈니스 로직에 대한 서비스 클래스
+
+##### util
+- ChoiceInterface.java : 지하철 역, 지하철 노선 기능 선택에 대한 인터페이스
+- ChoiceService.java : 지하철 역, 지하철 노선 기능 선택에 대한 서비스 클래스
+- FeatureInterface.java : 지하철 역, 지하철 노선 기능에 대한 인터페이스
+
+#### type
+- BoundaryType.java : 경계 값 상수를 모아둔 Enum 클래스
+- CheckType.java : 입력 값 마지막 문자 확인용 상수를 모아둔 Enum 클래스
+- ExceptionType.java : 예외 처리 문구 상수를 모아둔 Enum 클래스
+- InformationType.java : 실행 결과 문구 상수를 모아둔 Enum 클래스
+- InputType.java : 화면 기능 입력 값 상수를 모아둔 Enum 클래스
+- LineType.java : 지하철 노선 초기화용 상수를 모아둔 Enum 클래스
+- ScreenType.java : 화면 문구 상수를 모아둔 Enum 클래스
+- StationType.java : 지하철 역 초기화용 상수를 모아둔 Enum 클래스
+- TextType.java : 화면 출력 문구 상수를 모아둔 Enum 클래스
+
+#### view
+##### input
+- line/LineScanView.java : 지하철 노선 기능 입력에 대한 클래스
+- section/SectionScanView.java : 지하철 구간 기능 입력에 대한 클래스
+- station/StationScanView.java : 지하철 역 기능 입력에 대한 클래스
+- subway/SubwayScanView.java : 지하철 기능 입력에 대한 클래스
+
+##### output
+- line/LineExceptionView.java : 지하철 노선 예외 처리 문구 출력에 대한 클래스
+- line/LineInformationView.java : 지하철 노선 실행 결과 문구 출력에 대한 클래스
+- line/LineTextView.java : 지하철 노선 화면 출력 문구 출력에 대한 클래스
+- section/SectionExceptionView.java : 지하철 구간 예외 처리 문구 출력에 대한 클래스
+- section/SectionInformationView.java : 지하철 구간 실행 결과 문구 출력에 대한 클래스
+- section/SectionTextView.java : 지하철 구간 화면 출력 문구 출력에 대한 클래스
+- station/StationExceptionView.java : 지하철 역 예외 처리 문구 출력에 대한 클래스
+- station/StationInformationView.java : 지하철 역 실행 결과 문구 출력에 대한 클래스
+- station/StationTextView.java : 지하철 역 화면 출력 문구 출력에 대한 클래스
+- util/FeatureChoiceExceptionView.java : 화면 기능 선택 예외 처리 문구 출력에 대한 클래스
+- util/ScreenView.java : 화면 출력에 대한 클래스
+
+
+
+## 📝 License
+
+This project is [MIT](https://github.com/woowacourse/java-subway-map-precourse/blob/master/LICENSE.md) licensed.
diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java
index 0bcf786cc..f7c314346 100644
--- a/src/main/java/subway/Application.java
+++ b/src/main/java/subway/Application.java
@@ -1,10 +1,20 @@
package subway;
+import subway.controller.SubwayController;
+
import java.util.Scanner;
+/**
+ * Application.java : 메인 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
public class Application {
public static void main(String[] args) {
final Scanner scanner = new Scanner(System.in);
// TODO: 프로그램 구현
+ SubwayController subwayController = new SubwayController();
+ subwayController.runSubway(scanner);
}
}
diff --git a/src/main/java/subway/controller/LineController.java b/src/main/java/subway/controller/LineController.java
new file mode 100644
index 000000000..0bd7e492a
--- /dev/null
+++ b/src/main/java/subway/controller/LineController.java
@@ -0,0 +1,18 @@
+package subway.controller;
+
+import subway.service.line.LineService;
+
+import java.util.Scanner;
+
+/**
+ * LineController.java : 지하철 노선에 대한 컨트롤러 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class LineController {
+ public static void startLine(Scanner scanner) {
+ LineService lineService = new LineService();
+ lineService.manage(scanner);
+ }
+}
diff --git a/src/main/java/subway/controller/SectionController.java b/src/main/java/subway/controller/SectionController.java
new file mode 100644
index 000000000..69d95e236
--- /dev/null
+++ b/src/main/java/subway/controller/SectionController.java
@@ -0,0 +1,18 @@
+package subway.controller;
+
+import subway.service.section.SectionService;
+
+import java.util.Scanner;
+
+/**
+ * SectionController.java : 지하철 구간에 대한 컨트롤러 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class SectionController {
+ public static void startSection(Scanner scanner) {
+ SectionService sectionService = new SectionService();
+ sectionService.manage(scanner);
+ }
+}
diff --git a/src/main/java/subway/controller/StationController.java b/src/main/java/subway/controller/StationController.java
new file mode 100644
index 000000000..ad53272eb
--- /dev/null
+++ b/src/main/java/subway/controller/StationController.java
@@ -0,0 +1,18 @@
+package subway.controller;
+
+import subway.service.station.StationService;
+
+import java.util.Scanner;
+
+/**
+ * StationController.java : 지하철 역에 대한 컨트롤러 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class StationController {
+ public static void startStation(Scanner scanner) {
+ StationService stationService = new StationService();
+ stationService.manage(scanner);
+ }
+}
diff --git a/src/main/java/subway/controller/SubwayController.java b/src/main/java/subway/controller/SubwayController.java
new file mode 100644
index 000000000..30a3815d2
--- /dev/null
+++ b/src/main/java/subway/controller/SubwayController.java
@@ -0,0 +1,32 @@
+package subway.controller;
+
+import subway.service.subway.SubwayService;
+import subway.service.initialization.LineInitialization;
+import subway.service.initialization.StationInitialization;
+import subway.service.initialization.TransitMapInitialization;
+
+import java.util.Scanner;
+
+/**
+ * SubwayController.java : 지하철에 대한 컨트롤러 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class SubwayController {
+ public void runSubway(Scanner scanner) {
+ initializeSubway();
+ startSubway(scanner);
+ }
+
+ public static void initializeSubway() {
+ StationInitialization.initializeStations();
+ LineInitialization.initializeLines();
+ TransitMapInitialization.initializeTransitMaps();
+ }
+
+ public static void startSubway(Scanner scanner) {
+ SubwayService subwayService = new SubwayService();
+ subwayService.manage(scanner);
+ }
+}
diff --git a/src/main/java/subway/controller/TransitMapController.java b/src/main/java/subway/controller/TransitMapController.java
new file mode 100644
index 000000000..fb6097bf6
--- /dev/null
+++ b/src/main/java/subway/controller/TransitMapController.java
@@ -0,0 +1,15 @@
+package subway.controller;
+
+import subway.service.transitmap.TransitMapService;
+
+/**
+ * TransitMapController.java : 지하철 노선도에 대한 컨트롤러 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class TransitMapController {
+ public static void startTransitMap() {
+ TransitMapService.showTransitMap();
+ }
+}
diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java
index f4d738d5a..fc35f0d9d 100644
--- a/src/main/java/subway/domain/Line.java
+++ b/src/main/java/subway/domain/Line.java
@@ -1,5 +1,11 @@
package subway.domain;
+/**
+ * Line.java : 지하철 노선에 대한 도메인 모델 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
public class Line {
private String name;
diff --git a/src/main/java/subway/domain/Section.java b/src/main/java/subway/domain/Section.java
new file mode 100644
index 000000000..6de80bc01
--- /dev/null
+++ b/src/main/java/subway/domain/Section.java
@@ -0,0 +1,31 @@
+package subway.domain;
+
+/**
+ * Section.java : 지하철 구간에 대한 도메인 모델 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class Section {
+ private final String lineName;
+ private final String stationName;
+ private final String order;
+
+ public Section(String lineName, String stationName, String order) {
+ this.lineName = lineName;
+ this.stationName = stationName;
+ this.order = order;
+ }
+
+ public String getLineName() {
+ return lineName;
+ }
+
+ public String getStationName() {
+ return stationName;
+ }
+
+ public String getOrder() {
+ return order;
+ }
+}
diff --git a/src/main/java/subway/domain/Station.java b/src/main/java/subway/domain/Station.java
index bdb142590..6ff94caf8 100644
--- a/src/main/java/subway/domain/Station.java
+++ b/src/main/java/subway/domain/Station.java
@@ -1,5 +1,11 @@
package subway.domain;
+/**
+ * Station.java : 지하철 역에 대한 도메인 모델 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
public class Station {
private String name;
diff --git a/src/main/java/subway/domain/Stations.java b/src/main/java/subway/domain/Stations.java
new file mode 100644
index 000000000..dc60bc64e
--- /dev/null
+++ b/src/main/java/subway/domain/Stations.java
@@ -0,0 +1,25 @@
+package subway.domain;
+
+/**
+ * Stations.java : 지하철 상행 종점역, 하행 종점역에 대한 도메인 모델 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class Stations {
+ private final String upStationName;
+ private final String downStationName;
+
+ public Stations(String upStationName, String downStationName) {
+ this.upStationName = upStationName;
+ this.downStationName = downStationName;
+ }
+
+ public String getUpStationName() {
+ return upStationName;
+ }
+
+ public String getDownStationName() {
+ return downStationName;
+ }
+}
diff --git a/src/main/java/subway/domain/TransitMap.java b/src/main/java/subway/domain/TransitMap.java
new file mode 100644
index 000000000..72d9dec3d
--- /dev/null
+++ b/src/main/java/subway/domain/TransitMap.java
@@ -0,0 +1,27 @@
+package subway.domain;
+
+import java.util.LinkedList;
+
+/**
+ * TransitMap.java : 지하철 노선도에 대한 도메인 모델 클래스
+ *
+ * @author Daeun lee
+ * @version 1.0
+ */
+public class TransitMap {
+ private Line transitMapLine;
+ private LinkedList transitMapStations;
+
+ public TransitMap(Line transitMapLine, LinkedList transitMapStations) {
+ this.transitMapLine = transitMapLine;
+ this.transitMapStations = transitMapStations;
+ }
+
+ public Line getTransitMapLine() {
+ return transitMapLine;
+ }
+
+ public LinkedList getTransitMapStations() {
+ return transitMapStations;
+ }
+}
diff --git a/src/main/java/subway/domain/LineRepository.java b/src/main/java/subway/repository/LineRepository.java
similarity index 59%
rename from src/main/java/subway/domain/LineRepository.java
rename to src/main/java/subway/repository/LineRepository.java
index 49132ddb6..89d703b28 100644
--- a/src/main/java/subway/domain/LineRepository.java
+++ b/src/main/java/subway/repository/LineRepository.java
@@ -1,10 +1,15 @@
-package subway.domain;
+package subway.repository;
+
+import subway.domain.Line;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
+/**
+ * LineRepository.java : 지하철 노선에 대한 저장소 클래스
+ */
public class LineRepository {
private static final List lines = new ArrayList<>();
@@ -19,4 +24,13 @@ public static void addLine(Line line) {
public static boolean deleteLineByName(String name) {
return lines.removeIf(line -> Objects.equals(line.getName(), name));
}
+
+ public static List lineNames() {
+ List lineNames = new ArrayList<>();
+
+ for (Line line : lines) {
+ lineNames.add(line.getName());
+ }
+ return lineNames;
+ }
}
diff --git a/src/main/java/subway/domain/StationRepository.java b/src/main/java/subway/repository/StationRepository.java
similarity index 57%
rename from src/main/java/subway/domain/StationRepository.java
rename to src/main/java/subway/repository/StationRepository.java
index b7245c0f3..71088adc1 100644
--- a/src/main/java/subway/domain/StationRepository.java
+++ b/src/main/java/subway/repository/StationRepository.java
@@ -1,10 +1,18 @@
-package subway.domain;
+package subway.repository;
+
+import subway.domain.Station;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
+/**
+ * StationRepository.java : 지하철 역에 대한 저장소 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
public class StationRepository {
private static final List stations = new ArrayList<>();
@@ -19,4 +27,13 @@ public static void addStation(Station station) {
public static boolean deleteStation(String name) {
return stations.removeIf(station -> Objects.equals(station.getName(), name));
}
+
+ public static List stationNames() {
+ List stationNames = new ArrayList<>();
+
+ for (Station station : stations) {
+ stationNames.add(station.getName());
+ }
+ return stationNames;
+ }
}
diff --git a/src/main/java/subway/repository/TransitMapRepository.java b/src/main/java/subway/repository/TransitMapRepository.java
new file mode 100644
index 000000000..7ceb07069
--- /dev/null
+++ b/src/main/java/subway/repository/TransitMapRepository.java
@@ -0,0 +1,78 @@
+package subway.repository;
+
+import subway.domain.Line;
+import subway.domain.Station;
+import subway.domain.TransitMap;
+
+import java.util.*;
+
+/**
+ * TransitMapRepository.java : 지하철 노선도에 대한 저장소 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class TransitMapRepository {
+ private static final Map> transitMaps = new LinkedHashMap<>();
+
+ public static Map> transitMaps() {
+ return Collections.unmodifiableMap(transitMaps);
+ }
+
+ public static void addTransitMap(TransitMap transitMap) {
+ transitMaps.put(transitMap.getTransitMapLine(), transitMap.getTransitMapStations());
+ }
+
+ public static void deleteTransitMap(Line line) {
+ transitMaps.remove(line);
+ }
+
+ public static List transitMapsLineNames() {
+ List transitMapsLineNames = new ArrayList<>();
+
+ for (Map.Entry> entry : transitMaps.entrySet()) {
+ Line key = entry.getKey();
+ transitMapsLineNames.add(key.getName());
+ }
+ return transitMapsLineNames;
+ }
+
+ public static List> transitMapsStationNames() {
+ List> transitMapsStationNames = new ArrayList<>();
+
+ for (Map.Entry> entry : transitMaps.entrySet()) {
+ LinkedList transitMapStationNames = new LinkedList<>();
+ LinkedList values = entry.getValue();
+
+ for (Station value : values) {
+ transitMapStationNames.add(value.getName());
+ }
+ transitMapsStationNames.add(transitMapStationNames);
+ }
+ return transitMapsStationNames;
+ }
+
+ public static List transitMapStations(String lineName) {
+ List transitMapStations = new ArrayList<>();
+
+ for (Map.Entry> entry : transitMaps.entrySet()) {
+ Line key = entry.getKey();
+ String keyName = key.getName();
+ LinkedList values = entry.getValue();
+
+ if (keyName.equals(lineName)) {
+ transitMapStations = getTransitMapStations(values);
+ }
+ }
+ return transitMapStations;
+ }
+
+ public static List getTransitMapStations(LinkedList values) {
+ List transitMapStations = new ArrayList<>();
+
+ for (Station value : values) {
+ transitMapStations.add(value.getName());
+ }
+ return transitMapStations;
+ }
+}
diff --git a/src/main/java/subway/service/initialization/LineInitialization.java b/src/main/java/subway/service/initialization/LineInitialization.java
new file mode 100644
index 000000000..ff32e0f62
--- /dev/null
+++ b/src/main/java/subway/service/initialization/LineInitialization.java
@@ -0,0 +1,19 @@
+package subway.service.initialization;
+
+import subway.domain.Line;
+import subway.repository.LineRepository;
+import subway.type.LineType;
+
+/**
+ * LineInitialization.java : 지하철 노선 초기화에 대한 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class LineInitialization {
+ public static void initializeLines() {
+ LineRepository.addLine(new Line(LineType.TWO.getLine()));
+ LineRepository.addLine(new Line(LineType.THREE.getLine()));
+ LineRepository.addLine(new Line(LineType.SHINBUNDANG.getLine()));
+ }
+}
diff --git a/src/main/java/subway/service/initialization/StationInitialization.java b/src/main/java/subway/service/initialization/StationInitialization.java
new file mode 100644
index 000000000..14e5d05fe
--- /dev/null
+++ b/src/main/java/subway/service/initialization/StationInitialization.java
@@ -0,0 +1,23 @@
+package subway.service.initialization;
+
+import subway.domain.Station;
+import subway.repository.StationRepository;
+import subway.type.StationType;
+
+/**
+ * StationInitialization.java : 지하철 역 초기화에 대한 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class StationInitialization {
+ public static void initializeStations() {
+ StationRepository.addStation(new Station(StationType.EDUCATION_UNIVERSITY.getStation()));
+ StationRepository.addStation(new Station(StationType.GANGNAM.getStation()));
+ StationRepository.addStation(new Station(StationType.YEOKSAM.getStation()));
+ StationRepository.addStation(new Station(StationType.NAMBU_BUS_TERMINAL.getStation()));
+ StationRepository.addStation(new Station(StationType.YANGJAE.getStation()));
+ StationRepository.addStation(new Station(StationType.YANGJAE_CITIZENS_FOREST.getStation()));
+ StationRepository.addStation(new Station(StationType.MAEBONG.getStation()));
+ }
+}
diff --git a/src/main/java/subway/service/initialization/TransitMapInitialization.java b/src/main/java/subway/service/initialization/TransitMapInitialization.java
new file mode 100644
index 000000000..19830e2a7
--- /dev/null
+++ b/src/main/java/subway/service/initialization/TransitMapInitialization.java
@@ -0,0 +1,97 @@
+package subway.service.initialization;
+
+import subway.domain.Line;
+import subway.domain.Station;
+import subway.domain.TransitMap;
+import subway.repository.LineRepository;
+import subway.repository.StationRepository;
+import subway.repository.TransitMapRepository;
+import subway.type.StationType;
+
+import java.util.*;
+
+/**
+ * TransitMapInitialization.java : 지하철 노선도 초기화에 대한 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class TransitMapInitialization {
+ private static final List stations = StationRepository.stations();
+
+ public static void initializeTransitMaps() {
+ List lines = getInitializationLines();
+ List> lineStations = getInitializationStations();
+
+ for (int i = 0; i < lines.size(); i++) {
+ TransitMapRepository.addTransitMap(new TransitMap(lines.get(i), lineStations.get(i)));
+ }
+ }
+
+ public static List getInitializationLines() {
+ return LineRepository.lines();
+ }
+
+ public static List> getInitializationStations() {
+ List> lineStations = new ArrayList<>();
+ LinkedList lineTwoStations = new LinkedList<>();
+ LinkedList lineThreeStations = new LinkedList<>();
+ LinkedList lineShinbundangStations = new LinkedList<>();
+
+ for (Station station : stations) {
+ getLineTwoStations(station, lineTwoStations);
+ getLineThreeStations(station, lineThreeStations);
+ getLineShinbundangStations(station, lineShinbundangStations);
+ }
+
+ lineStations.add(lineTwoStations);
+ lineStations.add(lineThreeStations);
+ lineStations.add(lineShinbundangStations);
+ return lineStations;
+ }
+
+ public static void getLineTwoStations(Station station, List lineTwoStations) {
+ String stationName = station.getName();
+
+ if (stationName.equals(StationType.EDUCATION_UNIVERSITY.getStation())) {
+ lineTwoStations.add(station);
+ }
+ if (stationName.equals(StationType.GANGNAM.getStation())) {
+ lineTwoStations.add(station);
+ }
+ if (stationName.equals(StationType.YEOKSAM.getStation())) {
+ lineTwoStations.add(station);
+ }
+ }
+
+ public static void getLineThreeStations(Station station, List lineThreeStations) {
+ String stationName = station.getName();
+
+ if (stationName.equals(StationType.EDUCATION_UNIVERSITY.getStation())) {
+ lineThreeStations.add(station);
+ }
+ if (stationName.equals(StationType.NAMBU_BUS_TERMINAL.getStation())) {
+ lineThreeStations.add(station);
+ }
+ if (stationName.equals(StationType.YANGJAE.getStation())) {
+ lineThreeStations.add(station);
+ }
+ if (stationName.equals(StationType.MAEBONG.getStation())) {
+ lineThreeStations.add(station);
+ }
+ }
+
+ public static void getLineShinbundangStations(Station station, List lineShinbundangStations) {
+ String stationName = station.getName();
+
+ if (stationName.equals(StationType.GANGNAM.getStation())) {
+ lineShinbundangStations.add(station);
+ }
+ if (stationName.equals(StationType.YANGJAE.getStation())) {
+ lineShinbundangStations.add(station);
+ }
+ if (stationName.equals(StationType.YANGJAE_CITIZENS_FOREST.getStation())) {
+ lineShinbundangStations.add(station);
+ }
+ }
+}
diff --git a/src/main/java/subway/service/line/LineService.java b/src/main/java/subway/service/line/LineService.java
new file mode 100644
index 000000000..bf3d7e68c
--- /dev/null
+++ b/src/main/java/subway/service/line/LineService.java
@@ -0,0 +1,105 @@
+package subway.service.line;
+
+import subway.domain.Line;
+import subway.domain.Station;
+import subway.domain.Stations;
+import subway.repository.LineRepository;
+import subway.service.subway.SubwayService;
+import subway.service.util.FeatureInterface;
+import subway.service.line.addition.LineAdditionService;
+import subway.service.line.addition.LineAdditionValidation;
+import subway.service.line.deletion.LineDeletionService;
+import subway.service.line.deletion.LineDeletionValidation;
+import subway.service.line.show.LineShowService;
+import subway.type.InputType;
+import subway.view.input.line.LineScanView;
+import subway.view.output.util.FeatureChoiceExceptionView;
+import subway.view.output.util.ScreenView;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Scanner;
+
+/**
+ * LineService.java : 지하철 노선 비즈니스 로직에 대한 서비스 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class LineService extends SubwayService implements FeatureInterface {
+ @Override
+ public void manage(Scanner scanner){
+ LineService lineService = new LineService();
+
+ System.out.println();
+ while (true) {
+ String lineInput = LineScanView.scanLineInputForManagement(scanner);
+
+ if (lineService.choose(lineInput, scanner)) {
+ break;
+ }
+ }
+ }
+
+ @Override
+ public boolean choose(String input, Scanner scanner) {
+ if (input.equals(InputType.INPUT_ONE.getInput())) {
+ return add(scanner);
+ }
+ if (input.equals(InputType.INPUT_TWO.getInput())) {
+ return delete(scanner);
+ }
+ if (input.equals(InputType.INPUT_THREE.getInput())) {
+ return show();
+ }
+ if (input.equals(InputType.INPUT_BACK.getInput())) {
+ return ScreenView.printNewLine();
+ }
+ return FeatureChoiceExceptionView.printInvalidChoiceException();
+ }
+
+ @Override
+ public boolean add(Scanner scanner) {
+ LineAdditionValidation lineAdditionValidation = new LineAdditionValidation();
+
+ String lineName = LineScanView.scanLineNameForAddition(scanner);
+ String upStationName = LineScanView.scanUpStationNameForAddition(scanner);
+ String downStationName = LineScanView.scanDownStationNameForAddition(scanner);
+
+ if (lineAdditionValidation.checkNameAdditionValidation(
+ lineName, new Stations(upStationName, downStationName))) {
+ LinkedList stationNames =
+ LineAdditionService.addStationNames(upStationName, downStationName);
+ LineAdditionService.addLineByStationNames(lineName, stationNames);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean delete(Scanner scanner) {
+ LineDeletionValidation lineNameDeletionValidation = new LineDeletionValidation();
+
+ String lineName = LineScanView.scanLineNameForDeletion(scanner);
+
+ Line lineForDeletion = LineDeletionService.getLineForDeletion(lineName);
+
+ if (lineNameDeletionValidation.checkNameDeletionValidation(lineName)) {
+ LineDeletionService.deleteLineInTransitMap(lineForDeletion);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean show() {
+ LineShowService lineShowService = new LineShowService();
+
+ StringBuilder stringBuilder = new StringBuilder();
+ List lineNames = LineRepository.lineNames();
+
+ lineShowService.readNames(stringBuilder, lineNames);
+ System.out.println(stringBuilder);
+ return true;
+ }
+}
diff --git a/src/main/java/subway/service/line/addition/LineAdditionService.java b/src/main/java/subway/service/line/addition/LineAdditionService.java
new file mode 100644
index 000000000..5d7ad0dc5
--- /dev/null
+++ b/src/main/java/subway/service/line/addition/LineAdditionService.java
@@ -0,0 +1,40 @@
+package subway.service.line.addition;
+
+import subway.domain.Line;
+import subway.domain.Station;
+import subway.domain.TransitMap;
+import subway.repository.LineRepository;
+import subway.repository.TransitMapRepository;
+import subway.view.output.line.LineInformationView;
+
+import java.util.LinkedList;
+
+/**
+ * LineAdditionService.java : 지하철 노선 추가 로직에 대한 서비스 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class LineAdditionService {
+ public static LinkedList addStationNames(String upStationName, String downStationName) {
+ LinkedList stationNames = new LinkedList<>();
+
+ stationNames.add(new Station(upStationName));
+ stationNames.add(new Station(downStationName));
+ return stationNames;
+ }
+
+ public static void addLineByStationNames(String lineName, LinkedList stationNames) {
+ Line line = addLineByLineName(lineName);
+ TransitMapRepository.addTransitMap(new TransitMap(line, stationNames));
+ LineInformationView.printLineAdditionInformation();
+ System.out.println();
+ }
+
+ public static Line addLineByLineName(String lineName) {
+ Line line = new Line(lineName);
+
+ LineRepository.addLine(line);
+ return line;
+ }
+}
diff --git a/src/main/java/subway/service/line/addition/LineAdditionValidation.java b/src/main/java/subway/service/line/addition/LineAdditionValidation.java
new file mode 100644
index 000000000..37ef6c591
--- /dev/null
+++ b/src/main/java/subway/service/line/addition/LineAdditionValidation.java
@@ -0,0 +1,81 @@
+package subway.service.line.addition;
+
+import subway.domain.Stations;
+import subway.repository.LineRepository;
+import subway.repository.StationRepository;
+import subway.service.station.addition.StationAdditionValidation;
+import subway.type.BoundaryType;
+import subway.type.CheckType;
+import subway.view.output.line.LineExceptionView;
+
+import java.util.List;
+
+/**
+ * LineAdditionValidation.java : 지하철 노선 추가 로직 검증에 대한 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class LineAdditionValidation extends StationAdditionValidation {
+ public boolean checkNameAdditionValidation(String lineName, Stations stations) {
+ if (!checkLineNameAdditionValidation(lineName)) {
+ return false;
+ }
+ return checkStationNamesAdditionValidation(
+ stations.getUpStationName(),stations.getDownStationName());
+ }
+
+ public boolean checkLineNameAdditionValidation(String lineName) {
+ if (checkNameDuplication(lineName)) {
+ LineExceptionView.printInvalidLineNameException();
+ return false;
+ }
+ if (checkNameLength(lineName)) {
+ LineExceptionView.printInvalidLineNameLengthException();
+ return false;
+ }
+ if (checkNameLastCharacter(lineName)) {
+ LineExceptionView.printInvalidLineNameLastCharacterException();
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public boolean checkNameDuplication(String lineName) {
+ List lineNames = LineRepository.lineNames();
+ return lineNames.contains(lineName);
+ }
+
+ @Override
+ public boolean checkNameLength(String lineName) {
+ return lineName.length() < BoundaryType.NAME_LENGTH_BOUNDARY.getBoundary();
+ }
+
+ @Override
+ public boolean checkNameLastCharacter(String lineName) {
+ String lastCharacter = lineName.substring(lineName.length() - 1);
+ return !lastCharacter.equals(CheckType.LINE_CHECK.getCheck());
+ }
+
+ public boolean checkStationNamesAdditionValidation(String upStationName, String downStationName) {
+ if (checkStationNamesExistence(upStationName, downStationName)) {
+ LineExceptionView.printInvalidLineStationNamesExistenceException();
+ return false;
+ }
+ if (checkSameStationNames(upStationName, downStationName)) {
+ LineExceptionView.printInvalidLineSameStationNamesException();
+ return false;
+ }
+ return true;
+ }
+
+ public static boolean checkStationNamesExistence(String upStationName, String downStationName) {
+ List stationNames = StationRepository.stationNames();
+ return !((stationNames.contains(upStationName)) && (stationNames.contains(downStationName)));
+ }
+
+ public static boolean checkSameStationNames(String upStationName, String downStationName) {
+ return upStationName.equals(downStationName);
+ }
+}
diff --git a/src/main/java/subway/service/line/deletion/LineDeletionService.java b/src/main/java/subway/service/line/deletion/LineDeletionService.java
new file mode 100644
index 000000000..a0e183b69
--- /dev/null
+++ b/src/main/java/subway/service/line/deletion/LineDeletionService.java
@@ -0,0 +1,35 @@
+package subway.service.line.deletion;
+
+import subway.domain.Line;
+import subway.repository.LineRepository;
+import subway.repository.TransitMapRepository;
+import subway.view.output.line.LineInformationView;
+
+import java.util.List;
+
+/**
+ * LineDeletionService.java : 지하철 노선 삭제 로직에 대한 서비스 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class LineDeletionService {
+ public static Line getLineForDeletion(String lineName) {
+ Line lineForDeletion = new Line(lineName);
+ List lines = LineRepository.lines();
+
+ for (Line line : lines) {
+ if (line.getName().equals(lineName)) {
+ lineForDeletion = line;
+ break;
+ }
+ }
+ return lineForDeletion;
+ }
+
+ public static void deleteLineInTransitMap(Line lineForDeletion) {
+ TransitMapRepository.deleteTransitMap(lineForDeletion);
+ LineInformationView.printLineDeletionInformation();
+ System.out.println();
+ }
+}
diff --git a/src/main/java/subway/service/line/deletion/LineDeletionValidation.java b/src/main/java/subway/service/line/deletion/LineDeletionValidation.java
new file mode 100644
index 000000000..79e0ed5da
--- /dev/null
+++ b/src/main/java/subway/service/line/deletion/LineDeletionValidation.java
@@ -0,0 +1,22 @@
+package subway.service.line.deletion;
+
+import subway.repository.LineRepository;
+import subway.service.station.deletion.StationDeletionValidation;
+import subway.view.output.line.LineExceptionView;
+
+/**
+ * LineDeletionValidation.java : 지하철 노선 삭제 로직 검증에 대한 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class LineDeletionValidation extends StationDeletionValidation {
+ @Override
+ public boolean checkNameDeletionValidation(String lineName) {
+ if (!LineRepository.deleteLineByName(lineName)) {
+ LineExceptionView.printInvalidLineNameExistenceException();
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/src/main/java/subway/service/line/show/LineShowService.java b/src/main/java/subway/service/line/show/LineShowService.java
new file mode 100644
index 000000000..2e800524f
--- /dev/null
+++ b/src/main/java/subway/service/line/show/LineShowService.java
@@ -0,0 +1,37 @@
+package subway.service.line.show;
+
+import subway.service.station.show.StationShowService;
+import subway.type.InformationType;
+import subway.type.TextType;
+
+import java.util.List;
+
+/**
+ * LineShowService.java : 지하철 노선 조회 로직에 대한 서비스 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class LineShowService extends StationShowService {
+ @Override
+ public void readNames(StringBuilder stringBuilder, List lineNames) {
+ appendListText(stringBuilder);
+ appendNames(stringBuilder, lineNames);
+ }
+
+ @Override
+ public void appendListText(StringBuilder stringBuilder) {
+ stringBuilder.append(TextType.NEW_LINE.getText())
+ .append(TextType.LINE_LIST_TEXT.getText())
+ .append(TextType.NEW_LINE.getText());
+ }
+
+ @Override
+ public void appendNames(StringBuilder stringBuilder, List lineNames) {
+ for (String lineName : lineNames) {
+ stringBuilder.append(InformationType.INFORMATION.getInformation())
+ .append(lineName)
+ .append(TextType.NEW_LINE.getText());
+ }
+ }
+}
diff --git a/src/main/java/subway/service/section/SectionService.java b/src/main/java/subway/service/section/SectionService.java
new file mode 100644
index 000000000..c8c3e73dd
--- /dev/null
+++ b/src/main/java/subway/service/section/SectionService.java
@@ -0,0 +1,85 @@
+package subway.service.section;
+
+import subway.domain.Section;
+import subway.service.section.addition.SectionAdditionService;
+import subway.service.section.addition.SectionAdditionValidation;
+import subway.service.section.deletion.SectionDeletionService;
+import subway.service.section.deletion.SectionDeletionValidation;
+import subway.service.station.StationService;
+import subway.type.InputType;
+import subway.view.input.section.SectionScanView;
+import subway.view.output.util.FeatureChoiceExceptionView;
+import subway.view.output.util.ScreenView;
+import subway.view.output.section.SectionInformationView;
+
+import java.util.Scanner;
+
+/**
+ * SectionService.java : 지하철 구간 비즈니스 로직에 대한 서비스 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class SectionService extends StationService {
+ @Override
+ public void manage(Scanner scanner) {
+ SectionService sectionService = new SectionService();
+
+ System.out.println();
+ while (true) {
+ String sectionInput = SectionScanView.scanSectionInputForManagement(scanner);
+
+ if (sectionService.choose(sectionInput, scanner)) {
+ break;
+ }
+ }
+ }
+
+ @Override
+ public boolean choose(String input, Scanner scanner) {
+ if (input.equals(InputType.INPUT_ONE.getInput())) {
+ return add(scanner);
+ }
+ if (input.equals(InputType.INPUT_TWO.getInput())) {
+ return delete(scanner);
+ }
+ if (input.equals(InputType.INPUT_BACK.getInput())) {
+ return ScreenView.printNewLine();
+ }
+ return FeatureChoiceExceptionView.printInvalidChoiceException();
+ }
+
+ @Override
+ public boolean add(Scanner scanner) {
+ SectionAdditionValidation sectionAdditionValidation = new SectionAdditionValidation();
+
+ String lineName = SectionScanView.scanLineNameForAddition(scanner);
+ String stationName = SectionScanView.scanStationNameForAddition(scanner);
+ String order = SectionScanView.scanOrderForAddition(scanner);
+ Section section = new Section(lineName, stationName, order);
+
+ if (sectionAdditionValidation.checkSectionAdditionValidation(section)) {
+ SectionAdditionService.addSection(section);
+ SectionInformationView.printSectionAdditionInformation();
+ System.out.println();
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean delete(Scanner scanner) {
+ SectionDeletionValidation sectionDeletionValidation = new SectionDeletionValidation();
+
+ String lineName = SectionScanView.scanLineNameForDeletion(scanner);
+ String stationName = SectionScanView.scanStationNameForDeletion(scanner);
+
+ if (sectionDeletionValidation.checkSectionDeletionValidation(lineName, stationName)) {
+ SectionDeletionService.deleteSection(lineName, stationName);
+ SectionInformationView.printSectionDeletionInformation();
+ System.out.println();
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/subway/service/section/addition/SectionAdditionService.java b/src/main/java/subway/service/section/addition/SectionAdditionService.java
new file mode 100644
index 000000000..37bf7212f
--- /dev/null
+++ b/src/main/java/subway/service/section/addition/SectionAdditionService.java
@@ -0,0 +1,47 @@
+package subway.service.section.addition;
+
+import subway.domain.Line;
+import subway.domain.Section;
+import subway.domain.Station;
+import subway.repository.TransitMapRepository;
+
+import java.util.*;
+
+/**
+ * SectionAdditionService.java : 지하철 구간 추가 로직에 대한 서비스 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class SectionAdditionService {
+ public static LinkedList getStationValuesInLine(String lineName) {
+ Map> transitMaps = TransitMapRepository.transitMaps();
+ LinkedList stationValues = new LinkedList<>();
+
+ for (Map.Entry> entry : transitMaps.entrySet()) {
+ Line key = entry.getKey();
+ String keyName = key.getName();
+ LinkedList values = entry.getValue();
+
+ if (keyName.equals(lineName)) {
+ stationValues = values;
+ }
+ }
+ return stationValues;
+ }
+
+ public static void addSection(Section section) {
+ Map> transitMaps = TransitMapRepository.transitMaps();
+ int orderNumber = Integer.parseInt(section.getOrder()) - 1;
+
+ for (Map.Entry> entry : transitMaps.entrySet()) {
+ Line key = entry.getKey();
+ String keyName = key.getName();
+ LinkedList values = entry.getValue();
+
+ if (keyName.equals(section.getLineName())) {
+ values.add(orderNumber, new Station(section.getStationName()));
+ }
+ }
+ }
+}
diff --git a/src/main/java/subway/service/section/addition/SectionAdditionValidation.java b/src/main/java/subway/service/section/addition/SectionAdditionValidation.java
new file mode 100644
index 000000000..2ae821184
--- /dev/null
+++ b/src/main/java/subway/service/section/addition/SectionAdditionValidation.java
@@ -0,0 +1,92 @@
+package subway.service.section.addition;
+
+import subway.domain.Section;
+import subway.domain.Station;
+import subway.repository.LineRepository;
+import subway.repository.StationRepository;
+import subway.type.BoundaryType;
+import subway.view.output.line.LineExceptionView;
+import subway.view.output.section.SectionExceptionView;
+import subway.view.output.station.StationExceptionView;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * SectionAdditionValidation.java : 지하철 구간 추가 로직 검증에 대한 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class SectionAdditionValidation {
+ public boolean checkSectionAdditionValidation(Section section) {
+ if (!checkNamesValidation(section.getLineName(), section.getStationName())) {
+ return false;
+ }
+ return checkOrderValidation(section.getLineName(), section.getOrder());
+ }
+
+ public boolean checkNamesValidation(String lineName, String stationName) {
+ if (!checkLineNameExistence(lineName)) {
+ LineExceptionView.printInvalidLineNameExistenceException();
+ return false;
+ }
+ if (!checkStationNameExistence(stationName)) {
+ StationExceptionView.printInvalidStationNameExistenceException();
+ return false;
+ }
+ if (checkStationNameInLineExistence(lineName, stationName)) {
+ SectionExceptionView.printInvalidSectionStationNameInLineExistenceException();
+ return false;
+ }
+ return true;
+ }
+
+ public static boolean checkLineNameExistence(String lineName) {
+ List lineNames = LineRepository.lineNames();
+ return lineNames.contains(lineName);
+ }
+
+ public static boolean checkStationNameExistence(String stationName) {
+ List stationNames = StationRepository.stationNames();
+ return stationNames.contains(stationName);
+ }
+
+ public static boolean checkStationNameInLineExistence(String lineName, String stationName) {
+ List stationNameValues = new ArrayList<>();
+ LinkedList stationValues
+ = SectionAdditionService.getStationValuesInLine(lineName);
+
+ for (Station stationValue : stationValues) {
+ stationNameValues.add(stationValue.getName());
+ }
+ return stationNameValues.contains(stationName);
+ }
+
+ public boolean checkOrderValidation(String lineName, String order) {
+ if (checkOrderReplacementLength(order)) {
+ SectionExceptionView.printInvalidSectionOrderReplacementLengthException();
+ return false;
+ }
+ if (Integer.parseInt(order) < BoundaryType.ORDER_NUMBER_BOUNDARY.getBoundary()) {
+ SectionExceptionView.printInvalidSectionOrderNumberException();
+ return false;
+ }
+ if (checkOrderNumberByStations(lineName, Integer.parseInt(order))) {
+ SectionExceptionView.printInvalidSectionOrderNumberByStationsException();
+ return false;
+ }
+ return true;
+ }
+
+ public static boolean checkOrderReplacementLength(String order) {
+ return order.replaceAll("[^0-9]", "").length()
+ == BoundaryType.ORDER_REPLACEMENT_LENGTH_BOUNDARY.getBoundary();
+ }
+
+ public static boolean checkOrderNumberByStations(String lineName, int orderNumber) {
+ LinkedList stationValues = SectionAdditionService.getStationValuesInLine(lineName);
+ return stationValues.size() + 1 < orderNumber;
+ }
+}
diff --git a/src/main/java/subway/service/section/deletion/SectionDeletionService.java b/src/main/java/subway/service/section/deletion/SectionDeletionService.java
new file mode 100644
index 000000000..f5630d549
--- /dev/null
+++ b/src/main/java/subway/service/section/deletion/SectionDeletionService.java
@@ -0,0 +1,44 @@
+package subway.service.section.deletion;
+
+import subway.domain.Line;
+import subway.domain.Station;
+import subway.repository.TransitMapRepository;
+
+import java.util.LinkedList;
+import java.util.Map;
+
+/**
+ * SectionDeletionService.java : 지하철 구간 삭제 로직에 대한 서비스 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class SectionDeletionService {
+ public static void deleteSection(String lineName, String stationName) {
+ Map> transitMaps = TransitMapRepository.transitMaps();
+
+ for (Map.Entry> entry : transitMaps.entrySet()) {
+ Line key = entry.getKey();
+ String keyName = key.getName();
+ LinkedList values = entry.getValue();
+
+ if (keyName.equals(lineName)) {
+ int order = findOrder(values, stationName);
+ values.remove(order);
+ }
+ }
+ }
+
+ public static int findOrder(LinkedList values, String stationName) {
+ int order = 0;
+
+ for (Station value : values) {
+ String valueName = value.getName();
+
+ if (valueName.equals(stationName)) {
+ order = values.indexOf(value);
+ }
+ }
+ return order;
+ }
+}
diff --git a/src/main/java/subway/service/section/deletion/SectionDeletionValidation.java b/src/main/java/subway/service/section/deletion/SectionDeletionValidation.java
new file mode 100644
index 000000000..0cbc53948
--- /dev/null
+++ b/src/main/java/subway/service/section/deletion/SectionDeletionValidation.java
@@ -0,0 +1,66 @@
+package subway.service.section.deletion;
+
+import subway.repository.TransitMapRepository;
+import subway.type.BoundaryType;
+import subway.view.output.line.LineExceptionView;
+import subway.view.output.section.SectionExceptionView;
+import subway.view.output.station.StationExceptionView;
+
+import java.util.List;
+
+/**
+ * SectionDeletionValidation.java : 지하철 구간 삭제 로직 검증에 대한 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class SectionDeletionValidation {
+ public boolean checkSectionDeletionValidation(String lineName, String stationName) {
+ if (!checkLineNameValidation(lineName)) {
+ return false;
+ }
+ if (!checkStationNameValidation(lineName, stationName)) {
+ return false;
+ }
+ return checkStationsInLineValidation(lineName);
+ }
+
+ public boolean checkLineNameValidation(String lineName) {
+ if (!checkLineNameInTransitMapExistence(lineName)) {
+ LineExceptionView.printInvalidLineNameExistenceException();
+ return false;
+ }
+ return true;
+ }
+
+ public static boolean checkLineNameInTransitMapExistence(String lineName) {
+ List transitMapsLineNames = TransitMapRepository.transitMapsLineNames();
+ return transitMapsLineNames.contains(lineName);
+ }
+
+ public boolean checkStationNameValidation(String lineName, String stationName) {
+ if (!checkStationNameInTransitMapExistence(lineName, stationName)) {
+ StationExceptionView.printInvalidStationNameExistenceException();
+ return false;
+ }
+ return true;
+ }
+
+ public static boolean checkStationNameInTransitMapExistence(String lienName, String stationName) {
+ List transitMapStations = TransitMapRepository.transitMapStations(lienName);
+ return transitMapStations.contains(stationName);
+ }
+
+ private boolean checkStationsInLineValidation(String lineName) {
+ if (checkStationsInLineExistence(lineName)) {
+ SectionExceptionView.printInvalidNumberOfSectionStationsInLineException();
+ return false;
+ }
+ return true;
+ }
+
+ public static boolean checkStationsInLineExistence(String lineName) {
+ List transitMapStations = TransitMapRepository.transitMapStations(lineName);
+ return transitMapStations.size() <= BoundaryType.STATIONS_IN_LINE_BOUNDARY.getBoundary();
+ }
+}
diff --git a/src/main/java/subway/service/station/StationService.java b/src/main/java/subway/service/station/StationService.java
new file mode 100644
index 000000000..187e4b433
--- /dev/null
+++ b/src/main/java/subway/service/station/StationService.java
@@ -0,0 +1,78 @@
+package subway.service.station;
+
+import subway.domain.Station;
+import subway.repository.StationRepository;
+import subway.service.util.ChoiceService;
+import subway.service.subway.SubwayService;
+import subway.service.util.FeatureInterface;
+import subway.service.station.addition.StationAdditionValidation;
+import subway.service.station.deletion.StationDeletionValidation;
+import subway.service.station.show.StationShowService;
+import subway.view.input.station.StationScanView;
+import subway.view.output.station.StationInformationView;
+
+import java.util.List;
+import java.util.Scanner;
+
+/**
+ * StationService.java : 지하철 역 비즈니스 로직에 대한 서비스 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class StationService extends SubwayService implements FeatureInterface {
+ @Override
+ public void manage(Scanner scanner) {
+ ChoiceService stateService = new ChoiceService();
+
+ System.out.println();
+ while (true) {
+ String stationInput = StationScanView.scanStationInputForManagement(scanner);
+
+ if (stateService.choose(stationInput, scanner)) {
+ break;
+ }
+ }
+ }
+
+ @Override
+ public boolean add(Scanner scanner) {
+ StationAdditionValidation stationAdditionValidation = new StationAdditionValidation();
+
+ String stationName = StationScanView.scanStationNameForAddition(scanner);
+
+ if (stationAdditionValidation.checkNameAdditionValidation(stationName)) {
+ StationRepository.addStation(new Station(stationName));
+ StationInformationView.printStationAdditionInformation();
+ System.out.println();
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean delete(Scanner scanner) {
+ StationDeletionValidation stationNameDeletionValidation = new StationDeletionValidation();
+
+ String stationName = StationScanView.scanStationNameForDeletion(scanner);
+
+ if (stationNameDeletionValidation.checkNameDeletionValidation(stationName)) {
+ StationInformationView.printStationDeletionInformation();
+ System.out.println();
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean show() {
+ StationShowService stationShowService = new StationShowService();
+
+ StringBuilder stringBuilder = new StringBuilder();
+ List stationNames = StationRepository.stationNames();
+
+ stationShowService.readNames(stringBuilder, stationNames);
+ System.out.println(stringBuilder);
+ return true;
+ }
+}
diff --git a/src/main/java/subway/service/station/addition/StationAdditionValidation.java b/src/main/java/subway/service/station/addition/StationAdditionValidation.java
new file mode 100644
index 000000000..73eaf68f0
--- /dev/null
+++ b/src/main/java/subway/service/station/addition/StationAdditionValidation.java
@@ -0,0 +1,50 @@
+package subway.service.station.addition;
+
+import subway.repository.StationRepository;
+import subway.type.BoundaryType;
+import subway.type.CheckType;
+import subway.view.output.station.StationExceptionView;
+
+import java.util.List;
+
+/**
+ * StationAdditionValidation.java : 지하철 역 추가 로직 검증에 대한 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class StationAdditionValidation implements StationAdditionValidationInterface {
+ @Override
+ public boolean checkNameAdditionValidation(String stationName) {
+ if (checkNameDuplication(stationName)) {
+ StationExceptionView.printInvalidStationNameException();
+ return false;
+ }
+ if (checkNameLength(stationName)) {
+ StationExceptionView.printInvalidStationNameLengthException();
+ return false;
+ }
+ if (checkNameLastCharacter(stationName)) {
+ StationExceptionView.printInvalidStationNameLastCharacterException();
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public boolean checkNameDuplication(String stationName) {
+ List stationNames = StationRepository.stationNames();
+ return stationNames.contains(stationName);
+ }
+
+ @Override
+ public boolean checkNameLength(String stationName) {
+ return stationName.length() < BoundaryType.NAME_LENGTH_BOUNDARY.getBoundary();
+ }
+
+ @Override
+ public boolean checkNameLastCharacter(String stationName) {
+ String lastCharacter = stationName.substring(stationName.length() - 1);
+ return !lastCharacter.equals(CheckType.STATION_CHECK.getCheck());
+ }
+}
diff --git a/src/main/java/subway/service/station/addition/StationAdditionValidationInterface.java b/src/main/java/subway/service/station/addition/StationAdditionValidationInterface.java
new file mode 100644
index 000000000..d451dd1b0
--- /dev/null
+++ b/src/main/java/subway/service/station/addition/StationAdditionValidationInterface.java
@@ -0,0 +1,14 @@
+package subway.service.station.addition;
+
+/**
+ * StationAdditionValidationInterface.java : 지하철 역 추가 로직 검증에 대한 인터페이스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public interface StationAdditionValidationInterface {
+ boolean checkNameAdditionValidation(String name);
+ boolean checkNameDuplication(String name);
+ boolean checkNameLength(String name);
+ boolean checkNameLastCharacter(String name);
+}
diff --git a/src/main/java/subway/service/station/deletion/StationDeletionValidation.java b/src/main/java/subway/service/station/deletion/StationDeletionValidation.java
new file mode 100644
index 000000000..7055401d3
--- /dev/null
+++ b/src/main/java/subway/service/station/deletion/StationDeletionValidation.java
@@ -0,0 +1,42 @@
+package subway.service.station.deletion;
+
+import subway.repository.StationRepository;
+import subway.repository.TransitMapRepository;
+import subway.view.output.station.StationExceptionView;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * StationDeletionValidation.java : 지하철 역 삭제 로직 검증에 대한 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class StationDeletionValidation implements StationDeletionValidationInterface {
+ @Override
+ public boolean checkNameDeletionValidation(String stationName) {
+ if (checkNameInTransitMap(stationName)) {
+ StationExceptionView.printInvalidStationNameInTransitMapException();
+ return false;
+ }
+ if (!StationRepository.deleteStation(stationName)) {
+ StationExceptionView.printInvalidStationNameExistenceException();
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public boolean checkNameInTransitMap(String stationName) {
+ List> transitMapsStationsNames
+ = TransitMapRepository.transitMapsStationNames();
+
+ for (LinkedList transitMapStationNames : transitMapsStationsNames) {
+ if (transitMapStationNames.contains(stationName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/subway/service/station/deletion/StationDeletionValidationInterface.java b/src/main/java/subway/service/station/deletion/StationDeletionValidationInterface.java
new file mode 100644
index 000000000..e2a0fd80c
--- /dev/null
+++ b/src/main/java/subway/service/station/deletion/StationDeletionValidationInterface.java
@@ -0,0 +1,12 @@
+package subway.service.station.deletion;
+
+/**
+ * StationDeletionValidationInterface.java : 지하철 역 삭제 로직 검증에 대한 인터페이스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public interface StationDeletionValidationInterface {
+ boolean checkNameDeletionValidation(String name);
+ boolean checkNameInTransitMap(String name);
+}
diff --git a/src/main/java/subway/service/station/show/StationShowInterface.java b/src/main/java/subway/service/station/show/StationShowInterface.java
new file mode 100644
index 000000000..26db013f7
--- /dev/null
+++ b/src/main/java/subway/service/station/show/StationShowInterface.java
@@ -0,0 +1,15 @@
+package subway.service.station.show;
+
+import java.util.List;
+
+/**
+ * StationShowInterface.java : 지하철 역 조회 로직에 대한 인터페이스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public interface StationShowInterface {
+ void readNames(StringBuilder stringBuilder, List stationNames);
+ void appendListText(StringBuilder stringBuilder);
+ void appendNames(StringBuilder stringBuilder, List stationNames);
+}
diff --git a/src/main/java/subway/service/station/show/StationShowService.java b/src/main/java/subway/service/station/show/StationShowService.java
new file mode 100644
index 000000000..a73eef1b9
--- /dev/null
+++ b/src/main/java/subway/service/station/show/StationShowService.java
@@ -0,0 +1,36 @@
+package subway.service.station.show;
+
+import subway.type.InformationType;
+import subway.type.TextType;
+
+import java.util.List;
+
+/**
+ * StationShowService.java : 지하철 역 조회 로직에 대한 서비스 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class StationShowService implements StationShowInterface {
+ @Override
+ public void readNames(StringBuilder stringBuilder, List stationNames) {
+ appendListText(stringBuilder);
+ appendNames(stringBuilder, stationNames);
+ }
+
+ @Override
+ public void appendListText(StringBuilder stringBuilder) {
+ stringBuilder.append(TextType.NEW_LINE.getText())
+ .append(TextType.STATION_LIST_TEXT.getText())
+ .append(TextType.NEW_LINE.getText());
+ }
+
+ @Override
+ public void appendNames(StringBuilder stringBuilder, List stationNames) {
+ for (String stationName : stationNames) {
+ stringBuilder.append(InformationType.INFORMATION.getInformation())
+ .append(stationName)
+ .append(TextType.NEW_LINE.getText());
+ }
+ }
+}
diff --git a/src/main/java/subway/service/subway/SubwayInterface.java b/src/main/java/subway/service/subway/SubwayInterface.java
new file mode 100644
index 000000000..a51aa017c
--- /dev/null
+++ b/src/main/java/subway/service/subway/SubwayInterface.java
@@ -0,0 +1,13 @@
+package subway.service.subway;
+
+import java.util.Scanner;
+
+/**
+ * SubwayInterface.java : 지하철 비즈니스 로직에 대한 인터페이스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public interface SubwayInterface {
+ void manage(Scanner scanner);
+}
diff --git a/src/main/java/subway/service/subway/SubwayService.java b/src/main/java/subway/service/subway/SubwayService.java
new file mode 100644
index 000000000..b5c77f336
--- /dev/null
+++ b/src/main/java/subway/service/subway/SubwayService.java
@@ -0,0 +1,72 @@
+package subway.service.subway;
+
+import subway.controller.LineController;
+import subway.controller.SectionController;
+import subway.controller.StationController;
+import subway.controller.TransitMapController;
+import subway.service.util.ChoiceService;
+import subway.type.InputType;
+import subway.view.input.subway.SubwayScanView;
+import subway.view.output.util.FeatureChoiceExceptionView;
+
+import java.util.Scanner;
+
+/**
+ * SubwayService.java : 지하철 비즈니스 로직에 대한 서비스 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class SubwayService extends ChoiceService implements SubwayInterface {
+ @Override
+ public void manage(Scanner scanner) {
+ SubwayService subwayService = new SubwayService();
+
+ while (true) {
+ String mainInput = SubwayScanView.scanMainInputForManagement(scanner);
+
+ if (check(mainInput)) {
+ subwayService.choose(mainInput, scanner);
+ continue;
+ }
+ if (quit(mainInput)) {
+ break;
+ }
+ FeatureChoiceExceptionView.printInvalidFeatureChoiceException();
+ }
+ }
+
+ public static boolean check(String input) {
+ if (input.equals(InputType.INPUT_ONE.getInput())) {
+ return true;
+ }
+ if (input.equals(InputType.INPUT_TWO.getInput())) {
+ return true;
+ }
+ if (input.equals(InputType.INPUT_THREE.getInput())) {
+ return true;
+ }
+ return input.equals(InputType.INPUT_FOUR.getInput());
+ }
+
+ @Override
+ public boolean choose(String input, Scanner scanner) {
+ if (input.equals(InputType.INPUT_ONE.getInput())) {
+ StationController.startStation(scanner);
+ }
+ if (input.equals(InputType.INPUT_TWO.getInput())) {
+ LineController.startLine(scanner);
+ }
+ if (input.equals(InputType.INPUT_THREE.getInput())) {
+ SectionController.startSection(scanner);
+ }
+ if (input.equals(InputType.INPUT_FOUR.getInput())) {
+ TransitMapController.startTransitMap();
+ }
+ return true;
+ }
+
+ public static boolean quit(String mainInput) {
+ return mainInput.equals(InputType.INPUT_QUITTING.getInput());
+ }
+}
diff --git a/src/main/java/subway/service/transitmap/TransitMapService.java b/src/main/java/subway/service/transitmap/TransitMapService.java
new file mode 100644
index 000000000..d53a51d86
--- /dev/null
+++ b/src/main/java/subway/service/transitmap/TransitMapService.java
@@ -0,0 +1,25 @@
+package subway.service.transitmap;
+
+import subway.domain.Line;
+import subway.domain.Station;
+import subway.repository.TransitMapRepository;
+import subway.service.transitmap.show.TransitMapShowService;
+
+import java.util.LinkedList;
+import java.util.Map;
+
+/**
+ * TransitMapService.java : 지하철 노선도 비즈니스 로직에 대한 서비스 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class TransitMapService {
+ public static void showTransitMap() {
+ StringBuilder stringBuilder = new StringBuilder();
+ Map> transitMaps = TransitMapRepository.transitMaps();
+
+ TransitMapShowService.readTransitMap(stringBuilder, transitMaps);
+ System.out.println(stringBuilder);
+ }
+}
diff --git a/src/main/java/subway/service/transitmap/show/TransitMapShowService.java b/src/main/java/subway/service/transitmap/show/TransitMapShowService.java
new file mode 100644
index 000000000..d20be5532
--- /dev/null
+++ b/src/main/java/subway/service/transitmap/show/TransitMapShowService.java
@@ -0,0 +1,74 @@
+package subway.service.transitmap.show;
+
+import subway.domain.Line;
+import subway.domain.Station;
+import subway.repository.TransitMapRepository;
+import subway.type.InformationType;
+import subway.type.TextType;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * TransitMapShowService.java : 지하철 노선도 출력 로직에 대한 서비스 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class TransitMapShowService {
+ public static void readTransitMap(StringBuilder stringBuilder, Map> transitMaps) {
+ appendTransitMapText(stringBuilder);
+
+ for (Map.Entry> entry : transitMaps.entrySet()) {
+ Line key = entry.getKey();
+ LinkedList values = entry.getValue();
+
+ appendKey(stringBuilder, key);
+ appendHorizontalLines(stringBuilder);
+ appendValues(stringBuilder, values);
+
+ if (!checkLastKey(key)) {
+ stringBuilder.append(TextType.NEW_LINE.getText());
+ }
+ }
+ }
+
+ public static void appendTransitMapText(StringBuilder stringBuilder) {
+ stringBuilder.append(TextType.NEW_LINE.getText())
+ .append(TextType.TRANSIT_MAP_TEXT.getText())
+ .append(TextType.NEW_LINE.getText());
+ }
+
+ public static void appendKey(StringBuilder stringBuilder, Line key) {
+ stringBuilder.append(InformationType.INFORMATION.getInformation())
+ .append(key.getName())
+ .append(TextType.NEW_LINE.getText());
+ }
+
+ public static void appendHorizontalLines(StringBuilder stringBuilder) {
+ stringBuilder.append(InformationType.INFORMATION.getInformation())
+ .append(TextType.HORIZONTAL_LINES.getText())
+ .append(TextType.NEW_LINE.getText());
+ }
+
+ public static void appendValues(StringBuilder stringBuilder, LinkedList values) {
+ for (Station value : values) {
+ stringBuilder.append(InformationType.INFORMATION.getInformation())
+ .append(value.getName())
+ .append(TextType.NEW_LINE.getText());
+ }
+ }
+
+ public static boolean checkLastKey(Line key) {
+ Map> transitMaps = TransitMapRepository.transitMaps();
+ Line lastKey = getLastKey(transitMaps);
+ return lastKey.equals(key);
+ }
+
+ public static Line getLastKey(Map> transitMaps) {
+ List lineKeySet = new ArrayList<>(transitMaps.keySet());
+ return lineKeySet.get(lineKeySet.size() - 1);
+ }
+}
diff --git a/src/main/java/subway/service/util/ChoiceInterface.java b/src/main/java/subway/service/util/ChoiceInterface.java
new file mode 100644
index 000000000..aa07e8245
--- /dev/null
+++ b/src/main/java/subway/service/util/ChoiceInterface.java
@@ -0,0 +1,13 @@
+package subway.service.util;
+
+import java.util.Scanner;
+
+/**
+ * ChoiceInterface.java : 지하철 역, 지하철 노선 기능 선택에 대한 인터페이스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public interface ChoiceInterface {
+ boolean choose(String input, Scanner scanner);
+}
diff --git a/src/main/java/subway/service/util/ChoiceService.java b/src/main/java/subway/service/util/ChoiceService.java
new file mode 100644
index 000000000..325001e6c
--- /dev/null
+++ b/src/main/java/subway/service/util/ChoiceService.java
@@ -0,0 +1,35 @@
+package subway.service.util;
+
+import subway.service.station.StationService;
+import subway.type.InputType;
+import subway.view.output.util.FeatureChoiceExceptionView;
+import subway.view.output.util.ScreenView;
+
+import java.util.Scanner;
+
+/**
+ * ChoiceService.java : 지하철 역, 지하철 노선 기능 선택에 대한 서비스 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class ChoiceService implements ChoiceInterface {
+ @Override
+ public boolean choose(String input, Scanner scanner) {
+ StationService stationService = new StationService();
+
+ if (input.equals(InputType.INPUT_ONE.getInput())) {
+ return stationService.add(scanner);
+ }
+ if (input.equals(InputType.INPUT_TWO.getInput())) {
+ return stationService.delete(scanner);
+ }
+ if (input.equals(InputType.INPUT_THREE.getInput())) {
+ return stationService.show();
+ }
+ if (input.equals(InputType.INPUT_BACK.getInput())) {
+ return ScreenView.printNewLine();
+ }
+ return FeatureChoiceExceptionView.printInvalidChoiceException();
+ }
+}
diff --git a/src/main/java/subway/service/util/FeatureInterface.java b/src/main/java/subway/service/util/FeatureInterface.java
new file mode 100644
index 000000000..847f08667
--- /dev/null
+++ b/src/main/java/subway/service/util/FeatureInterface.java
@@ -0,0 +1,15 @@
+package subway.service.util;
+
+import java.util.Scanner;
+
+/**
+ * FeatureInterface.java : 지하철 역, 지하철 노선 기능에 대한 인터페이스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public interface FeatureInterface {
+ boolean add(Scanner scanner);
+ boolean delete(Scanner scanner);
+ boolean show();
+}
diff --git a/src/main/java/subway/type/BoundaryType.java b/src/main/java/subway/type/BoundaryType.java
new file mode 100644
index 000000000..d8fda20af
--- /dev/null
+++ b/src/main/java/subway/type/BoundaryType.java
@@ -0,0 +1,26 @@
+package subway.type;
+
+/**
+ * BoundaryType.java : 경계 값 상수를 모아둔 Enum 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public enum BoundaryType {
+ NAME_LENGTH_BOUNDARY(2),
+
+ ORDER_NUMBER_BOUNDARY(1),
+ ORDER_REPLACEMENT_LENGTH_BOUNDARY(0),
+
+ STATIONS_IN_LINE_BOUNDARY(2);
+
+ private final int boundary;
+
+ BoundaryType(int boundary) {
+ this.boundary = boundary;
+ }
+
+ public int getBoundary() {
+ return boundary;
+ }
+}
diff --git a/src/main/java/subway/type/CheckType.java b/src/main/java/subway/type/CheckType.java
new file mode 100644
index 000000000..9726f1520
--- /dev/null
+++ b/src/main/java/subway/type/CheckType.java
@@ -0,0 +1,22 @@
+package subway.type;
+
+/**
+ * CheckType.java : 입력 값 마지막 문자 확인용 상수를 모아둔 Enum 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public enum CheckType {
+ STATION_CHECK("역"),
+ LINE_CHECK("선");
+
+ private final String check;
+
+ CheckType(String check) {
+ this.check = check;
+ }
+
+ public String getCheck() {
+ return check;
+ }
+}
diff --git a/src/main/java/subway/type/ExceptionType.java b/src/main/java/subway/type/ExceptionType.java
new file mode 100644
index 000000000..b6e4e65b2
--- /dev/null
+++ b/src/main/java/subway/type/ExceptionType.java
@@ -0,0 +1,47 @@
+package subway.type;
+
+/**
+ * ExceptionType.java : 예외 처리 문구 상수를 모아둔 Enum 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public enum ExceptionType {
+ ERROR("[ERROR] "),
+
+ INVALID_FEATURE_CHOICE(ERROR.getException() + "선택할 수 없는 기능입니다.\n"),
+
+ INVALID_STATION_NAME(ERROR.getException() + "이미 등록된 역 이름입니다.\n"),
+ INVALID_STATION_NAME_LENGTH(ERROR.getException() + "2글자 이상의 역 이름을 입력해주세요.\n"),
+ INVALID_STATION_NAME_LAST_CHARACTER(ERROR.getException() + "'역'으로 끝나는 역 이름을 입력해주세요.\n"),
+ INVALID_STATION_NAME_IN_TRANSIT_MAP(ERROR.getException()
+ + "해당 역은 지하철 노선에 등록되어 있어 삭제할 수 없습니다.\n"),
+ INVALID_STATION_NAME_EXISTENCE(ERROR.getException() + "해당 역이 존재하지 않습니다.\n"),
+
+ INVALID_LINE_NAME(ERROR.getException() + "이미 등록된 노선 이름입니다.\n"),
+ INVALID_LINE_NAME_LENGTH(ERROR.getException() + "2글자 이상의 노선 이름을 입력해주세요.\n"),
+ INVALID_LINE_NAME_LAST_CHARACTER(ERROR.getException() + "'선'으로 끝나는 노선 이름을 입력해주세요.\n"),
+ INVALID_LINE_STATION_NAMES_EXISTENCE(ERROR.getException()
+ + "상행 종점역과 하행 종점역은 지하철 역 목록에 존재해야 합니다.\n"),
+ INVALID_LINE_SAME_STATION_NAMES(ERROR.getException() + "상행 종점역과 하행 종점역은 서로 달라야 합니다.\n"),
+ INVALID_LINE_NAME_EXISTENCE(ERROR.getException() + "해당 노선이 존재하지 않습니다.\n"),
+
+ INVALID_SECTION_STATION_NAME_IN_LINE_ALREADY_EXISTENCE(ERROR.getException()
+ + "해당 역은 이미 노선에 존재합니다.\n"),
+ INVALID_SECTION_ORDER_REPLACEMENT_LENGTH(ERROR.getException() + "순서는 숫자로 입력해주세요.\n"),
+ INVALID_SECTION_ORDER_NUMBER(ERROR.getException() + "순서는 양의 정수로 입력해주세요.\n"),
+ INVALID_SECTION_ORDER_NUMBER_BY_STATIONS(
+ ERROR.getException() + "순서는 노선에 있는 역 개수보다 하나 큰 수까지만 입력해주세요.\n"),
+ INVALID_NUMBER_OF_SECTION_STATIONS_IN_LINE(ERROR.getException()
+ + "해당 노선에 포함된 역이 2개 이하이기 때문에 삭제할 수 없습니다.\n");
+
+ private final String exception;
+
+ ExceptionType(String exception) {
+ this.exception = exception;
+ }
+
+ public String getException() {
+ return exception;
+ }
+}
diff --git a/src/main/java/subway/type/InformationType.java b/src/main/java/subway/type/InformationType.java
new file mode 100644
index 000000000..977c34caf
--- /dev/null
+++ b/src/main/java/subway/type/InformationType.java
@@ -0,0 +1,30 @@
+package subway.type;
+
+/**
+ * InformationType.java : 실행 결과 문구 상수를 모아둔 Enum 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public enum InformationType {
+ INFORMATION("[INFO] "),
+
+ STATION_ADDITION_INFORMATION(INFORMATION.getInformation() + "지하철 역이 등록되었습니다."),
+ STATION_DELETION_INFORMATION(INFORMATION.getInformation() + "지하철 역이 삭제되었습니다."),
+
+ LINE_ADDITION_INFORMATION(INFORMATION.getInformation() + "지하철 노선이 등록되었습니다."),
+ LINE_DELETION_INFORMATION(INFORMATION.getInformation() + "지하철 노선이 삭제되었습니다."),
+
+ SECTION_ADDITION_INFORMATION(INFORMATION.getInformation() + "구간이 등록되었습니다."),
+ SECTION_DELETION_INFORMATION(INFORMATION.getInformation() + "구간이 삭제되었습니다.");
+
+ private final String information;
+
+ InformationType(String information) {
+ this.information = information;
+ }
+
+ public String getInformation() {
+ return information;
+ }
+}
diff --git a/src/main/java/subway/type/InputType.java b/src/main/java/subway/type/InputType.java
new file mode 100644
index 000000000..e93250fca
--- /dev/null
+++ b/src/main/java/subway/type/InputType.java
@@ -0,0 +1,26 @@
+package subway.type;
+
+/**
+ * InputType.java : 화면 기능 입력 값 상수를 모아둔 Enum 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public enum InputType {
+ INPUT_ONE("1"),
+ INPUT_TWO("2"),
+ INPUT_THREE("3"),
+ INPUT_FOUR("4"),
+ INPUT_QUITTING("Q"),
+ INPUT_BACK("B");
+
+ private final String input;
+
+ InputType(String input) {
+ this.input = input;
+ }
+
+ public String getInput() {
+ return input;
+ }
+}
diff --git a/src/main/java/subway/type/LineType.java b/src/main/java/subway/type/LineType.java
new file mode 100644
index 000000000..3706190bb
--- /dev/null
+++ b/src/main/java/subway/type/LineType.java
@@ -0,0 +1,23 @@
+package subway.type;
+
+/**
+ * LineType.java : 지하철 노선 초기화용 상수를 모아둔 Enum 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public enum LineType {
+ TWO("2호선"),
+ THREE("3호선"),
+ SHINBUNDANG("신분당선");
+
+ private final String line;
+
+ LineType(String line) {
+ this.line = line;
+ }
+
+ public String getLine() {
+ return line;
+ }
+}
diff --git a/src/main/java/subway/type/ScreenType.java b/src/main/java/subway/type/ScreenType.java
new file mode 100644
index 000000000..b8cc7d4e9
--- /dev/null
+++ b/src/main/java/subway/type/ScreenType.java
@@ -0,0 +1,44 @@
+package subway.type;
+
+/**
+ * ScreenType.java : 화면 문구 상수를 모아둔 Enum 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public enum ScreenType {
+ MAIN_SCREEN("## 메인 화면\n"),
+ STATION_MANAGEMENT("1. 역 관리\n"),
+ LINE_MANAGEMENT("2. 노선 관리\n"),
+ SECTION_MANAGEMENT("3. 구간 관리\n"),
+ SUBWAY_MAP_SHOW("4. 지하철 노선도 출력\n"),
+
+ STATION_MANAGEMENT_SCREEN("## 역 관리 화면\n"),
+ STATION_ADDITION("1. 역 등록\n"),
+ STATION_DELETION("2. 역 삭제\n"),
+ STATION_SHOW("3. 역 조회\n"),
+
+ LINE_MANAGEMENT_SCREEN("## 노선 관리 화면\n"),
+ LINE_ADDITION("1. 노선 등록\n"),
+ LINE_DELETION("2. 노선 삭제\n"),
+ LINE_SHOW("3. 노선 조회\n"),
+
+ SECTION_MANAGEMENT_SCREEN("## 구간 관리 화면\n"),
+ SECTION_ADDITION("1. 구간 등록\n"),
+ SECTION_DELETION("2. 구간 삭제\n"),
+
+ QUITTING("Q. 종료\n\n"),
+ BACK("B. 돌아가기\n\n"),
+
+ FEATURE_CHOICE("## 원하는 기능을 선택하세요.");
+
+ private final String screen;
+
+ ScreenType(String screen) {
+ this.screen = screen;
+ }
+
+ public String getScreen() {
+ return screen;
+ }
+}
diff --git a/src/main/java/subway/type/StationType.java b/src/main/java/subway/type/StationType.java
new file mode 100644
index 000000000..a62fc7b18
--- /dev/null
+++ b/src/main/java/subway/type/StationType.java
@@ -0,0 +1,27 @@
+package subway.type;
+
+/**
+ * StationType.java : 지하철 역 초기화용 상수를 모아둔 Enum 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public enum StationType {
+ EDUCATION_UNIVERSITY("교대역"),
+ GANGNAM("강남역"),
+ YEOKSAM("역삼역"),
+ NAMBU_BUS_TERMINAL("남부터미널역"),
+ YANGJAE("양재역"),
+ YANGJAE_CITIZENS_FOREST("양재시민의숲역"),
+ MAEBONG("매봉역");
+
+ private final String station;
+
+ StationType(String station) {
+ this.station = station;
+ }
+
+ public String getStation() {
+ return station;
+ }
+}
diff --git a/src/main/java/subway/type/TextType.java b/src/main/java/subway/type/TextType.java
new file mode 100644
index 000000000..7d60bb7a9
--- /dev/null
+++ b/src/main/java/subway/type/TextType.java
@@ -0,0 +1,40 @@
+package subway.type;
+
+/**
+ * TextType.java : 화면 출력 문구 상수를 모아둔 Enum 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public enum TextType {
+ NEW_LINE("\n"),
+ HORIZONTAL_LINES("---"),
+
+ STATION_ADDITION_TEXT("## 등록할 역 이름을 입력하세요."),
+ STATION_DELETION_TEXT("## 삭제할 역 이름을 입력하세요."),
+ STATION_LIST_TEXT("## 역 목록"),
+
+ LINE_ADDITION_TEXT("## 등록할 노선 이름을 입력하세요."),
+ LINE_UP_STATION_NAME_TEXT("## 등록할 노선의 상행 종점역 이름을 입력하세요."),
+ LINE_DOWN_STATION_NAME_TEXT("## 등록할 노선의 하행 종점역 이름을 입력하세요."),
+ LINE_DELETION_TEXT("## 삭제할 노선 이름을 입력하세요."),
+ LINE_LIST_TEXT("## 노선 목록"),
+
+ SECTION_ADDITION_LINE_TEXT("## 노선을 입력하세요."),
+ SECTION_ADDITION_STATION_TEXT("## 역이름을 입력하세요."),
+ SECTION_ADDITION_ORDER_TEXT("## 순서를 입력하세요."),
+ SECTION_DELETION_LINE_TEXT("## 삭제할 구간의 노선을 입력하세요."),
+ SECTION_DELETION_STATION_TEXT("## 삭제할 구간의 역을 입력하세요."),
+
+ TRANSIT_MAP_TEXT("## 지하철 노선도");
+
+ private final String text;
+
+ TextType(String text) {
+ this.text = text;
+ }
+
+ public String getText() {
+ return text;
+ }
+}
diff --git a/src/main/java/subway/view/input/line/LineScanView.java b/src/main/java/subway/view/input/line/LineScanView.java
new file mode 100644
index 000000000..cb1be29aa
--- /dev/null
+++ b/src/main/java/subway/view/input/line/LineScanView.java
@@ -0,0 +1,39 @@
+package subway.view.input.line;
+
+import subway.view.output.line.LineTextView;
+import subway.view.output.util.ScreenView;
+
+import java.util.Scanner;
+
+/**
+ * LineScanView.java : 지하철 노선 기능 입력에 대한 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class LineScanView {
+ public static String scanLineInputForManagement(Scanner scanner) {
+ ScreenView.printLineManagementScreen();
+ return scanner.nextLine();
+ }
+
+ public static String scanLineNameForAddition(Scanner scanner) {
+ LineTextView.printLineAdditionText();
+ return scanner.nextLine();
+ }
+
+ public static String scanUpStationNameForAddition(Scanner scanner) {
+ LineTextView.printLineUpStationNameText();
+ return scanner.nextLine();
+ }
+
+ public static String scanDownStationNameForAddition(Scanner scanner) {
+ LineTextView.printLineDownStationNameText();
+ return scanner.nextLine();
+ }
+
+ public static String scanLineNameForDeletion(Scanner scanner) {
+ LineTextView.printLineDeletionText();
+ return scanner.nextLine();
+ }
+}
diff --git a/src/main/java/subway/view/input/section/SectionScanView.java b/src/main/java/subway/view/input/section/SectionScanView.java
new file mode 100644
index 000000000..50a825ccf
--- /dev/null
+++ b/src/main/java/subway/view/input/section/SectionScanView.java
@@ -0,0 +1,44 @@
+package subway.view.input.section;
+
+import subway.view.output.section.SectionTextView;
+import subway.view.output.util.ScreenView;
+
+import java.util.Scanner;
+
+/**
+ * SectionScanView.java : 지하철 구간 기능 입력에 대한 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class SectionScanView {
+ public static String scanSectionInputForManagement(Scanner scanner) {
+ ScreenView.printSectionManagementScreen();
+ return scanner.nextLine();
+ }
+
+ public static String scanLineNameForAddition(Scanner scanner) {
+ SectionTextView.printSectionAdditionLineText();
+ return scanner.nextLine();
+ }
+
+ public static String scanStationNameForAddition(Scanner scanner) {
+ SectionTextView.printSectionAdditionStationText();
+ return scanner.nextLine();
+ }
+
+ public static String scanOrderForAddition(Scanner scanner) {
+ SectionTextView.printSectionAdditionOrderText();
+ return scanner.nextLine();
+ }
+
+ public static String scanLineNameForDeletion(Scanner scanner) {
+ SectionTextView.printSectionDeletionLineText();
+ return scanner.nextLine();
+ }
+
+ public static String scanStationNameForDeletion(Scanner scanner) {
+ SectionTextView.printSectionDeletionStationText();
+ return scanner.nextLine();
+ }
+}
diff --git a/src/main/java/subway/view/input/station/StationScanView.java b/src/main/java/subway/view/input/station/StationScanView.java
new file mode 100644
index 000000000..0241d112c
--- /dev/null
+++ b/src/main/java/subway/view/input/station/StationScanView.java
@@ -0,0 +1,30 @@
+package subway.view.input.station;
+
+import subway.view.output.station.StationTextView;
+import subway.view.output.util.ScreenView;
+
+import java.util.Scanner;
+
+/**
+ * StationScanView.java : 지하철 역 기능 입력에 대한 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class StationScanView {
+ public static String scanStationInputForManagement(Scanner scanner) {
+ ScreenView.printStationManagementScreen();
+ return scanner.nextLine();
+
+ }
+
+ public static String scanStationNameForAddition(Scanner scanner) {
+ StationTextView.printStationAdditionText();
+ return scanner.nextLine();
+ }
+
+ public static String scanStationNameForDeletion(Scanner scanner) {
+ StationTextView.printStationDeletionText();
+ return scanner.nextLine();
+ }
+}
diff --git a/src/main/java/subway/view/input/subway/SubwayScanView.java b/src/main/java/subway/view/input/subway/SubwayScanView.java
new file mode 100644
index 000000000..cae31e8e7
--- /dev/null
+++ b/src/main/java/subway/view/input/subway/SubwayScanView.java
@@ -0,0 +1,18 @@
+package subway.view.input.subway;
+
+import subway.view.output.util.ScreenView;
+
+import java.util.Scanner;
+
+/**
+ * SubwayScanView.java : 지하철 기능 입력에 대한 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class SubwayScanView {
+ public static String scanMainInputForManagement(Scanner scanner) {
+ ScreenView.printMainScreen();
+ return scanner.nextLine();
+ }
+}
diff --git a/src/main/java/subway/view/output/line/LineExceptionView.java b/src/main/java/subway/view/output/line/LineExceptionView.java
new file mode 100644
index 000000000..140e394bf
--- /dev/null
+++ b/src/main/java/subway/view/output/line/LineExceptionView.java
@@ -0,0 +1,41 @@
+package subway.view.output.line;
+
+import subway.type.ExceptionType;
+
+/**
+ * LineExceptionView.java : 지하철 노선 예외 처리 문구 출력에 대한 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class LineExceptionView {
+ public static void printInvalidLineNameException() {
+ System.out.println();
+ System.out.println(ExceptionType.INVALID_LINE_NAME.getException());
+ }
+
+ public static void printInvalidLineNameLengthException() {
+ System.out.println();
+ System.out.println(ExceptionType.INVALID_LINE_NAME_LENGTH.getException());
+ }
+
+ public static void printInvalidLineNameLastCharacterException() {
+ System.out.println();
+ System.out.println(ExceptionType.INVALID_LINE_NAME_LAST_CHARACTER.getException());
+ }
+
+ public static void printInvalidLineStationNamesExistenceException() {
+ System.out.println();
+ System.out.println(ExceptionType.INVALID_LINE_STATION_NAMES_EXISTENCE.getException());
+ }
+
+ public static void printInvalidLineSameStationNamesException() {
+ System.out.println();
+ System.out.println(ExceptionType.INVALID_LINE_SAME_STATION_NAMES.getException());
+ }
+
+ public static void printInvalidLineNameExistenceException() {
+ System.out.println();
+ System.out.println(ExceptionType.INVALID_LINE_NAME_EXISTENCE.getException());
+ }
+}
diff --git a/src/main/java/subway/view/output/line/LineInformationView.java b/src/main/java/subway/view/output/line/LineInformationView.java
new file mode 100644
index 000000000..3d4b9933e
--- /dev/null
+++ b/src/main/java/subway/view/output/line/LineInformationView.java
@@ -0,0 +1,21 @@
+package subway.view.output.line;
+
+import subway.type.InformationType;
+
+/**
+ * LineInformationView.java : 지하철 노선 실행 결과 문구 출력에 대한 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class LineInformationView {
+ public static void printLineAdditionInformation() {
+ System.out.println();
+ System.out.println(InformationType.LINE_ADDITION_INFORMATION.getInformation());
+ }
+
+ public static void printLineDeletionInformation() {
+ System.out.println();
+ System.out.println(InformationType.LINE_DELETION_INFORMATION.getInformation());
+ }
+}
diff --git a/src/main/java/subway/view/output/line/LineTextView.java b/src/main/java/subway/view/output/line/LineTextView.java
new file mode 100644
index 000000000..e76f03eba
--- /dev/null
+++ b/src/main/java/subway/view/output/line/LineTextView.java
@@ -0,0 +1,31 @@
+package subway.view.output.line;
+
+import subway.type.TextType;
+
+/**
+ * LineTextView.java : 지하철 노선 화면 출력 문구 출력에 대한 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class LineTextView {
+ public static void printLineAdditionText() {
+ System.out.println();
+ System.out.println(TextType.LINE_ADDITION_TEXT.getText());
+ }
+
+ public static void printLineUpStationNameText() {
+ System.out.println();
+ System.out.println(TextType.LINE_UP_STATION_NAME_TEXT.getText());
+ }
+
+ public static void printLineDownStationNameText() {
+ System.out.println();
+ System.out.println(TextType.LINE_DOWN_STATION_NAME_TEXT.getText());
+ }
+
+ public static void printLineDeletionText() {
+ System.out.println();
+ System.out.println(TextType.LINE_DELETION_TEXT.getText());
+ }
+}
diff --git a/src/main/java/subway/view/output/section/SectionExceptionView.java b/src/main/java/subway/view/output/section/SectionExceptionView.java
new file mode 100644
index 000000000..d69269653
--- /dev/null
+++ b/src/main/java/subway/view/output/section/SectionExceptionView.java
@@ -0,0 +1,37 @@
+package subway.view.output.section;
+
+import subway.type.ExceptionType;
+
+/**
+ * SectionExceptionView.java : 지하철 구간 예외 처리 문구 출력에 대한 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class SectionExceptionView {
+ public static void printInvalidSectionStationNameInLineExistenceException() {
+ System.out.println();
+ System.out.println(
+ ExceptionType.INVALID_SECTION_STATION_NAME_IN_LINE_ALREADY_EXISTENCE.getException());
+ }
+
+ public static void printInvalidSectionOrderReplacementLengthException() {
+ System.out.println();
+ System.out.println(ExceptionType.INVALID_SECTION_ORDER_REPLACEMENT_LENGTH.getException());
+ }
+
+ public static void printInvalidSectionOrderNumberException() {
+ System.out.println();
+ System.out.println(ExceptionType.INVALID_SECTION_ORDER_NUMBER.getException());
+ }
+
+ public static void printInvalidSectionOrderNumberByStationsException() {
+ System.out.println();
+ System.out.println(ExceptionType.INVALID_SECTION_ORDER_NUMBER_BY_STATIONS.getException());
+ }
+
+ public static void printInvalidNumberOfSectionStationsInLineException() {
+ System.out.println();
+ System.out.println(ExceptionType.INVALID_NUMBER_OF_SECTION_STATIONS_IN_LINE.getException());
+ }
+}
diff --git a/src/main/java/subway/view/output/section/SectionInformationView.java b/src/main/java/subway/view/output/section/SectionInformationView.java
new file mode 100644
index 000000000..9e97a0043
--- /dev/null
+++ b/src/main/java/subway/view/output/section/SectionInformationView.java
@@ -0,0 +1,21 @@
+package subway.view.output.section;
+
+import subway.type.InformationType;
+
+/**
+ * SectionInformationView.java : 지하철 구간 실행 결과 문구 출력에 대한 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class SectionInformationView {
+ public static void printSectionAdditionInformation() {
+ System.out.println();
+ System.out.println(InformationType.SECTION_ADDITION_INFORMATION.getInformation());
+ }
+
+ public static void printSectionDeletionInformation() {
+ System.out.println();
+ System.out.println(InformationType.SECTION_DELETION_INFORMATION.getInformation());
+ }
+}
diff --git a/src/main/java/subway/view/output/section/SectionTextView.java b/src/main/java/subway/view/output/section/SectionTextView.java
new file mode 100644
index 000000000..aadfc5ff6
--- /dev/null
+++ b/src/main/java/subway/view/output/section/SectionTextView.java
@@ -0,0 +1,36 @@
+package subway.view.output.section;
+
+import subway.type.TextType;
+
+/**
+ * SectionTextView.java : 지하철 구간 화면 출력 문구 출력에 대한 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class SectionTextView {
+ public static void printSectionAdditionLineText() {
+ System.out.println();
+ System.out.println(TextType.SECTION_ADDITION_LINE_TEXT.getText());
+ }
+
+ public static void printSectionAdditionStationText() {
+ System.out.println();
+ System.out.println(TextType.SECTION_ADDITION_STATION_TEXT.getText());
+ }
+
+ public static void printSectionAdditionOrderText() {
+ System.out.println();
+ System.out.println(TextType.SECTION_ADDITION_ORDER_TEXT.getText());
+ }
+
+ public static void printSectionDeletionLineText() {
+ System.out.println();
+ System.out.println(TextType.SECTION_DELETION_LINE_TEXT.getText());
+ }
+
+ public static void printSectionDeletionStationText() {
+ System.out.println();
+ System.out.println(TextType.SECTION_DELETION_STATION_TEXT.getText());
+ }
+}
diff --git a/src/main/java/subway/view/output/station/StationExceptionView.java b/src/main/java/subway/view/output/station/StationExceptionView.java
new file mode 100644
index 000000000..e17fad4c0
--- /dev/null
+++ b/src/main/java/subway/view/output/station/StationExceptionView.java
@@ -0,0 +1,36 @@
+package subway.view.output.station;
+
+import subway.type.ExceptionType;
+
+/**
+ * StationExceptionView.java : 지하철 역 예외 처리 문구 출력에 대한 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class StationExceptionView {
+ public static void printInvalidStationNameException() {
+ System.out.println();
+ System.out.println(ExceptionType.INVALID_STATION_NAME.getException());
+ }
+
+ public static void printInvalidStationNameLengthException() {
+ System.out.println();
+ System.out.println(ExceptionType.INVALID_STATION_NAME_LENGTH.getException());
+ }
+
+ public static void printInvalidStationNameLastCharacterException() {
+ System.out.println();
+ System.out.println(ExceptionType.INVALID_STATION_NAME_LAST_CHARACTER.getException());;
+ }
+
+ public static void printInvalidStationNameInTransitMapException() {
+ System.out.println();
+ System.out.println(ExceptionType.INVALID_STATION_NAME_IN_TRANSIT_MAP.getException());
+ }
+
+ public static void printInvalidStationNameExistenceException() {
+ System.out.println();
+ System.out.println(ExceptionType.INVALID_STATION_NAME_EXISTENCE.getException());
+ }
+}
diff --git a/src/main/java/subway/view/output/station/StationInformationView.java b/src/main/java/subway/view/output/station/StationInformationView.java
new file mode 100644
index 000000000..4db9db2f9
--- /dev/null
+++ b/src/main/java/subway/view/output/station/StationInformationView.java
@@ -0,0 +1,21 @@
+package subway.view.output.station;
+
+import subway.type.InformationType;
+
+/**
+ * StationInformationView.java : 지하철 역 실행 결과 문구 출력에 대한 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class StationInformationView {
+ public static void printStationAdditionInformation() {
+ System.out.println();
+ System.out.println(InformationType.STATION_ADDITION_INFORMATION.getInformation());
+ }
+
+ public static void printStationDeletionInformation() {
+ System.out.println();
+ System.out.println(InformationType.STATION_DELETION_INFORMATION.getInformation());
+ }
+}
diff --git a/src/main/java/subway/view/output/station/StationTextView.java b/src/main/java/subway/view/output/station/StationTextView.java
new file mode 100644
index 000000000..b3badb6bf
--- /dev/null
+++ b/src/main/java/subway/view/output/station/StationTextView.java
@@ -0,0 +1,21 @@
+package subway.view.output.station;
+
+import subway.type.TextType;
+
+/**
+ * StationTextView.java : 지하철 역 화면 출력 문구 출력에 대한 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class StationTextView {
+ public static void printStationAdditionText() {
+ System.out.println();
+ System.out.println(TextType.STATION_ADDITION_TEXT.getText());
+ }
+
+ public static void printStationDeletionText() {
+ System.out.println();
+ System.out.println(TextType.STATION_DELETION_TEXT.getText());
+ }
+}
diff --git a/src/main/java/subway/view/output/util/FeatureChoiceExceptionView.java b/src/main/java/subway/view/output/util/FeatureChoiceExceptionView.java
new file mode 100644
index 000000000..e9ee57a28
--- /dev/null
+++ b/src/main/java/subway/view/output/util/FeatureChoiceExceptionView.java
@@ -0,0 +1,22 @@
+package subway.view.output.util;
+
+import subway.type.ExceptionType;
+
+/**
+ * FeatureChoiceExceptionView.java : 화면 기능 선택 예외 처리 문구 출력에 대한 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class FeatureChoiceExceptionView {
+ public static void printInvalidFeatureChoiceException() {
+ System.out.println();
+ System.out.println(ExceptionType.INVALID_FEATURE_CHOICE.getException());
+ }
+
+ public static boolean printInvalidChoiceException() {
+ System.out.println();
+ System.out.println(ExceptionType.INVALID_FEATURE_CHOICE.getException());
+ return false;
+ }
+}
diff --git a/src/main/java/subway/view/output/util/ScreenView.java b/src/main/java/subway/view/output/util/ScreenView.java
new file mode 100644
index 000000000..1b0e8298c
--- /dev/null
+++ b/src/main/java/subway/view/output/util/ScreenView.java
@@ -0,0 +1,52 @@
+package subway.view.output.util;
+
+import subway.type.ScreenType;
+
+/**
+ * ScreenView.java : 화면 출력에 대한 클래스
+ *
+ * @author Daeun Lee
+ * @version 1.0
+ */
+public class ScreenView {
+ public static void printMainScreen() {
+ System.out.println(ScreenType.MAIN_SCREEN.getScreen()
+ + ScreenType.STATION_MANAGEMENT.getScreen()
+ + ScreenType.LINE_MANAGEMENT.getScreen()
+ + ScreenType.SECTION_MANAGEMENT.getScreen()
+ + ScreenType.SUBWAY_MAP_SHOW.getScreen()
+ + ScreenType.QUITTING.getScreen()
+ + ScreenType.FEATURE_CHOICE.getScreen());
+ }
+
+ public static void printStationManagementScreen() {
+ System.out.println(ScreenType.STATION_MANAGEMENT_SCREEN.getScreen()
+ + ScreenType.STATION_ADDITION.getScreen()
+ + ScreenType.STATION_DELETION.getScreen()
+ + ScreenType.STATION_SHOW.getScreen()
+ + ScreenType.BACK.getScreen()
+ + ScreenType.FEATURE_CHOICE.getScreen());
+ }
+
+ public static void printLineManagementScreen() {
+ System.out.println(ScreenType.LINE_MANAGEMENT_SCREEN.getScreen()
+ + ScreenType.LINE_ADDITION.getScreen()
+ + ScreenType.LINE_DELETION.getScreen()
+ + ScreenType.LINE_SHOW.getScreen()
+ + ScreenType.BACK.getScreen()
+ + ScreenType.FEATURE_CHOICE.getScreen());
+ }
+
+ public static void printSectionManagementScreen() {
+ System.out.println(ScreenType.SECTION_MANAGEMENT_SCREEN.getScreen()
+ + ScreenType.SECTION_ADDITION.getScreen()
+ + ScreenType.SECTION_DELETION.getScreen()
+ + ScreenType.BACK.getScreen()
+ + ScreenType.FEATURE_CHOICE.getScreen());
+ }
+
+ public static boolean printNewLine() {
+ System.out.println();
+ return true;
+ }
+}