Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[지하철 노선도 미션] 김태완 미션 제출합니다. #104

Open
wants to merge 38 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
ae2a055
docs: 구현할 기능 목록 추가
kixtaxwax Dec 13, 2020
09277e4
feat: 지하철 역과 노선을 관리하기 위한 SubwayMapEditor 추가
kixtaxwax Dec 13, 2020
3180f3a
feat: 초기 역과 노선 등록
kixtaxwax Dec 14, 2020
0e37804
feat: 메인 화면 출력 기능 추가
kixtaxwax Dec 14, 2020
894d20e
feat: 원하는 기능 선택받는 기능 추가
kixtaxwax Dec 14, 2020
7de235a
feat: 메인 화면 유저 입력에 대한 예외처리기능 추가
kixtaxwax Dec 14, 2020
555931a
fix: 예외처리 버그 수정
kixtaxwax Dec 14, 2020
8c8cdcf
feat: 기능별 실행을 위한 enum 클래스 추가
kixtaxwax Dec 14, 2020
a35c34c
feat: 역 관리 화면 출력 기능 추가
kixtaxwax Dec 15, 2020
c2973a1
refactor: 역 관리 화면 클래스 분리
kixtaxwax Dec 15, 2020
e02f4ae
fix: Q 입력 처리 버그 수정
kixtaxwax Dec 15, 2020
5cc0106
feat: 노선 관리 화면 기능 추가
kixtaxwax Dec 15, 2020
a6af98a
feat: 구간 관리 화면 기능 추가
kixtaxwax Dec 15, 2020
0c844f0
feat: 역 관리 화면 기능별 실행을 위한 enum 클래스 추가
kixtaxwax Dec 15, 2020
8f5f686
feat: 역 이름 입력 시 예외처리 기능 추가
kixtaxwax Dec 15, 2020
7028750
feat: 역 이름 등록 기능 추가
kixtaxwax Dec 15, 2020
b2967a5
feat: 중복된 역 예외처리기능 추가
kixtaxwax Dec 15, 2020
e86d3f7
refactor: 함수명 변경 및 등록 완료 메시지 추가
kixtaxwax Dec 15, 2020
1f04b3d
feat: 초기 세팅 기능 추가
kixtaxwax Dec 15, 2020
75057fb
feat: 지하철 노선도 출력 기능 추가
kixtaxwax Dec 15, 2020
6e0e088
feat: 노선 등록 기능 추가
kixtaxwax Dec 15, 2020
1e8ba07
노선 등록 예외처리기능 추가
kixtaxwax Dec 15, 2020
ff3ec72
feat: 역 삭제 예외처리 기능 추가
kixtaxwax Dec 15, 2020
f1e87eb
feat: 노선 삭제 기능 추가
kixtaxwax Dec 15, 2020
5d70d0e
feat: 노선 조회 기능 추가
kixtaxwax Dec 15, 2020
65571fc
style: 함수 선언 순서 변경
kixtaxwax Dec 15, 2020
a5f294f
refactor: 상수 코딩 수정
kixtaxwax Dec 15, 2020
83a732c
refactor: Station 객체간 비교를 위해 equals, hashcode 오버라이딩
kixtaxwax Dec 15, 2020
567abea
refactor: 상수 코딩 수정
kixtaxwax Dec 15, 2020
7fb2416
feat: 지하철 노선도 출력 기능
kixtaxwax Dec 15, 2020
f6a37ed
feat: 역 목록 조회 기능
kixtaxwax Dec 15, 2020
8313106
refactor: 함수 분리
kixtaxwax Dec 15, 2020
768fda3
fix: 노선 존재 여부 함수 버그 수정
kixtaxwax Dec 15, 2020
4f5b1ec
feat: 구간 등록시 노선에 이미 역이 존재하는 경우 예외처리
kixtaxwax Dec 15, 2020
a58af22
feat: 구간 등록 기능 추가
kixtaxwax Dec 15, 2020
958419e
feat: 구간 삭제 기능 추가
kixtaxwax Dec 15, 2020
a182f9c
feat: 구간 삭제 메시지 추가
kixtaxwax Dec 15, 2020
fa24c5a
feat: 게임 실행
kixtaxwax Dec 15, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# 지하철 노선도 미션
- 지하철 역과 노선을 관리하는 지하철 노선도 기능을 구현한다.

