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();
		
	}
}