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

[지하철 노선도] 이도경 미션 제출합니다 #3

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
33 changes: 33 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# 기능정의

## 도메인

### 지하철(Staion)

- [ ] 지하철역 등록 기능
- [ ] [ERROR] 지하철역은 두글자 이상이여야 한다.
- [ ] [ERROR] 지하철역은 한국어만 가능합니다.
- [ ] [ERROR] 중복된 역 이름은 등록할 수 없습니다.
- [ ] 지하철역 삭제 기능
- [ ] [ERROR] 존재하는 지하철역만 삭제 가능합니다.
- [ ] [ERROR] 노선에 등록된 역은 삭제가 안됩니다.
- [ ] 지하철역 전체 조회 기능

### 노선(Line)

- [ ] 노선 등록 기능
- [ ] 등록시 상행 종점과 하행 종점을 입력받는다.
- [ ] [ERROR] 노선의 이름은 두글자 이상이여야 한다.
- [ ] 노선 삭제 기능
- [ ] [ERROR] 존재하는 노선만 삭제 가능합니다.
- [ ] 노선 목록 조회 기능
- [ ] 노선에 등록된 역 조회 기능
- [ ] 노선의 상행 종점부터 하행 종점까지 순서대로 목록을 조회한다.

### 구간

- [ ] 존재하는 노선에 역을 추가한다.
- [ ] [ERROR] 등록된 역만 노선에 추가가 가능하다.
- [ ] 노선에 역을 삭제한다.
- [ ] [ERROR] 노선에 역이 2개 이하면 삭제할 수 없다.
- [ ] [ERROR] 노선에 존재하는 욕만 삭제할 수 있다.
4 changes: 4 additions & 0 deletions src/main/java/subway/Application.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,9 @@ public class Application {
public static void main(String[] args) {
final Scanner scanner = new Scanner(System.in);
// TODO: 프로그램 구현
Initializer.initializeSubwaySystem();

SubwaySystem subwaySystem = new SubwaySystem(scanner);
subwaySystem.run();
}
}
38 changes: 38 additions & 0 deletions src/main/java/subway/Initializer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package subway;

import subway.domain.*;