## 구현할 기능 목록

### 초기 설정
- 프로그램 시작 시 역, 노선 등 필요한 정보를 미리 세팅하기
> 아래의 사전 등록 정보로 초기 설정하기
```
1. 지하철역으로 교대역, 강남역, 역삼역, 남부터미널역, 양재역, 양재시민의숲역, 매봉역이 등록되어 있다.
2. 지하철 노선으로 2호선, 3호선, 신분당선이 등록되어 있다.
3. 노선에 역이 아래와 같이 등록되어 있다.(왼쪽 끝이 상행 종점)
- 2호선: 교대역 - 강남역 - 역삼역
- 3호선: 교대역 - 남부터미널역 - 양재역 - 매봉역
- 신분당선: 강남역 - 양재역 - 양재시민의숲역
```

### 지하철 역 관련 기능
- 지하철 역 등록
- 예외: 지하철 역 이름은 2글자 이상이어야 한다.
- 예외: 지하철 역 이름은 중복될 수 없다.
- 지하철 역 삭제
- 예외: 노선에 등록되어 있는 역은 삭제할 수 없다.
- 지하철 역 목록 조회

###지하철 노선 관련 기능
- 지하철 노선 등록
- 예외: 지하철 노선 이름은 중복될 수 없다.
- 예외: 지하철 노선 이름은 2글자 이상이어야 한다.
<br/><br/>
노선 등록 시 상행 종점역과 하행 종점역을 입력받아야 한다.
- 예외: 등록되어 있지 않은 역이 상,하행 종점역 입력으로 들어왔을 때

- 지하철 노선 삭제
- 예외: 존재하지 않는 노선을 삭제하려는 경우

- 지하철 노선 목록 조회

###지하철 구간 추가 기능
- 노선에 새로운 역을 등록하는 기능
- 역과 역 사이: 구간
- 구간들의 모음: 노선
- 예외: 이미 노선에 등록되어있는 역이 입력으로 들어오는 경우

###지하철 구간 삭제 기능
- 노선에 등록된 역을 제거하는 기능
- 상행 종점 제거 시 다음 역이 상행 종점
- 하행 종점 제거 시 이전 역이 하행 종점
- 예외: 노선에 포함된 역이 두 개 이하인 노선의 역을 제거하려는 경우

###지하철 노선에 등록된 역 조회 기능
- 노선의 상행 종점부터 하행 종점까지 연결된 순서대로 역 목록을 조회한다.

###지하철 노선도 출력 기능

4 changes: 4 additions & 0 deletions src/main/java/subway/Application.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
package subway;

import subway.controller.SubwayMapEditor;

import java.util.Scanner;

public class Application {
public static void main(String[] args) {
final Scanner scanner = new Scanner(System.in);
// TODO: 프로그램 구현
SubwayMapEditor subwayMapEditor = new SubwayMapEditor(scanner);
subwayMapEditor.run();
}
}
24 changes: 24 additions & 0 deletions src/main/java/subway/controller/SubwayMapEditor.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package subway.controller;

import subway.domain.SubwayMap;
import subway.view.MainScreenInputView;
import subway.view.MainScreenOutputView;

import java.util.Scanner;

public class SubwayMapEditor {
private final Scanner scanner;

public SubwayMapEditor(Scanner scanner) {
this.scanner = scanner;
}

public void run() {
SubwayMap subwayMap = new SubwayMap();
boolean isPersist = false;
do {
isPersist = MainScreenInputView.getMainScreenUserSelection(scanner);
} while (isPersist);

}
}
46 changes: 45 additions & 1 deletion src/main/java/subway/domain/Line.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,59 @@
package subway.domain;

