item
package accountbook;
/* 클래스명 : Item
* - 수입/지출 내역을 나타내는 클래스
* 수입 : 수입/지출
* 날짜 :
* 자산 : 현금/은행/카드
* 분류 : 식비/교통/건강
* 금액 :
* 내용 : */
public class Item {
private String type; //수입, 지출
private String date; //날짜
private String paymentType; //결제타입: 현금/은행/카드
private String category; //분류: 식비/교통/건강/월급/부수입 등
private int cost; //금액(비용)
private String contents; //내용
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getPaymentType() {
return paymentType;
}
public void setPaymentType(String paymentType) {
this.paymentType = paymentType;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public int getCost() {
return cost;
}
public int calCost() {
switch(type) {
case "지출":
return -cost;
case "수입":
return cost;
default:
return 0;
}
}
public void setCost(int cost) {
this.cost = cost;
}
public String getContents() {
return contents;
}
public void setContents(String contents) {
this.contents = contents;
}
public Item(String type, String date, String paymentType, String category, int cost, String contents) {
this.type = type;
this.date = date;
this.paymentType = paymentType;
this.category = category;
this.cost = cost;
this.contents = contents;
}
/* 기능 : 멤버변수를 수정하는 기능
* 매개변수 : 수정할 멤버변수 내용
* String type, String date, String paymentType, String category, int cost, int contents
* 리턴타입 : 없음 => void (리턴타입을 수정하는 것들은 보통 리턴타입 없는 경우가 많음)
* 메소드명 : update*/
public void update(String type, String date, String paymentType, String category, int cost, String contents) {
if(type != null) {
this.type = type;
}if(date != null) {
this.date=date;
}if(paymentType !=null) {
this.paymentType=paymentType;
}if(category != null) {
this.category = category;
}if(cost != 0) {
this.cost = cost;
}if(contents !=null) {
this.contents = contents;
}
//this.type = type;
//this.date = date;
//this.paymentType = paymentType;
//this.category = category;
//this.cost = cost;
//this.contents = contents;
}
}
Accountbook2
package accountbook;
/* 클래스명 : AccountBook
* - 수입 내역, 지출 내역을 관리하기 위한 가계부 클래스
*/
public class AccountBook2 {
//멤버변수
private Item []arr; //가계부 내역들 - 값을 바꾸면 안되니까 satter/getter를 안만들거임=>참조변수라서 주소를 알려주면 밖에서 값을 수정함
private int count; //저장된 내역들 갯수 - 밖에다가 값을 알려주면 안돼.
private int total; //내역에 기입된 금액의 총 양 - 같은이유 => count랑 total은 getter만 만들거임
public int getCount() {
return count;
}
public int getTotal() {
return total;
}
//멤버메소드
/* 기능 : 내역(Item)이 주어지면 주어진 내역을 가계부에 저장하는 메소드
* 매개변수 : 내역=> Item item
* 리턴타입 : void
* 메소드명 : insert
* */
public void insert(Item item) {
//가계부 배열이 꽉차면 내역을 추가하지 않음
if(count < arr.length) {
arr[count] = item;
count++;
//총 금액을 계산
total = total + item.calCost();
}
}
/* 기능 : 수정할 번지와 수정할 내역이 주어지면 가계부를 수정하는 메소드
* 매개변수 : 수정할 번지, 수정할 내역 => int index, Item item
* 리턴타입 : void
* 메소드명 : update
* */
public void update(int index, Item item) {
if(index < count && index >=0) { //번지로해야하면 음수처리도 같이해야함. 사용자가 -1을 입력했을때를 대비
//total 계산
total = total - arr[index].calCost();
total = total + item.calCost();
arr[index] = item;
}
}
/* 기능 : 삭제할 번지가 주어지면 해당 번지에 있는 내역을 삭제하는 메소드
* 매개변수 : 삭제할 번지 => int index
* 리턴타입 : 없음 => void
* 메소드명 : delete
* */
public void delete(int index) {
if(index >= count || index < 0) {
System.out.println("잘못된 번지입니다.");
return ;
}
total = total - arr[index].calCost();
//삭제된 공간을 제거하기 위해 앞으로 하나씩 당기는 작업(뒤에 값을 빈곳으로 덮어씌움을 반복)
for(int i = index; i<count-1; i++) {
arr[index] = arr[i+1];
}
count--; //삭제한 후, 내역 갯수를 줄여줌
}
/* 기능 : 내역 전체를 자세히 확인하는 메소드
* 매개변수 : 없음
* 리턴타입 : 없음 => void
* 메소드명 : printItemListDetail
* */
public void printItemListDetail() {
for(int i=0; i<count; i++) {
System.out.println("-------내역" + (i+1) + "--------");
printItem(i);
}
}
/* 기능 : 내역 전체를 간략히 확인하는 메소드
* 매개변수 : 없음
* 리턴타입 : void
* 메소드명 : printItemSimple
* */
public void printItemSimple(){
System.out.println("내역번호| 타입 | 날짜 | 금액 | 항목 ");
for(int i=0; i<count; i++) {
System.out.print((i+1) + " |");
System.out.print(arr[i].getType() + " |");
System.out.print(arr[i].getDate() + " |");
System.out.print(arr[i].getCost() + " |");
System.out.println(arr[i].getContents());
}
}
/* 기능 : 번지가 주어지면 주어진 번지의 내역을 확인하는 메소드
* 매개변수 : 번지 => int index
* 리턴타입 : void
* 메소드명 : printItem
* */
public void printItem(int index) {
if(index < count && index >=0) {
System.out.println("타입 : " + arr[index].getType());
System.out.println("날짜 : " + arr[index].getDate());
System.out.println("자산 : " + arr[index].getPaymentType());
System.out.println("분류 : " + arr[index].getCategory());
System.out.println("금액 : " + arr[index].getCost());
System.out.println("내용 : " + arr[index].getContents());
}
}
public AccountBook2(int max) {
if(max <10) {
max = 10;
}
arr = new Item[max];
}
public AccountBook2() {
this(10);
}
}
AccountbookProgram2
package accountbook;
import java.util.Scanner;
public class AccountbookProgram2 {
AccountBook2 book;
Scanner scan = new Scanner(System.in);
//메뉴출력, 내역추가, 내역수정
/* 기능 : 메뉴를 출력해줌
* 매개변수 : 없음
* 리턴타입 : void
* 메소드명 : printMenu
* */
public void printMenu() {
System.out.println("------메뉴------");
System.out.println("1. 가계부 입력");
System.out.println("2. 가계부 수정 ");
System.out.println("3. 가계부 삭제 ");
System.out.println("4. 가계부 확인");
System.out.println("5. 가계부 종료");
System.out.println("---------------");
System.out.print("메뉴를 선택하세요: ");
}
public void printSubMenu() {
System.out.println("------확인------");
System.out.println("1. 전체 내역 상세");
System.out.println("2. 전체 내역 요약");
System.out.println("3. 선택 내역 상세");
System.out.println("4. 내역 합계");
System.out.println("---------------");
System.out.print("메뉴를 선택하세요: ");
}
/* 기능 : 내역을 입력받아 가계부에 저장하는 메소드 //acbook은 내역이 주어지면 내역 list에 저장, 이건 내역을 입력받아서 가계부에 저장
* 매개변수 : 없음 //scanner로 입력받을거라 매개변수 필요없대
* 리턴타입 : void
* 메소드명 : insert
* */
public void insert () {
System.out.println("가계부 내역을 입력하세요.");
Item item = creatItem();
book.insert(item);
}
/* 기능 : 수정할 내역의 번호와 내역정보를 입력받아 내역을 수정하는
* 매개변수 : 없음
* 리턴타입 :void
* 메소드명 : update
* */
public void update() {
System.out.println("수정할 내역의 번호를 입력하세요: ");
int index = scan.nextInt();
if(index>book.getCount()||index<1) { //book.getCount()는 저장된 갯수
System.out.println("수정할 값이 없습니다.");
return;
}else {
System.out.println("수정할 내역을 입력하세요.");
Item item = creatItem();
book.update(index-1, item); //num-1를 하는 이유는 입력을 1로 받아도 배열의 0번지부터 시작해야 하기때문에 -1로 해야함
System.out.println("수정이 완료되었습니다.");
}
}
/* 기능 : 내역 정보를 입력받아 내역을 생성하여 알려주는 메소드
* 매개변수 : 없음 => 입력받는 것이기때문에 필요가 없음
* 리턴타입 : 생성된 내역 => Item
* 메소드명 : creatItem
* */
private Item creatItem(){ //밖에서 쓸 일이 없기때문에 private로 할거임ㅎ
System.out.println("수입/지출 : ");
String type = scan.next();
System.out.println("날짜 : ");
String date = scan.next();
System.out.println("자산 : ");
String paymentType = scan.next();
System.out.println("분류 : ");
String category = scan.next();
System.out.println("금액 : ");
int cost = scan.nextInt();
System.out.println("내용 : ");
String contents = scan.next();
Item item = new Item(type, date, paymentType, category, cost, contents);
return item;
}
/* 기능 : 삭제할 번호를 입력받아 내역을 삭제하는 메소드
* 매개변수 : 없음
* 리턴타입 : void
* 메소드명 : delete
* */
public void delete() {
System.out.println("삭제할 내역의 번호를 입력하세요: ");
int index = scan.nextInt();
if(index <1 || index >book.getCount()) {
System.out.println("없는 내역입니다. 삭제할 수 없습니다.");
}
book.delete(index-1);
}
/* 기능 : 내역 전체를 상세 출력하는 기능
* 매개변수 : 없음
* 리턴타입 : void
* 메소드명 : print
* */
public void print() {
book.printItemListDetail();
}
/* 기능 : 내역 전체를 간략히 출력하는 메소드
* 매개변수 : 없음
* 리턴타입 : void
* 메소드명 : printSimple
* */
public void printSimple() {
book.printItemSimple();
}
/* 기능 : 확인할 내역 번호를 입력받아 내역을 상세히 출력하는 메소드
* 매개변수 : 없음
* 리턴타입 : void
* 메소드명 : printDetails
* */
public void printDetails() {
System.out.println("확인할 내역의 번호를 입력하세요: ");
int index = scan.nextInt();
if(index<1 || index > book.getCount()) {
System.out.println("없는 내역입니다. 확인할 수 없습니다.");
return;
}
book.printItem(index-1);
}
/* 기능 : 가계부 금액을 출력하는 메소드
* 매개변수 : 없음
* 리턴타입 : void
* 메소드명 : printTotal
* */
public void printTotal() {
System.out.println("내역 합계: " + book.getTotal() + "원");
}
public AccountbookProgram2() {
book = new AccountBook2();
}
public AccountbookProgram2(int max) {
book = new AccountBook2(max);
}
}
AaccountBookTest
import java.util.Scanner;
public class AaccountBookTest {
public static void main(String[] args) {
AccountbookProgram2 abp = new AccountbookProgram2();
int menu=0;
Scanner scan = new Scanner (System.in);
int subMenu=0;
do {
abp.printMenu();
menu=scan.nextInt();
switch(menu) {
case 1: abp.insert(); break;
case 2: abp.update(); break;
case 3: abp.delete(); break;
case 4:
abp.printSubMenu();
subMenu = scan.nextInt();
switch(subMenu) {
case 1: abp.print(); break;
case 2: abp.printSimple(); break;
case 3: abp.printDetails(); break;
case 4: abp.printTotal(); break;
default : System.out.println("잘못된 메뉴입니다.");
}
break;
case 5: System.out.println("프로그램 종료"); break;
default: System.out.println("잘못된 메뉴입니다."); break;
}
}while(menu!=5);
scan.close();
}
}