전철역에서 사용자가 지하철에 승차하거나 교통카드를 충전하는 시스템
💰지하철 기본 요금은 일반 1,400원, 청소년 800원, 어린이 500원, 노약자는 무료입니다.
🚎정거장 10개 이하 이동 시 기본 요금이며, 그 이후엔 4개마다 50원씩 추가로 부과됩니다.
🔄환승은 4번 이하 무료이며, 그 이후엔 4번마다 기본요금이 추가로 부과됩니다.
🚫선불카드인 경우, 승차 도중 추가 요금을 지불할 잔액 부족 시 강제 하차될 수 있습니다.
💳교통카드의 종류로 선불카드, 후불카드, 기후동행카드가 있습니다.
-
선불카드는 잔액 부족 시 승차할 수 없으며, 승차 전에 먼저 금액을 충전합니다.
-
후불카드는 이용 금액을 누적하여 한 달 후에 지불합니다.
-
기후동행카드는 한 달 동안 횟수 제한없이 승차할 수 있습니다. 요금은 62,000원입니다.
-
최초에 임의의 사용자 객체를 생성하여 프로그램을 실행시키고, 하차시 userList.txt파일에 사용자 기록을 저장합니다. 그 후 userList.txt에서 이용자 정보를 읽어와 프로그램을 실행합니다.
-
나이에 따라 일반, 청소년, 어린이, 노약자 요금을 내는 사용자들은 기후동행카드, 선불카드, 후불카드 중 하나를 가지고 있습니다.
-
사용자들은 Station에서 승차하거나 카드를 충전할 수 있고, 승차후 환승하거나 하차할 수 있습니다. 하차시 user의 카드와 나이에 따른 정보 출력 후 프로그램이 종료됩니다.
승차와 충전 메뉴 제공
- 임의의 사용자 객체를 생성
- 사용자가 아이디를 입력하면 그 아이디의 사용자 정보를 가져옴
- 사용자는 메뉴에서 1. 승차, 2. 교통카드 충전을 선택
- 사용자가 승차하거나 충전했을 경우 잔액/사용 날짜/유효기간 날짜를 변경한 내역을 userList.txt파일에 저장
승차 시 이동 거리, 환승 여부를 물어보는 메뉴 제공
- 승차하기 전, 사용자의 선불카드에 잔액이 부족하거나, 기후동행카드의 유효기간이 만료되었을 경우 다시 Station 메뉴로 돌아감 (check 메소드)
- 사용자는 승차 시 정거장 이동 수를 입력
- 사용자는 이동 후 하차할지, 환승할지 여부를 입력
- 사용자가 입력한 총 정거장 이동 수(stops), 환승 횟수(transfer)와 사용자의 정보(Card 객체, 선불카드일 경우 잔액)를 FeeInvoice에 전달
- FeeInvoice에서 사용자의 정보에 따라 계산한 요금과 잔액/누적 금액 정보를 사용자에게 제공
카드 충전 메뉴 제공 및 카드 현황 출력
- 카드 충전 메뉴 제공
- user가 보유한 카드의 충전 메소드 호출하여 충전 진행
- 카드 현황 출력
승하차시 요금 정보 출력 / 탑승 후 잔액 체크
- Gate에서 Card의 정보(card 종류, card가 가지고 있는 user의 기본 요금, card의 잔액(or 누적 금액)), 이동한 정거장 수, 환승 횟수를 받아 승하차 시 ClimateCard라면 만료일 정보를, DeferredCard와 PrepaidCard라면 기본요금과 잔액(or 누적금액) 보여줌
- 탑승 후 잔액을 체크하여 잔액 부족 시 하차 시킴
사용자 정보에 들어갈 필드 값을 설정/가져오기
- 사용자 정보에 들어갈 userId, name, age, price (나이에 맞는 기본 요금), card 종류
사용자 정보 리스트 저장소
- 임의의 사용자 정보를 리스트에 저장
사용자가 가지고 있는 카드 객체 저장
- 카드 객체의 생성자, getter/setter, toString 오버라이드를 선언한 부모 클래스
기후동행카드의 정보
- 카드 정보 저장(필드, 생성자, getter/setter)
- 충전 기능 제공(충전일 입력, 유효성 체크)
후불카드의 정보
- 카드 정보 저장(필드, 생성자, getter/setter)
- 충전 기능 제공(자동결제 날짜 입력, 유효성 체크)
선불카드의 정보
- 카드 정보 저장(필드, 생성자, getter/setter)
- 충전 기능 제공(충전금액 입력, 유효성 체크)
- Gate, UserRepository, User, Station 담당
주제 선정과 요구사항 정리는 수월하게 진행하였습니다. 하지만 어떤 객체만 도출할지, 그 객체들이 서로 어떻게 상호작용하는지에 대한 3명의 생각이 다 달랐기 때문에 그 의견을 취합하는 과정이 오래 걸렸습니다. 그렇지만 그만큼 다들 구체적으로 생각했기에 많은 경우의 수를 제거할 수 있었고, 열정을 가지고 좀 더 완성도 있는 프로젝트를 제작할 수 있었다고 생각합니다.
전에 프로젝트를 진행했을 땐 주제 선정 후 각자 맡은 부분을 바로 코딩했기 때문에, 제가 맡은 것 외에는 다른 객체들이 어떻게 흘러가는지 이해하기 힘들었습니다. 이번 경험을 통해 프로젝트에 대한 이해와 집중력이 높아질 수 있도록 사전에 객체의 상호작용을 정리하는 시간이 매우 중요하다는 것을 깨달았습니다.
각자의 의견을 존중하고, 이해가 안 가는 부분은 바로 물어볼 수 있도록 이끌어준 팀의 분위기가 너무 좋았습니다. 예상치 못 한 사고로 따로 떨어져 있게 된 저의 참여도를 높일 수 있도록 현장에 있다고 생각할 만큼 소통을 잘해준 팀원분들에게 미안하고 감사합니다.
- FeeInvoice, UserReposiotry, Station 담당
처음엔 헤매기도 하고 요구사항 도출도 이슈 작성도 쉬운 것 하나 없었습니다. 하지만 많은 대화를 나누고 UseCase 작성도 해보면서 서로의 생각을 맞춰나갔습니다. 그럼에도 아직 요구사항 도출과 이슈 작성 등은 부족하고 어렵지만 당연한 것이라 생각합니다.
테스트하는 과정에서도 많은 테스트 케이스가 발생할 수 있다는 점, 예상치 못한 부분, 여러명이 여러 테스트를 진행해야 한다는 점들을 다시 상기할 수 있던 점도 많은 도움이 된 것 같습니다. 그리고 제가 담당한 파트만 보는 것이 아니라 다른 팀원이 작성한 코드를 보며 전반적인 흐름을 파악하는 것이 중요하다는 사실도 한번 더 깨닫게 되어 배움이 많았던 프로젝트였습니다.
여러 시행착오가 있었음에도 불구하고 팀원들의 노력이 있어서 만족스러운 결과를 만들어내었습니다.
- Card, ClimateCard, DeferredCard, PrepaidCard, Charger, UserRepository, User, Station 담당
추상화하는 과정에서 각자가 생각한 클래스의 구조가 다 달라서 세세한 요구사항들을 합의해 나가는 것이 쉽지는 않았습니다. 그러나 이슈 하나 하나를 해결하면서 객체지향프로그래밍에 대한 이해의 깊이가 한층 깊어지는 것을 느꼈습니다. 각자 맡은 역할에 충실하면서도 서로의 오류를 함께 고민하며 시너지를 얻는 재미를 알게 되었습니다. 다양한 경우의 수를 생각해내고 테스트하면서 보충에 보충을 더했고 마지막까지도 긴장을 놓을 수 없던 것 같습니다. 그만큼 여기까지 온 프로그램을 보니 뿌듯합니다.