import java.util.ArrayList;
import java.util.List;

public class Line {
private static final String INFO = "[INFO] ";
private static final String STATION_NUMBER_MESSAGE = "[ERROR] 노선의 역 개수가 2개 이하이므로 삭제할 수 없습니다.";

private String name;
private List<Station> stationsOnLine = new ArrayList<>();

public Line(String name) {
this.name = name;
}

public void registerStation(Station station) {
stationsOnLine.add(station);
}

public boolean isStationRegistered(String stationName) {
for (Station station : stationsOnLine) {
if (station.getName().equals(stationName)) {
return true;
}
}
return false;
}

public void printStations() {
for (Station station : stationsOnLine) {
System.out.println(INFO + station.getName());
}
System.out.println();
}

public String getName() {
return name;
}

// 추가 기능 구현
public boolean isSameName(String lineName) {
return this.name.equals(lineName);
}

public int getSize() {
return stationsOnLine.size();
}

public void insert(Station station, int order) {
stationsOnLine.add(order-1, station);
}

public void remove(String stationName) {
if (stationsOnLine.size() <= 2) {
throw new IllegalArgumentException(STATION_NUMBER_MESSAGE);
}
stationsOnLine.remove(new Station(stationName));
}
}
35 changes: 35 additions & 0 deletions src/main/java/subway/domain/LineRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@
import java.util.Objects;

