diff --git a/README.md b/README.md
index 00410ae50..e01a2f293 100644
--- a/README.md
+++ b/README.md
@@ -1,469 +1,36 @@
-# 지하철 노선도 미션
+# 지하철 노선도 미션 - 김유기
- 지하철 역과 노선을 관리하는 지하철 노선도 기능을 구현한다.
-
-## 🚀 기능 요구사항
-### 초기 설정
-- 프로그램 시작 시 역, 노선 등 필요한 정보를 미리 셋팅할 수 있다.
-
-> 아래의 사전 등록 정보로 반드시 초기 설정을 하기
->
-```
- 1. 지하철역으로 교대역, 강남역, 역삼역, 남부터미널역, 양재역, 양재시민의숲역, 매봉역이 등록되어 있다.
- 2. 지하철 노선으로 2호선, 3호선, 신분당선이 등록되어 있다.
- 3. 노선에 역이 아래와 같이 등록되어 있다.(왼쪽 끝이 상행 종점)
- - 2호선: 교대역 - 강남역 - 역삼역
- - 3호선: 교대역 - 남부터미널역 - 양재역 - 매봉역
- - 신분당선: 강남역 - 양재역 - 양재시민의숲역
- ```
-
-
-
-### 지하철 역 관련 기능
-- 지하철 역을 등록하고 삭제할 수 있다. (단, 노선에 등록된 역은 삭제할 수 없다)
-- 중복된 지하철 역 이름이 등록될 수 없다.
-- 역 이름은 2자 이상, 5자 이하만 가능하다.
-- 지하철 역의 목록을 조회할 수 있다.
-
-### 지하철 노선 관련 기능
-- 지하철 노선을 등록하고 삭제할 수 있다.
-- 중복된 지하철 노선 이름이 등록될 수 없다.
-- 노선 이름은 2자 이상, 5자 이하만 가능하다.
-- 노선 등록 시 상행 종점역과 하행 종점역을 입력받는다.
-- 지하철 노선의 목록을 조회할 수 있다.
-
-### 지하철 구간 추가 기능
-- 지하철 노선에 구간을 추가하는 기능은 노선에 역을 추가하는 기능이라고도 할 수 있다.
- - 역과 역사이를 구간이라 하고 이 구간들의 모음이 노선이다.
-- 하나의 역은 여러개의 노선에 추가될 수 있다.
-- 역과 역 사이에 새로운 역이 추가 될 수 있다.
-- 노선에서 갈래길은 생길 수 없다.
-
-
-
-### 지하철 구간 삭제 기능
-- 노선에 등록된 역을 제거할 수 있다.
-- 종점을 제거할 경우 다음 역이 종점이 된다.
-- 노선에 포함된 역이 두개 이하일 때는 역을 제거할 수 없다.
-
-
-
-### 지하철 노선에 등록된 역 조회 기능
-- 노선의 상행 종점부터 하행 종점까지 연결된 순서대로 역 목록을 조회할 수 있다.
-
-
-
-## ✍🏻 입출력 요구사항
-- `프로그래밍 실행 결과 예시`를 참고하여 입출력을 구현한다.
-- 기대하는 출력 결과는 `[INFO]`를 붙여서 출력한다. 출력값의 형식은 예시와 동일하게 한다.
-- 에러 발생 시 `[ERROR]`를 붙여서 출력한다. (에러의 문구는 자유롭게 작성한다.)
-
-### 💻 프로그래밍 실행 결과
-#### 역 관리
-```
-## 메인 화면
-1. 역 관리
-2. 노선 관리
-3. 구간 관리
-4. 지하철 노선도 출력
-Q. 종료
-
-## 원하는 기능을 선택하세요.
-1
-
-## 역 관리 화면
-1. 역 등록
-2. 역 삭제
-3. 역 조회
-B. 돌아가기
-
-## 원하는 기능을 선택하세요.
-1
-
-## 등록할 역 이름을 입력하세요.
-잠실역
-
-[INFO] 지하철 역이 등록되었습니다.
-
-## 메인 화면
-1. 역 관리
-2. 노선 관리
-3. 구간 관리
-4. 지하철 노선도 출력
-Q. 종료
-
-## 원하는 기능을 선택하세요.
-1
-
-## 역 관리 화면
-1. 역 등록
-2. 역 삭제
-3. 역 조회
-B. 돌아가기
-
-## 원하는 기능을 선택하세요.
-3
-
-## 역 목록
-[INFO] 교대역
-[INFO] 강남역
-[INFO] 역삼역
-[INFO] 남부터미널역
-[INFO] 양재역
-[INFO] 양재시민의숲역
-[INFO] 매봉역
-[INFO] 잠실역
-
-## 메인 화면
-1. 역 관리
-2. 노선 관리
-3. 구간 관리
-4. 지하철 노선도 출력
-Q. 종료
-
-## 원하는 기능을 선택하세요.
-1
-
-## 역 관리 화면
-1. 역 등록
-2. 역 삭제
-3. 역 조회
-B. 돌아가기
-
-## 원하는 기능을 선택하세요.
-2
-
-## 삭제할 역 이름을 입력하세요.
-잠실역
-
-[INFO] 지하철 역이 삭제되었습니다.
-
-...
-```
-
-### 노선 관리
-
-```
-
-...
-
-## 메인 화면
-1. 역 관리
-2. 노선 관리
-3. 구간 관리
-4. 지하철 노선도 출력
-Q. 종료
-
-## 원하는 기능을 선택하세요.
-2
-
-## 노선 관리 화면
-1. 노선 등록
-2. 노선 삭제
-3. 노선 조회
-B. 돌아가기
-
-## 원하는 기능을 선택하세요.
-1
-
-## 등록할 노선 이름을 입력하세요.
-1호선
-
-## 등록할 노선의 상행 종점역 이름을 입력하세요.
-강남역
-
-## 등록할 노선의 하행 종점역 이름을 입력하세요.
-잠실역
-
-[INFO] 지하철 노선이 등록되었습니다.
-
-## 메인 화면
-1. 역 관리
-2. 노선 관리
-3. 구간 관리
-4. 지하철 노선도 출력
-Q. 종료
-
-## 원하는 기능을 선택하세요.
-2
-
-## 노선 관리 화면
-1. 노선 등록
-2. 노선 삭제
-3. 노선 조회
-B. 돌아가기
-
-## 원하는 기능을 선택하세요.
-3
-
-[INFO] 노선 목록
-[INFO] 2호선
-[INFO] 3호선
-[INFO] 신분당선
-[INFO] 1호선
-
-## 메인 화면
-1. 역 관리
-2. 노선 관리
-3. 구간 관리
-4. 지하철 노선도 출력
-Q. 종료
-
-## 원하는 기능을 선택하세요.
-2
-
-## 노선 관리 화면
-1. 노선 등록
-2. 노선 삭제
-3. 노선 조회
-B. 돌아가기
-
-## 원하는 기능을 선택하세요.
-2
-
-## 삭제할 노선 이름을 입력하세요.
-1호선
-
-[INFO] 지하철 노선이 삭제되었습니다.
-
-...
-
-```
-
-### 구간 관리
-
-```
-...
-
-## 메인 화면
-1. 역 관리
-2. 노선 관리
-3. 구간 관리
-4. 지하철 노선도 출력
-Q. 종료
-
-## 원하는 기능을 선택하세요.
-3
-
-## 구간 관리 화면
-1. 구간 등록
-2. 구간 삭제
-B. 돌아가기
-
-## 원하는 기능을 선택하세요.
-1
-
-## 노선을 입력하세요.
-2호선
-
-## 역이름을 입력하세요.
-잠실역
-
-## 순서를 입력하세요.
-2
-
-[INFO] 구간이 등록되었습니다.
-
-## 메인 화면
-1. 역 관리
-2. 노선 관리
-3. 구간 관리
-4. 지하철 노선도 출력
-Q. 종료
-
-## 원하는 기능을 선택하세요.
-3
-
-## 구간 관리 화면
-1. 구간 등록
-2. 구간 삭제
-B. 돌아가기
-
-## 원하는 기능을 선택하세요.
-2
-
-## 삭제할 구간의 노선을 입력하세요.
-2호선
-
-## 삭제할 구간의 역을 입력하세요.
-잠실역
-
-[INFO] 구간이 삭제되었습니다.
-
-...
-
-```
-
-### 지하철 노선도 출력
-
-```
-## 메인 화면
-1. 역 관리
-2. 노선 관리
-3. 구간 관리
-4. 지하철 노선도 출력
-Q. 종료
-
-## 원하는 기능을 선택하세요.
-4
-
-## 지하철 노선도
-[INFO] 2호선
-[INFO] ---
-[INFO] 교대역
-[INFO] 강남역
-[INFO] 역삼역
-
-[INFO] 3호선
-[INFO] ---
-[INFO] 교대역
-[INFO] 남부터미널역
-[INFO] 양재역
-[INFO] 매봉역
-
-[INFO] 신분당선
-[INFO] ---
-[INFO] 강남역
-[INFO] 양재역
-[INFO] 양재시민의숲역
-
-```
-
-#### 에러 출력 예시
-
-```
-## 메인 화면
-1. 역 관리
-2. 노선 관리
-3. 구간 관리
-4. 지하철 노선도 출력
-Q. 종료
-
-## 원하는 기능을 선택하세요.
-4
-
-[ERROR] 선택할 수 없는 기능입니다.
-
-## 원하는 기능을 선택하세요.
-1
-
-## 역 관리 화면
-1. 역 등록
-2. 역 삭제
-3. 역 조회
-B. 돌아가기
-
-## 원하는 기능을 선택하세요.
-1
-
-## 등록할 역 이름을 입력하세요.
-강남역
-
-[ERROR] 이미 등록된 역 이름입니다.
-
-## 역 관리 화면
-1. 역 등록
-2. 역 삭제
-3. 역 조회
-B. 돌아가기
-
-## 원하는 기능을 선택하세요.
-
-...
-
-```
-
-
-
-## 🎱 프로그래밍 요구사항
-- 자바 코드 컨벤션을 지키면서 프로그래밍한다.
- - 기본적으로 [Google Java Style Guide](https://google.github.io/styleguide/javaguide.html)을 원칙으로 한다.
- - 단, 들여쓰기는 '2 spaces'가 아닌 '4 spaces'로 한다.
-- indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다.
- - 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다.
- - 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메소드)를 분리하면 된다.
-- 3항 연산자를 쓰지 않는다.
-- 함수(또는 메소드)의 길이가 15라인을 넘어가지 않도록 구현한다.
- - 함수(또는 메소드)가 한 가지 일만 잘 하도록 구현한다.
-- else 예약어를 쓰지 않는다.
- - 힌트: if 조건절에서 값을 return하는 방식으로 구현하면 else를 사용하지 않아도 된다.
- - else를 쓰지 말라고 하니 switch/case로 구현하는 경우가 있는데 switch/case도 허용하지 않는다.
-- 프로그래밍 요구사항에서 별도로 변경 불가 안내가 없는 경우 파일 수정과 패키지 이동을 자유롭게 할 수 있다.
-- 예외 상황 시 에러 문구를 출력해야 한다. 단, 에러 문구는 `[ERROR]` 로 시작해야 한다.
-
-### 프로그래밍 요구사항 - Application
-- Application 클래스를 활용해 구현해야 한다.
-- Application의 패키지 구조는 변경하지 않는다.
-- 주석을 참고하여 구현할 수 있으며 주석대로 구현하지 않아도 되고 삭제해도 무관하다.
-```java
-public class Application {
- public static void main(String[] args) {
- ...
- }
-}
-```
-
-### 프로그래밍 요구사항 - Station, Line
-- Station, Line 클래스를 활용하여 지하철역과 노선을 구현해야 한다.
-- 제공하는 각 클래스의 기본 생성자를 추가할 수 없다.
-- 필드(인스턴스 변수)인 name의 접근 제어자 private을 변경할 수 없다.
-- 가능하면 setter 메소드(ex. setXXX)를 추가하지 않고 구현한다.
-
-```java
-public class Station {
- private String name;
-
- public Station(String name) {
- this.name = name;
- }
-
- public String getName() {
- return name;
- }
-
- // 추가 기능 구현
-}
-
-```
-
-### 프로그래밍 요구사항 - StationRepository, LineRepository
-- Station과 Line의 상태를 저장할 수 있는 StationRepository, LineRepository를 제공한다.
-- 필요 시 StationRepository, LineRepository 이 외 추가로 Repository를 만들 수 있다.
-- 추가로 생성되는 객체에 대해서 XXXRepository 네이밍으로 저장 클래스를 추가할 수 있다.
-- 객체들의 상태를 관리하기 위해서 XXXRepository 클래스를 활용해 저장 로직을 구현해야 한다.
-- 필요에 따라 자유롭게 수정이 가능하다.
-
-```java
-public class StationRepository {
- private static final List stations = new ArrayList<>();
-
- public static List stations() {
- return Collections.unmodifiableList(stations);
- }
-
- public static void addStation(Station station) {
- stations.add(station);
- }
-
- public static boolean deleteStation(String name) {
- return stations.removeIf(station -> Objects.equals(station.getName(), name));
- }
-}
-```
-
-
-
-## 📈 진행 요구사항
-- 미션은 [java-subway-map-precourse 저장소](https://github.com/woowacourse/java-subway-map-precourse) 를 fork/clone해 시작한다.
-- 기능을 구현하기 전에 java-subway-map-precourse/docs/README.md 파일에 구현할 기능 목록을 정리해 추가한다.
-- git의 commit 단위는 앞 단계에서 README.md 파일에 정리한 기능 목록 단위로 추가한다.
- - [AngularJS Commit Message Conventions](https://gist.github.com/stephenparish/9941e89d80e2bc58a153) 참고해 commit log를 남긴다.
-- [프리코스 과제 제출 문서](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) 절차를 따라 미션을 제출한다.
- - [프리코스 과제 FAQ](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse/faq) 문서를 참고하여 진행할 수 있다.
-
-
-## 📝 License
-
-This project is [MIT](https://github.com/woowacourse/java-subway-map-precourse/blob/master/LICENSE.md) licensed.
+## 기능 목록
+
+* 초기 역, 노선 설정해야 한다.
+* 지하철 역은 등록이 가능하다.
+ * 지하철 역의 이름은 2글자 이상이여야 한다
+ * 지하철 역의 이름은 중복이 불가능 해야 한다.
+* 지하철 역은 삭제가 가능하다.
+ * 노선에 등록된 지하철 역은 삭제가 불가능 해야 한다.
+ * 존재하지 않는 역은 삭제가 불가능 하다.
+* 지하철 역의 목록 조회가 가능해야 한다.
+* 지하철 노선은 등록이 가능하다.
+ * 지하철 노선의 이름은 2글자 이상이여야 한다.
+ * 지하철 노선의 이름은 중복이 불가능 해야 한다.
+ * 상행역과 하행역이 존재하지 않는경우 에러를 출력한다.
+* 지하철 노선은 삭제가 가능하다.
+* 지하철 노선을 등록할때 상행종점역과 하행 종점역을 입력받는다.
+* 지하철 노선의 목록을 조회할 수 있다.
+* 지하철 노선에 구간을 추가 할 수 있다.
+ * 하나의 역은 여러개의 노선에 추가 될 수 있다.
+ * 역과 역사이에 새로운 역이 추가 될 수 있다.
+ * 없는 역이 추가될때 에러를 출력한다.
+ * 음수입력시 에러를 출력한다.
+ * 구간의 길이보다 큰 값이 들어오면 마지막으로 추가한다.
+ * 이미 존재하는 역이 들어오면 에러를 출력한다.
+* 지하철 노선에 구간을 삭제 할 수 있다.
+ * 노선에 포함된 역이 두개 이하일 때는 역을 제거할 수 없다.
+ * 노선에 없는 역을 삭제할때 에러를 출력한다.
+* 지하철 노선에 등록된 역은 조회가 가능하다.
+ * 상행종점부터 하행 종점까지 연결된 순서대로 역 목록을 조회할 수 있다.
+* 에러 발생시 `[ERROR]` 을 붙여서 출력한다.
+* 기대하는 출력 결과는 `[INFO]`를 붙여서 출력한다.
diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java
index 0bcf786cc..ba66ffdf5 100644
--- a/src/main/java/subway/Application.java
+++ b/src/main/java/subway/Application.java
@@ -3,8 +3,12 @@
import java.util.Scanner;
public class Application {
+
public static void main(String[] args) {
final Scanner scanner = new Scanner(System.in);
// TODO: 프로그램 구현
+ DataInitService.init();
+ UserInterfaceView userInterfaceView = new UserInterfaceView(scanner);
+ userInterfaceView.start();
}
}
diff --git a/src/main/java/subway/DataInitService.java b/src/main/java/subway/DataInitService.java
new file mode 100644
index 000000000..9319491fc
--- /dev/null
+++ b/src/main/java/subway/DataInitService.java
@@ -0,0 +1,47 @@
+package subway;
+
+public class DataInitService {
+
+ private static final String GYODAE_STATION = "교대역";
+ private static final String GANGNAM_STATION = "강남역";
+ private static final String YEOKSAM_STATION = "역삼역";
+ private static final String SOUTH_TERMIANL_STATION = "남부터미널역";
+ private static final String YANGJAE_STATION = "양재역";
+ private static final String YANGJAE_CITIZEN_FOREST_STATION = "양재시민의숲역";
+ private static final String MAEBONG_STATION = "매봉역";
+ private static final String LINE_TOW = "2호선";
+ private static final String LINE_THREE = "3호선";
+ private static final String LINE_SINBUNDANG = "신분당선";
+ private static final int ONE = 1;
+ private static final int TWO = 2;
+
+ public static void init() {
+ addStation();
+ addLine();
+ addSections();
+ }
+
+ private static void addStation() {
+ String[] StationNames = {GYODAE_STATION, GANGNAM_STATION, YEOKSAM_STATION,
+ SOUTH_TERMIANL_STATION, YANGJAE_STATION, YANGJAE_CITIZEN_FOREST_STATION,
+ MAEBONG_STATION};
+ for (String stationName : StationNames) {
+ StationService.addStation(stationName, false);
+ }
+ }
+
+ private static void addLine() {
+ LineService.addLine(LINE_TOW, GYODAE_STATION, YEOKSAM_STATION, false);
+ LineService.addLine(LINE_THREE, GYODAE_STATION, MAEBONG_STATION, false);
+ LineService
+ .addLine(LINE_SINBUNDANG, GANGNAM_STATION, YANGJAE_CITIZEN_FOREST_STATION, false);
+ }
+
+ private static void addSections() {
+ SectionService.addSection(LINE_TOW, GANGNAM_STATION, ONE, false);
+ SectionService.addSection(LINE_THREE, SOUTH_TERMIANL_STATION, ONE, false);
+ SectionService.addSection(LINE_THREE, YANGJAE_STATION, TWO, false);
+ SectionService.addSection(LINE_SINBUNDANG, YANGJAE_STATION, ONE, false);
+ }
+
+}
diff --git a/src/main/java/subway/LineService.java b/src/main/java/subway/LineService.java
new file mode 100644
index 000000000..dd25eb720
--- /dev/null
+++ b/src/main/java/subway/LineService.java
@@ -0,0 +1,65 @@
+package subway;
+
+import subway.domain.Line;
+import subway.domain.LineRepository;
+import subway.domain.Station;
+import subway.domain.StationRepository;
+
+public class LineService {
+
+ public static final int MIN_LINE_NAME_LENGTH = 2;
+
+ private static boolean isNotLineNameState(String lineName) {
+ if (lineName.length() < MIN_LINE_NAME_LENGTH) {
+ OutPut.printLineLengthError();
+ return true;
+ }
+ if (LineRepository.isEqualLineName(lineName)) {
+ OutPut.printLineDuplicateError();
+ return true;
+ }
+ return false;
+ }
+
+ private static boolean isNotExistStation(String firstStationName, String lastStationName) {
+ if (!StationRepository.isEqualStationName(firstStationName)) {
+ OutPut.printNonExistStationError(firstStationName);
+ return true;
+ }
+ if (!StationRepository.isEqualStationName(lastStationName)) {
+ OutPut.printNonExistStationError(lastStationName);
+ return true;
+ }
+ return false;
+ }
+
+ public static boolean addLine(String lineName, String firstStationName, String lastStationName,
+ boolean isPrint) {
+ if (isNotLineNameState(lineName) || isNotExistStation(firstStationName, lastStationName)) {
+ return false;
+ }
+ Station firstStation = StationRepository.getStation(firstStationName);
+ Station lastStation = StationRepository.getStation(lastStationName);
+ Line line = new Line(lineName);
+ line.initLineInStation(firstStation, lastStation);
+ LineRepository.addLine(line);
+ if (isPrint) {
+ OutPut.printLineCreateMessage();
+ }
+ return true;
+ }
+
+ public static void deleteLine(String lineName) {
+ if (!LineRepository.deleteLineByName(lineName)) {
+ OutPut.printNonExistLineError();
+ return;
+ }
+ OutPut.printLineDeleteMessage();
+ }
+
+ public static void print() {
+ for (Line line : LineRepository.lines()) {
+ OutPut.printName(line.getName());
+ }
+ }
+}
diff --git a/src/main/java/subway/OutPut.java b/src/main/java/subway/OutPut.java
new file mode 100644
index 000000000..d53acada5
--- /dev/null
+++ b/src/main/java/subway/OutPut.java
@@ -0,0 +1,90 @@
+package subway;
+
+public class OutPut {
+
+ public static final String INFO = "[INFO] ";
+ public static final String ERROR = "[ERROR] ";
+ private static final String STATION_NAME_LENGTH_ERROR = "지하철 역의 이름은 2글자 이상이여야 합니다.\n";
+ private static final String STATION_CREATE_MESSAGE = "지하철 역이 등록되었습니다.\n";
+ private static final String STATION_NAME_DUPLICATE_ERROR = "지하철 역의 이름은 중복될 수 없습니다.\n";
+ private static final String LINE_NAME_LENGTH_ERROR = "지하철 노선의 이름은 2글자 이상이여야 합니다.\n";
+ private static final String LINE_NAME_DUPLICATE_ERROR = "지하철 노선의 이름은 중복될 수 없습니다.\n";
+ private static final String LINE_CREATE_MESSAGE = "지하철 노선이 등록되었습니다.\n";
+ private static final String NON_EXIST_STATION_ERROR = "은(는) 존재하지 않는 역입니다.\n";
+ private static final String NON_EXIST_LINE_ERROR = "존재하지 않는 노선입니다.\n";
+ private static final String EXIST_STATION_ERROR = "노선에 이미 존재하는 역입니다.\n";
+ private static final String SECTION_ADD_MESSAGE = "구간이 등록되었습니다.\n";
+ private static final String STATION_DELETE_ERROR = "노선에 등록된 지하철 역은 삭제할 수 없습니다.\n";
+ private static final String STATION_DELETE_MESSAGE = "지하철 역이 삭제되었습니다.\n";
+ private static final String LINE_DELETE_MESSAGE = "지하철 노선이 삭제되었습니다.\n";
+ private static final String SECTION_DELETE_SIZE_ERROR = "노선에 포함된 역이 두개 이하일 때는 역을 제거할 수 없습니다.\n";
+ private static final String SECTION_DELETE_MESSAGE = "구간이 삭제되었습니다.\n";
+
+ public static void printStationNameLengthError() {
+ System.out.println(ERROR + STATION_NAME_LENGTH_ERROR);
+ }
+
+ public static void printStationCreateMessage() {
+ System.out.println(INFO + STATION_CREATE_MESSAGE);
+ }
+
+ public static void printStationNameDuplicateError() {
+ System.out.println(ERROR + STATION_NAME_DUPLICATE_ERROR);
+ }
+
+ public static void printLineLengthError() {
+ System.out.println(ERROR + LINE_NAME_LENGTH_ERROR);
+ }
+
+ public static void printLineDuplicateError() {
+ System.out.println(ERROR + LINE_NAME_DUPLICATE_ERROR);
+ }
+
+ public static void printLineCreateMessage() {
+ System.out.println(INFO + LINE_CREATE_MESSAGE);
+ }
+
+ public static void printNonExistStationError(String stationName) {
+ System.out.println(ERROR + stationName + NON_EXIST_STATION_ERROR);
+ }
+
+ public static void printNonExistLineError() {
+ System.out.println(ERROR + NON_EXIST_LINE_ERROR);
+ }
+
+ public static void printExistStationError() {
+ System.out.println(ERROR + EXIST_STATION_ERROR);
+ }
+
+ public static void printSectionAddMessage() {
+ System.out.println(INFO + SECTION_ADD_MESSAGE);
+ }
+
+ public static void printStationDeleteError() {
+ System.out.println(ERROR + STATION_DELETE_ERROR);
+ }
+
+ public static void printStationDeleteMessage() {
+ System.out.println(INFO + STATION_DELETE_MESSAGE);
+ }
+
+ public static void printName(String name) {
+ System.out.println(INFO + name);
+ }
+
+ public static void printLineDeleteMessage() {
+ System.out.println(INFO + LINE_DELETE_MESSAGE);
+ }
+
+ public static void printSectionDeleteSizeError() {
+ System.out.println(ERROR + SECTION_DELETE_SIZE_ERROR);
+ }
+
+ public static void printSectionDeleteMessage() {
+ System.out.println(INFO + SECTION_DELETE_MESSAGE);
+ }
+
+ public static void printNextLine() {
+ System.out.println();
+ }
+}
diff --git a/src/main/java/subway/SectionService.java b/src/main/java/subway/SectionService.java
new file mode 100644
index 000000000..34cec8242
--- /dev/null
+++ b/src/main/java/subway/SectionService.java
@@ -0,0 +1,84 @@
+package subway;
+
+import subway.domain.Line;
+import subway.domain.LineRepository;
+import subway.domain.Station;
+import subway.domain.StationRepository;
+
+public class SectionService {
+
+ private static final int DELETE_MIN_SIZE = 2;
+ private static final String THREE_MINUS = "---";
+
+ private static boolean isNotExistLineAndStation(String lineName, String stationName) {
+ if (!LineRepository.isEqualLineName(lineName)) {
+ OutPut.printNonExistLineError();
+ return true;
+ }
+ if (!StationRepository.isEqualStationName(stationName)) {
+ OutPut.printNonExistStationError(stationName);
+ return true;
+ }
+ return false;
+ }
+
+ private static boolean isExistStation(Line line, String stationName) {
+ if (line.isExistStation(stationName)) {
+ OutPut.printExistStationError();
+ return true;
+ }
+ return false;
+ }
+
+ public static boolean addSection(String lineName, String stationName, int stationIndex,
+ boolean isPrint) {
+ if (isNotExistLineAndStation(lineName, stationName)) {
+ return false;
+ }
+ Line line = LineRepository.getLine(lineName);
+ if (isExistStation(line, stationName)) {
+ return false;
+ }
+ Station station = StationRepository.getStation(stationName);
+ line.insertLineInStation(station, stationIndex);
+ if (isPrint) {
+ OutPut.printSectionAddMessage();
+ }
+ return true;
+ }
+
+ private static boolean isNotDeleteSize(Line line) {
+ if (line.lineInStationList().size() <= DELETE_MIN_SIZE) {
+ OutPut.printSectionDeleteSizeError();
+ return true;
+ }
+ return false;
+ }
+
+ public static boolean deleteSection(String lineName, String stationName) {
+ if (isNotExistLineAndStation(lineName, stationName)) {
+ return false;
+ }
+ Line line = LineRepository.getLine(lineName);
+ if (isNotDeleteSize(line)) {
+ return false;
+ }
+ if (!line.deleteLineByName(stationName)) {
+ OutPut.printNonExistStationError(stationName);
+ return false;
+ }
+ OutPut.printSectionDeleteMessage();
+ return true;
+ }
+
+ public static void print() {
+ for (Line line : LineRepository.lines()) {
+ OutPut.printName(line.getName());
+ OutPut.printName(THREE_MINUS);
+ for (Station station : line.lineInStationList()) {
+ OutPut.printName(station.getName());
+ }
+ OutPut.printNextLine();
+ }
+ }
+}
diff --git a/src/main/java/subway/StationService.java b/src/main/java/subway/StationService.java
new file mode 100644
index 000000000..4ddf6c23e
--- /dev/null
+++ b/src/main/java/subway/StationService.java
@@ -0,0 +1,51 @@
+package subway;
+
+import subway.domain.Station;
+import subway.domain.StationRepository;
+
+public class StationService {
+
+ public static final int MIN_STATION_NAME_LENGTH = 2;
+
+ public static boolean isNotStationState(String name) {
+ if (name.length() < MIN_STATION_NAME_LENGTH) {
+ OutPut.printStationNameLengthError();
+ return true;
+ }
+ if (StationRepository.isEqualStationName(name)) {
+ OutPut.printStationNameDuplicateError();
+ return true;
+ }
+ return false;
+ }
+
+ public static boolean addStation(String name, boolean isPrint) {
+ if (isNotStationState(name)) {
+ return false;
+ }
+ StationRepository.addStation(new Station(name));
+ if (isPrint) {
+ OutPut.printStationCreateMessage();
+ }
+ return true;
+ }
+
+ public static boolean deleteStation(String name) {
+ if (StationRepository.isExistByLineInStation(name)) {
+ OutPut.printStationDeleteError();
+ return false;
+ }
+ if (!StationRepository.deleteStation(name)) {
+ OutPut.printNonExistStationError(name);
+ return false;
+ }
+ OutPut.printStationDeleteMessage();
+ return true;
+ }
+
+ public static void print() {
+ for (Station station : StationRepository.stations()) {
+ OutPut.printName(station.getName());
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/subway/UserInterfaceView.java b/src/main/java/subway/UserInterfaceView.java
new file mode 100644
index 000000000..30a7a24bd
--- /dev/null
+++ b/src/main/java/subway/UserInterfaceView.java
@@ -0,0 +1,314 @@
+package subway;
+
+import java.util.Arrays;
+import java.util.Scanner;
+
+public class UserInterfaceView {
+
+ private static final String MAIN_VIEW = "## 메인 화면";
+ private static final String STATION_MANAGEMENT = "1. 역 관리";
+ private static final String LINE_MANAGEMENT = "2. 노선 관리";
+ private static final String SECTION_MANAGEMENT = "3. 구간 관리";
+ private static final String SUBWAY_LINES_PRINT = "4. 지하철 노선도 출력";
+ private static final String QUIT = "Q. 종료";
+ private static final String[] MAIN_INTERFACE = {MAIN_VIEW, STATION_MANAGEMENT, LINE_MANAGEMENT,
+ SECTION_MANAGEMENT, SUBWAY_LINES_PRINT, QUIT};
+ private static final String STATION_MANAGEMENT_VIEW = "## 역 관리 화면";
+ private static final String STATION_ADD = "1. 역 등록";
+ private static final String STATION_DELETE = "2. 역 삭제";
+ private static final String STATION_PRINT = "3. 역 조회";
+ private static final String BACK = "B. 돌아가기";
+ private static final String[] STATION_INTERFACE = {STATION_MANAGEMENT_VIEW, STATION_ADD,
+ STATION_DELETE, STATION_PRINT, BACK};
+ private static final String LINE_VIEW = "## 노선 관리 화면";
+ private static final String LINE_ADD = "1. 노선 등록";
+ private static final String LINE_DELETE = "2. 노선 삭제";
+ private static final String LINE_PRINT = "3. 노선 조회";
+ private static final String[] LINE_INTERFACE = {LINE_VIEW, LINE_ADD, LINE_DELETE, LINE_PRINT,
+ BACK};
+ private static final String CHOICE_FUNCTION = "## 원하는 기능을 선택하세요.";
+ private static final String SECTION_ADD = "1. 구간 등록";
+ private static final String SECTION_DELETE = "2. 구간 삭제";
+ private static final String[] SECTION_INTERFACE = {SECTION_ADD, SECTION_DELETE, BACK};
+ private static final String ONE_STRING = "1";
+ private static final String TWO_STRING = "2";
+ private static final String THREE_STRING = "3";
+ private static final String FOUR_STRING = "4";
+ private static final String B = "B";
+ private static final String Q = "Q";
+ private static final String FUNCTION_ERROR_MESSAGE = OutPut.ERROR + "선택할 수 없는 기능입니다.\n";
+ private static final String[] MAIN_CHOICE_LIST = {ONE_STRING, TWO_STRING, THREE_STRING,
+ FOUR_STRING, Q};
+ private static final String[] STATION_AND_LINE_CHOICE_LIST = {ONE_STRING, TWO_STRING,
+ THREE_STRING, B};
+ private static final String[] SECTION_LIST = {ONE_STRING, TWO_STRING, B};
+ private static final String STATION_LIST = "## 역 목록";
+ private static final String LINE_LIST = "## 노선 목록";
+ private static final String SUBWAY_LINES_LIST = "## 지하철 노선도";
+ private static final String INPUT_ADD_STATION_NAME = "## 등록할 역 이름을 입력하세요.";
+ private static final String INPUT_DELETE_STATION_NAME = "## 삭제할 역 이름을 입력하세요.";
+ private static final String INPUT_ADD_LINE_NAME = "## 등록할 노선 이름을 입력하세요.";
+ private static final String INPUT_LINE_IN_FIRST_STATION = "## 등록할 노선의 상행 종점역 이름을 입력하세요.";
+ private static final String INPUT_LINE_IN_LAST_STATION = "## 등록할 노선의 하행 종점역 이름을 입력하세요.";
+ private static final String INPUT_DELETE_LINE_NAME = "## 삭제할 노선 이름을 입력하세요.";
+ private static final String INPUT_SECTION_LINE_NAME = "## 노선을 입력하세요.";
+ private static final String INPUT_SECTION_STATION_NAME = "## 역이름을 입력하세요.";
+ private static final String INPUT_SECTION_ORDER = "## 순서를 입력하세요.";
+ private static final String INPUT_SECTION_DELETE_LINE_NAME = "## 삭제할 구간의 노선을 입력하세요.";
+ private static final String INPUT_SECTION_DELETE_STATION_NAME = "## 삭제할 구간의 역을 입력하세요.";
+ private static final String INPUT_TYPE_ERROR = OutPut.ERROR + "숫자만 입력이 가능합니다.\n";
+ private static final String INPUT_NUMBER_ERROR = OutPut.ERROR + "음수는 입력이 불가능합니다.\n";
+ private static final int ZERO = 0;
+
+ private Scanner scanner;
+
+ public UserInterfaceView(Scanner scanner) {
+ this.scanner = scanner;
+ }
+
+ public void start() {
+ while (true) {
+ if (mainStartAndReturnIsQuit()) {
+ break;
+ }
+ }
+ }
+
+ public boolean mainStartAndReturnIsQuit() {
+ printMainView();
+ String userInput;
+ while (true) {
+ userInput = getUserInput(CHOICE_FUNCTION);
+ if (Arrays.asList(MAIN_CHOICE_LIST).contains(userInput)) {
+ break;
+ }
+ printErrorMessage();
+ }
+ if (isQuit(userInput)) {
+ return true;
+ }
+ mainToNextFunction(userInput);
+ return false;
+ }
+
+ private void printMainView() {
+ for (String str : MAIN_INTERFACE) {
+ System.out.println(str);
+ }
+ System.out.println();
+ }
+
+ private String getUserInput(String str) {
+ System.out.println(str);
+ String userInput = scanner.next();
+ System.out.println();
+ return userInput;
+ }
+
+ private void printErrorMessage() {
+ System.out.println(FUNCTION_ERROR_MESSAGE);
+ }
+
+ private boolean isQuit(String userInput) {
+ return Q.equals(userInput);
+ }
+
+ private void mainToNextFunction(String userInput) {
+ if (ONE_STRING.equals(userInput)) {
+ stationStart();
+ return;
+ }
+ if (TWO_STRING.equals(userInput)) {
+ lineStart();
+ return;
+ }
+ if (THREE_STRING.equals(userInput)) {
+ sectionStart();
+ return;
+ }
+ if (FOUR_STRING.equals(userInput)) {
+ printSubwayLine();
+ }
+ }
+
+ private void stationStart() {
+ printStationView();
+ String userInput;
+ while (true) {
+ userInput = getUserInput(CHOICE_FUNCTION);
+ if (Arrays.asList(STATION_AND_LINE_CHOICE_LIST).contains(userInput)) {
+ break;
+ }
+ printErrorMessage();
+ }
+ stationToNextFunction(userInput);
+ }
+
+ private void printStationView() {
+ for (String str : STATION_INTERFACE) {
+ System.out.println(str);
+ }
+ System.out.println();
+ }
+
+ private void stationToNextFunction(String userInput) {
+ if (ONE_STRING.equals(userInput)) {
+ addStation();
+ return;
+ }
+ if (TWO_STRING.equals(userInput)) {
+ deleteStation();
+ return;
+ }
+ if (THREE_STRING.equals(userInput)) {
+ printStation();
+ }
+ }
+
+ private void addStation() {
+ String stationName = getUserInput(INPUT_ADD_STATION_NAME);
+ if (!StationService.addStation(stationName, true)) {
+ stationStart();
+ }
+ }
+
+ private void deleteStation() {
+ String stationName = getUserInput(INPUT_DELETE_STATION_NAME);
+ if (!StationService.deleteStation(stationName)) {
+ stationStart();
+ }
+ }
+
+ private void printStation() {
+ System.out.println(STATION_LIST);
+ StationService.print();
+ System.out.println();
+ }
+
+ private void lineStart() {
+ printLineView();
+ String userInput;
+ while (true) {
+ userInput = getUserInput(CHOICE_FUNCTION);
+ if (Arrays.asList(STATION_AND_LINE_CHOICE_LIST).contains(userInput)) {
+ break;
+ }
+ printErrorMessage();
+ }
+ lineToNextFunction(userInput);
+ }
+
+ private void printLineView() {
+ for (String str : LINE_INTERFACE) {
+ System.out.println(str);
+ }
+ System.out.println();
+ }
+
+ private void lineToNextFunction(String userInput) {
+ if (ONE_STRING.equals(userInput)) {
+ addLine();
+ return;
+ }
+ if (TWO_STRING.equals(userInput)) {
+ deleteLine();
+ return;
+ }
+ if (THREE_STRING.equals(userInput)) {
+ printLine();
+ }
+ }
+
+ private void addLine() {
+ String lineName = getUserInput(INPUT_ADD_LINE_NAME);
+ String firstStationName = getUserInput(INPUT_LINE_IN_FIRST_STATION);
+ String lastStationName = getUserInput(INPUT_LINE_IN_LAST_STATION);
+ if (!LineService.addLine(lineName, firstStationName, lastStationName, true)) {
+ lineStart();
+ }
+ }
+
+ private void deleteLine() {
+ String lineName = getUserInput(INPUT_DELETE_LINE_NAME);
+ LineService.deleteLine(lineName);
+ }
+
+ private void printLine() {
+ System.out.println(LINE_LIST);
+ LineService.print();
+ System.out.println();
+ }
+
+ private void sectionStart() {
+ printSectionView();
+ String userInput;
+ while (true) {
+ userInput = getUserInput(CHOICE_FUNCTION);
+ if (Arrays.asList(SECTION_LIST).contains(userInput)) {
+ break;
+ }
+ printErrorMessage();
+ }
+ SectionToNextFunction(userInput);
+ }
+
+ private void printSectionView() {
+ for (String str : SECTION_INTERFACE) {
+ System.out.println(str);
+ }
+ System.out.println();
+ }
+
+ private void SectionToNextFunction(String userInput) {
+ if (ONE_STRING.equals(userInput)) {
+ addSection();
+ return;
+ }
+ if (TWO_STRING.equals(userInput)) {
+ deleteSection();
+ }
+ }
+
+ private int getUserInputInt() {
+ int userInput;
+ while (true) {
+ System.out.println(INPUT_SECTION_ORDER);
+ try {
+ userInput = Integer.parseInt(scanner.next());
+ System.out.println();
+ } catch (Exception e) {
+ System.out.println(INPUT_TYPE_ERROR);
+ continue;
+ }
+ if (userInput < ZERO) {
+ System.out.println(INPUT_NUMBER_ERROR);
+ continue;
+ }
+ break;
+ }
+ return userInput;
+ }
+
+ private void addSection() {
+ String lineName = getUserInput(INPUT_SECTION_LINE_NAME);
+ String stationName = getUserInput(INPUT_SECTION_STATION_NAME);
+ int index = getUserInputInt();
+ if (!SectionService.addSection(lineName, stationName, index, true)) {
+ sectionStart();
+ }
+ }
+
+ private void deleteSection() {
+ String lineName = getUserInput(INPUT_SECTION_DELETE_LINE_NAME);
+ String stationName = getUserInput(INPUT_SECTION_DELETE_STATION_NAME);
+ if (!SectionService.deleteSection(lineName, stationName)) {
+ sectionStart();
+ }
+ }
+
+ private void printSubwayLine() {
+ System.out.println(SUBWAY_LINES_LIST);
+ SectionService.print();
+ System.out.println();
+ }
+}
diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java
index f4d738d5a..13e3f5d75 100644
--- a/src/main/java/subway/domain/Line.java
+++ b/src/main/java/subway/domain/Line.java
@@ -1,15 +1,54 @@
package subway.domain;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+
public class Line {
+
private String name;
+ private List lineInStationList = new ArrayList<>();
public Line(String name) {
this.name = name;
}
+ public List lineInStationList() {
+ return Collections.unmodifiableList(lineInStationList);
+ }
+
public String getName() {
return name;
}
- // 추가 기능 구현
+ public boolean isEqualName(String name) {
+ return name.equals(this.name);
+ }
+
+ public void initLineInStation(Station firstStation, Station lastStation) {
+ lineInStationList.add(firstStation);
+ lineInStationList.add(lastStation);
+ }
+
+ public boolean isExistStation(String name) {
+ for (Station station : lineInStationList) {
+ if (station.isEqualName(name)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public void insertLineInStation(Station station, int index) {
+ if (index > lineInStationList.size()) {
+ lineInStationList.add(lineInStationList.size(), station);
+ return;
+ }
+ lineInStationList.add(index, station);
+ }
+
+ public boolean deleteLineByName(String name) {
+ return lineInStationList.removeIf(station -> Objects.equals(station.getName(), name));
+ }
}
diff --git a/src/main/java/subway/domain/LineRepository.java b/src/main/java/subway/domain/LineRepository.java
index 49132ddb6..5f5432a5a 100644
--- a/src/main/java/subway/domain/LineRepository.java
+++ b/src/main/java/subway/domain/LineRepository.java
@@ -19,4 +19,31 @@ public static void addLine(Line line) {
public static boolean deleteLineByName(String name) {
return lines.removeIf(line -> Objects.equals(line.getName(), name));
}
+
+ public static boolean isEqualLineName(String name) {
+ for (Line line : lines) {
+ if (line.isEqualName(name)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static Line getLine(String name) {
+ for (Line line : lines) {
+ if (line.isEqualName(name)) {
+ return line;
+ }
+ }
+ return null;
+ }
+
+ public static boolean isExistStation(String name) {
+ for (Line line : lines) {
+ if (line.isExistStation(name)) {
+ return true;
+ }
+ }
+ return false;
+ }
}
diff --git a/src/main/java/subway/domain/Station.java b/src/main/java/subway/domain/Station.java
index bdb142590..5a506810f 100644
--- a/src/main/java/subway/domain/Station.java
+++ b/src/main/java/subway/domain/Station.java
@@ -1,6 +1,7 @@
package subway.domain;
public class Station {
+
private String name;
public Station(String name) {
@@ -11,5 +12,7 @@ public String getName() {
return name;
}
- // 추가 기능 구현
+ public boolean isEqualName(String name) {
+ return name.equals(this.name);
+ }
}
diff --git a/src/main/java/subway/domain/StationRepository.java b/src/main/java/subway/domain/StationRepository.java
index b7245c0f3..ead5283af 100644
--- a/src/main/java/subway/domain/StationRepository.java
+++ b/src/main/java/subway/domain/StationRepository.java
@@ -6,6 +6,7 @@
import java.util.Objects;
public class StationRepository {
+
private static final List stations = new ArrayList<>();
public static List stations() {
@@ -19,4 +20,26 @@ public static void addStation(Station station) {
public static boolean deleteStation(String name) {
return stations.removeIf(station -> Objects.equals(station.getName(), name));
}
+
+ public static boolean isEqualStationName(String name) {
+ for (Station station : stations) {
+ if (station.isEqualName(name)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static Station getStation(String name) {
+ for (Station station : stations) {
+ if (station.isEqualName(name)) {
+ return station;
+ }
+ }
+ return null;
+ }
+
+ public static boolean isExistByLineInStation(String name) {
+ return LineRepository.isExistStation(name);
+ }
}