public class Initializer {

public static void initializeSubwaySystem() {
// Register stations
StationRepository.addStation(new Station("교대역"));
StationRepository.addStation(new Station("강남역"));
StationRepository.addStation(new Station("역삼역"));
StationRepository.addStation(new Station("남부터미널역"));
StationRepository.addStation(new Station("양재역"));
StationRepository.addStation(new Station("양재시민의숲역"));
StationRepository.addStation(new Station("매봉역"));

// Register lines and add stations to them
Line line2 = new Line("2호선");
line2.addStation(StationRepository.getStation("교대역"));
line2.addStation(StationRepository.getStation("강남역"));
line2.addStation(StationRepository.getStation("역삼역"));
LineRepository.addLine(line2);

Line line3 = new Line("3호선");
line3.addStation(StationRepository.getStation("교대역"));
line3.addStation(StationRepository.getStation("남부터미널역"));
line3.addStation(StationRepository.getStation("양재역"));
line3.addStation(StationRepository.getStation("매봉역"));
LineRepository.addLine(line3);

Line sinbundang = new Line("신분당선");
sinbundang.addStation(StationRepository.getStation("강남역"));
sinbundang.addStation(StationRepository.getStation("양재역"));
sinbundang.addStation(StationRepository.getStation("양재시민의숲역"));
LineRepository.addLine(sinbundang);
}

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

import java.util.Scanner;
import subway.domain.*;

public class SubwaySystem {
private final Scanner scanner;

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

public void run() {
boolean keepRunning = true;
while (keepRunning) {
showMainMenu();
String command = scanner.nextLine().trim();
switch (command) {
case "1":
manageStations();
break;
case "2":
manageLines();
break;
case "3":
manageSections();
break;
case "4":
printSubwayMap();
break;
case "Q":
case "q":
System.out.println("[INFO] 프로그램을 종료합니다.");
keepRunning = false;
break;
default:
System.out.println("[ERROR] 선택할 수 없는 기능입니다.");
}
}
}

private void showMainMenu() {
System.out.println("\n## 메인 화면");
System.out.println("1. 역 관리");
System.out.println("2. 노선 관리");
System.out.println("3. 구간 관리");
System.out.println("4. 지하철 노선도 출력");
System.out.println("Q. 종료");
System.out.print("## 원하는 기능을 선택하세요: ");
}

private void manageStations() {
while (true) {
System.out.println("\n## 역 관리 화면");
System.out.println("1. 역 등록");
System.out.println("2. 역 삭제");
System.out.println("3. 역 조회");
System.out.println("B. 돌아가기");
System.out.print("## 원하는 기능을 선택하세요: ");
String command = scanner.nextLine().trim();
switch (command) {
case "1":
addStation();
return;
case "2":
removeStation();
return;
case "3":
showStations();
return;
case "B":
case "b":
return;
default:
System.out.println("[ERROR] 선택할 수 없는 기능입니다.");
}
}
}

private void addStation() {
System.out.print("## 등록할 역 이름을 입력하세요: ");
String stationName = scanner.nextLine().trim();
if (StationRepository.exists(stationName)) {
System.out.println("[ERROR] 이미 등록된 역 이름입니다.");
} else {
StationRepository.addStation(new Station(stationName));
System.out.println("[INFO] 지하철 역이 등록되었습니다.");
}
}

private void removeStation() {
System.out.print("## 삭제할 역 이름을 입력하세요: ");
String stationName = scanner.nextLine().trim();
if (StationRepository.deleteStation(stationName)) {
System.out.println("[INFO] 지하철 역이 삭제되었습니다.");
} else {
System.out.println("[ERROR] 역이 존재하지 않거나 삭제할 수 없습니다.");
}
}

private void showStations() {
System.out.println("## 역 목록");
for (Station station : StationRepository.stations()) {
System.out.println("[INFO] " + station.getName());
}
}


private void manageLines() {
while (true) {
System.out.println("\n## 노선 관리 화면");
System.out.println("1. 노선 등록");
System.out.println("2. 노선 삭제");
System.out.println("3. 노선 조회");
System.out.println("B. 돌아가기");
System.out.print("## 원하는 기능을 선택하세요: ");
String command = scanner.nextLine().trim();
switch (command) {
case "1":
addLine();
return;
case "2":
removeLine();
return;
case "3":
showLines();
return;
case "B":
case "b":
return;
default:
System.out.println("[ERROR] 선택할 수 없는 기능입니다.");
}
}
}

private void addLine() {
System.out.print("## 등록할 노선 이름을 입력하세요: ");
String lineName = scanner.nextLine().trim();
if (LineRepository.exists(lineName)) {
System.out.println("[ERROR] 이미 등록된 노선 이름입니다.");
return;
}

System.out.print("## 등록할 노선의 상행 종점역 이름을 입력하세요: ");
String startStationName = scanner.nextLine().trim();
Station startStation = StationRepository.getStation(startStationName);
if (startStation == null) {
System.out.println("[ERROR] 상행 종점역이 존재하지 않습니다.");
return;
}

System.out.print("## 등록할 노선의 하행 종점역 이름을 입력하세요: ");
String endStationName = scanner.nextLine().trim();
Station endStation = StationRepository.getStation(endStationName);
if (endStation == null) {
System.out.println("[ERROR] 하행 종점역이 존재하지 않습니다.");
return;
}

Line newLine = new Line(lineName);
newLine.addStation(startStation);
newLine.addStation(endStation);
LineRepository.addLine(newLine);
System.out.println("[INFO] 지하철 노선이 등록되었습니다.");
}


private void removeLine() {
System.out.print("## 삭제할 노선 이름을 입력하세요: ");
String lineName = scanner.nextLine().trim();
if (LineRepository.deleteLineByName(lineName)) {
System.out.println("[INFO] 지하철 노선이 삭제되었습니다.");
} else {
System.out.println("[ERROR] 노선이 존재하지 않거나 삭제할 수 없습니다.");
}
}

private void showLines() {
System.out.println("## 노선 목록");
for (Line line : LineRepository.lines()) {
System.out.println("[INFO] " + line.getName());
}
}


private void manageSections() {
while (true) {
System.out.println("\n## 구간 관리 화면");
System.out.println("1. 구간 등록");
System.out.println("2. 구간 삭제");
System.out.println("B. 돌아가기");
System.out.print("## 원하는 기능을 선택하세요: ");
String command = scanner.nextLine().trim();
switch (command) {
case "1":
addSection();
return;
case "2":
removeSection();
return;
case "B":
case "b":
return;
default:
System.out.println("[ERROR] 선택할 수 없는 기능입니다.");
}
}
}

private void addSection() {
System.out.print("## 등록할 구간의 노선 이름을 입력하세요: ");
String lineName = scanner.nextLine().trim();
Line line = LineRepository.getLine(lineName);
if (line == null) {
System.out.println("[ERROR] 노선이 존재하지 않습니다.");
return;
}

System.out.print("## 등록할 구간의 역 이름을 입력하세요: ");
String stationName = scanner.nextLine().trim();
Station station = StationRepository.getStation(stationName);
if (station == null) {
System.out.println("[ERROR] 역이 존재하지 않습니다.");
return;
}

System.out.print("## 구간 순서를 입력하세요: ");
int order = Integer.parseInt(scanner.nextLine().trim());
if (order < 1 || order > line.getStations().size() + 1) {
System.out.println("[ERROR] 유효하지 않은 구간 순서입니다.");
return;
}

line.addStationAt(station, order - 1);
System.out.println("[INFO] 구간이 등록되었습니다.");
}

private void removeSection() {
System.out.print("## 삭제할 구간의 노선 이름을 입력하세요: ");
String lineName = scanner.nextLine().trim();
Line line = LineRepository.getLine(lineName);
if (line == null) {
System.out.println("[ERROR] 노선이 존재하지 않습니다.");
return;
}

System.out.print("## 삭제할 구간의 역 이름을 입력하세요: ");
String stationName = scanner.nextLine().trim();
if (!line.removeStationByName(stationName)) {
System.out.println("[ERROR] 구간 삭제에 실패했습니다.");
} else {
System.out.println("[INFO] 구간이 삭제되었습니다.");
}
}


private void printSubwayMap() {
System.out.println("\n## 지하철 노선도");
for (Line line : LineRepository.lines()) {
System.out.println("[INFO] " + line.getName());
System.out.println("[INFO] ---");
for (Station station : line.getStations()) {
System.out.println("[INFO] " + station.getName());
}
}
}

}
25 changes: 25 additions & 0 deletions src/main/java/subway/domain/Line.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package subway.domain;

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

public class Line {
private String name;
private List<Station> stations = new ArrayList<>();

public Line(String name) {
this.name = name;
Expand All @@ -12,4 +16,25 @@ public String getName() {
}

// 추가 기능 구현
public void addStation(Station station) {
stations.add(station);
}

public void removeStation(Station station) {
stations.remove(station);
}

public List<Station> getStations() {
return stations;
}

public void addStationAt(Station station, int index) {
if (index >= 0 && index <= stations.size()) {
stations.add(index, station);
}
}

public boolean removeStationByName(String stationName) {
return stations.removeIf(station -> station.getName().equals(stationName));
}
}
Loading