public class LineRepository {
private static final String INFO = "[INFO] ";
private static final String INFO_WITH_BORDER = "[INFO] ---";
private static final String LINE_LIST = "## 노선 목록";
private static final String SUBWAY_MAP = "## 지하철 노선도";
private static final String LINE_NOT_EXIST = "[ERROR] 존재하지 않는 노선입니다.";

private static final List<Line> lines = new ArrayList<>();

public static List<Line> lines() {
Expand All @@ -19,4 +25,33 @@ public static void addLine(Line line) {
public static boolean deleteLineByName(String name) {
return lines.removeIf(line -> Objects.equals(line.getName(), name));
}

public static void isLineExist(String lineName) {
boolean flag = false;
for (Line line : lines) {
flag = line.getName().equals(lineName);
if(flag) break;
}
if (!flag) {
throw new IllegalArgumentException(LINE_NOT_EXIST);
}
}

public static void printLines() {
System.out.println(LINE_LIST);
for (Line line : lines) {
System.out.println(INFO + line.getName());
}
System.out.println();
}

public static void printMap() {
System.out.println();
System.out.println(SUBWAY_MAP);
for (Line line : lines) {
System.out.println(INFO + line.getName());
System.out.println(INFO_WITH_BORDER);
line.printStations();
}
}
}
20 changes: 19 additions & 1 deletion src/main/java/subway/domain/Station.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,33 @@
package subway.domain;

import java.util.Objects;

public class Station {
private String name;

public Station(String name) {
// TODO 이름 2글자 이상인지 확인할 것
this.name = name;
}

public String getName() {
return name;
}

// 추가 기능 구현
public boolean isSameName(String stationName) {
return this.name.equals(stationName);
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Station station = (Station) o;
return Objects.equals(name, station.name);
}

@Override
public int hashCode() {
return Objects.hash(name);
}
}
20 changes: 20 additions & 0 deletions src/main/java/subway/domain/StationRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
import java.util.Objects;

public class StationRepository {
private static final String INFO = "[INFO] ";
private static final String STATION_LIST = "## 역 목록";

private static final List<Station> stations = new ArrayList<>();

public static List<Station> stations() {
Expand All @@ -19,4 +22,21 @@ public static void addStation(Station station) {
public static boolean deleteStation(String name) {
return stations.removeIf(station -> Objects.equals(station.getName(), name));
}

public static boolean isStationExist(String stationName) {
for (Station station : stations) {
if (station.isSameName(stationName)) {
return true;
}
}
return false;
}

public static void printStations() {
System.out.println();
System.out.println(STATION_LIST);
for (Station station : stations) {
System.out.println(INFO + station.getName());
}
}
}
75 changes: 75 additions & 0 deletions src/main/java/subway/domain/SubwayMap.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package subway.domain;

public class SubwayMap {
private static final String LINE_NUMBER_TWO = "2호선";
private static final String LINE_NUMBER_THREE = "3호선";
private static final String LINE_NEW_BOONDANG = "신분당선";
private static final String GYODAE_STATION = "교대역";
private static final String GANGNAM_STATION = "강남역";
private static final String YEOKSAM_STATION = "역삼역";
private static final String NAMBU_TERMINAL_STATION = "남부터미널역";
private static final String YANGJAE_STATION = "양재역";
private static final String YANGJAE_CITIZEN_FOREST_STATION = "양재시민의숲역";
private static final String MAEBONG_STATION = "매봉역";

private Line lineNumberTwo;
private Line lineNumberThree;
private Line lineNewBoondang;
private Station gyodaeStation;
private Station gangnamStation;
private Station yeoksamStation;
private Station nambuTerminalStation;
private Station yangjaeStation;
private Station yangjaeCitizenForestStation;
private Station maebongStation;

public SubwayMap() {
initialize();
}

public void initialize() {
initializeLine();
initializeStation();
initializeMap();
}

private void initializeLine() {
lineNumberTwo = new Line(LINE_NUMBER_TWO);
lineNumberThree = new Line(LINE_NUMBER_THREE);
lineNewBoondang = new Line(LINE_NEW_BOONDANG);
LineRepository.addLine(lineNumberTwo);
LineRepository.addLine(lineNumberThree);
LineRepository.addLine(lineNewBoondang);
}

private void initializeStation() {
gyodaeStation = new Station(GYODAE_STATION);
gangnamStation = new Station(GANGNAM_STATION);
yeoksamStation = new Station(YEOKSAM_STATION);
nambuTerminalStation = new Station(NAMBU_TERMINAL_STATION);
yangjaeStation = new Station(YANGJAE_STATION);
yangjaeCitizenForestStation = new Station(YANGJAE_CITIZEN_FOREST_STATION);
maebongStation = new Station(MAEBONG_STATION);
StationRepository.addStation(gyodaeStation);
StationRepository.addStation(gangnamStation);
StationRepository.addStation(yeoksamStation);
StationRepository.addStation(nambuTerminalStation);
StationRepository.addStation(yangjaeStation);
StationRepository.addStation(yangjaeCitizenForestStation);
StationRepository.addStation(maebongStation);
}

private void initializeMap() {
lineNumberTwo.registerStation(gyodaeStation);
lineNumberTwo.registerStation(gangnamStation);
lineNumberTwo.registerStation(yeoksamStation);
lineNumberThree.registerStation(gyodaeStation);
lineNumberThree.registerStation(nambuTerminalStation);
lineNumberThree.registerStation(yangjaeStation);
lineNumberThree.registerStation(maebongStation);
lineNewBoondang.registerStation(gangnamStation);
lineNewBoondang.registerStation(yangjaeStation);
lineNewBoondang.registerStation(yangjaeCitizenForestStation);
}

}
37 changes: 37 additions & 0 deletions src/main/java/subway/type/LineScreenFunctionType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package subway.type;

import subway.domain.LineRepository;
import subway.view.LineInputView;

public enum LineScreenFunctionType {
REGISTER_STATION(1) {
@Override
public void execute() {
LineInputView.registerLine();
}
},
REMOVE_STATION(2) {
@Override
public void execute() {
LineInputView.removeLine();
}
},
PRINT_STATION(3) {
@Override
public void execute() {
LineRepository.printLines();
}
};

private final int functionCode;

LineScreenFunctionType(int functionCode) {
this.functionCode = functionCode;
}

public boolean isSameFunctionCode(int number) {
return this.functionCode == number;
}

public abstract void execute();
}
Loading