본문 바로가기
BACK-END/JAVA

[JAVA]가계부 CRUD 프로그램 만들기

by 썬키 2022. 12. 30.

1. 개요

저번에 주소록 CRUD 프로그램에 이어서 이번엔 강사님께서 가계부 CRUD 프로그램을 만드는 과제를 내주셨다. 로직면에서 저번이랑 크게 다른 점은 없지만 이번에는 List 인터페이스를 구현한 ArrayList 클래스에 객체를 생성하고 다루는 방법으로 로직을 짜보았다.

 

 

2. 흐름도

(1) DTO : 가계부(이하, AccountBook)에 필요한 필드와 메서드를 정의하고 생성자를 만들고

필드에 직접 접근하지 않기 위해 Getter/Setter 메서드와 toString메소드를 재정의하였다.

 

(2) DAO : 가계부 객체를 생성하고 ArrayList에 담아서 CRUD 할 수 있는 핵심로직이 담긴 클래스이다. 

 

(3) MAIN : 사용자가 실행하고 싶은 기능을 선택하면, DAO에 있는 메소드를 호출할 수 있도록 작성한 클래스이다.

 

3. 소스

 

- DTO

public class AccountDTO {

	// Fields
	private String date;		// 날짜			ex) 22/12/24		22/12/27
	private String use;			// 용도			ex) 영화관람		월급
	private String classify;	// 수입ㆍ지출	ex) 지출				수입
	private int money;			// 금액			ex) 25000			3000000
	private String memo;		// 내용			ex) 아바타2			12월급여
	
	// 기본 생성자
	public AccountDTO() {
	}
	
	// 매개변수가 있는 생성자
	public AccountDTO(String date, String use, String classify, int money, String memo) {
		super();
		this.date = date;
		this.use = use;
		this.classify = classify;
		this.money = money;
		this.memo = memo;
	}

	// Getter & Setter
	public String getDate() {
		return date;
	}

	public void setDate(String date) {
		this.date = date;
	}

	public String getUse() {
		return use;
	}

	public void setUse(String use) {
		this.use = use;
	}

	public String getClassify() {
		return classify;
	}

	public void setClassify(String classify) {
		this.classify = classify;
	}

	public int getMoney() {
		return money;
	}

	public void setMoney(int money) {
		this.money = money;
	}

	public String getMemo() {
		return memo;
	}

	public void setMemo(String memo) {
		this.memo = memo;
	}

	@Override
	public String toString() {
		return "[날짜: " + date + ", 용도: " + use + ", 수입/지출: " + classify + ", 금액: " + money + ", 메모: "
				+ memo + "]";
	}
	
}

 

- DAO

public class AccountDAO {

	Scanner scanner = new Scanner(System.in);
	
	// list 생성
	private List<AccountDTO> list = new ArrayList<AccountDTO>();

	// 기본 생성자
	public AccountDAO() {
		// 샘플데이터
		list.add(new AccountDTO("22/12/24", "영화관람", "지출", 25000, "아바타2"));
		list.add(new AccountDTO("22/12/27", "월급", "수입", 3000000, "12월급여"));
		list.add(new AccountDTO("22/12/25", "용돈", "수입", 50000, "12월용돈2"));
		list.add(new AccountDTO("22/12/30", "용돈", "수입", 100000, "12월용돈1"));
	}
	
	
	/*
	 *	@SELECT
	 */
	// 검색 기준 : 용도
	public void usage() {
		System.out.print("용도를 입력해주세요 > ");
		String usage = scanner.next();

		int index = searchMethod(usage);
		
		if(index == -1) 
			System.out.println("해당하는 데이터를 찾을 수 없습니다.");
		select();
	} // end of usage


	public int searchMethod(String usage) {
		int index = -1;
		for (int i = 0; i < list.size(); i++) {
			if(usage.equals(list.get(i).getUse())) {
				index = i;
				System.out.println(list.get(index));
				break;
			} // end of if
		} // end of for
		return index;
	}
	
	// 검색 기준 선택
	public void select() {
		System.out.println("\n1. 년월별 결산\n2. 수입/지출별\n3. 용도별\n4. 종료");
		System.out.print("\n검색 기준을 선택해주세요 > ");
		int menu = scanner.nextInt();
		
		switch(menu) {
			case 1: selectDate();
				break;
			case 2:
				break;
			case 3: usage();
				break;
			case 4: return;
		} // end of switch
			
	} // end of select()

	/*
	 *	@INSERT 
	 */
	public void insert() {
		System.out.println("가계부 기입을 시작합니다.\n.\n.\n");
		
		System.out.print("날짜를 입력해주세요 > ");
		String date = scanner.next();
		
		System.out.print("용도를 입력해주세요 > ");
		String use = scanner.next();
		
		System.out.print("수입ㆍ지출을 구분해주세요 > ");
		String classify = scanner.next();
		
		System.out.print("금액을 입력해주세요 > ");
		int money = scanner.nextInt();
		
		System.out.print("내용을 입력해주세요 > ");
		String memo = scanner.next();
		
		System.out.println("\n기입이 완료되었습니다!");
		
		AccountDTO dto = new AccountDTO(date, use, classify, money, memo);
		list.add(dto);
	}
	
	/*
	 * @UPDATE
	 */
	public void update() {
		System.out.print("수정할 데이터의 용도를 입력해주세요 > ");
		String usage = scanner.next();
		
		int index = searchMethod(usage);
		System.out.println("\n변경할 항목을 골라주세요.\n\n1. 날짜\n2. 용도\n3. 수입/지출\n4. 금액\n5. 메모");
		int num = scanner.nextInt();
		
		switch(num) {
			case 1: 
				System.out.print("날짜를 수정해주세요 > ");
				String date = scanner.next();
				list.get(index).setDate(date);
				System.out.println(".\n.\n.\n날짜가 성공적으로 변경되었습니다.");
				break;
			case 2:
				System.out.print("용도를 수정해주세요 > ");
				String use = scanner.next();
				list.get(index).setUse(use);
				System.out.println(".\n.\n.\n용도가 성공적으로 변경되었습니다.");
				break;
			case 3:
				System.out.print("수입/지출을 수정해주세요 > ");
				String classify = scanner.next();
				list.get(index).setClassify(classify);
				System.out.println(".\n.\n.\n수입/지출이 성공적으로 변경되었습니다.");
				break;
			case 4:
				System.out.print("금액을 수정해주세요 > ");
				int money = scanner.nextInt();
				list.get(index).setMoney(money);
				System.out.println(".\n.\n.\n금액이 성공적으로 변경되었습니다.");
				break;
			case 5:
				System.out.print("내용을 수정해주세요 > ");
				String memo = scanner.next();
				list.get(index).setMemo(memo);
				System.out.println(".\n.\n.\n내용이 성공적으로 변경되었습니다.");
				break;
			default:
				System.out.println("잘못 입력하셨습니다.");
				break;
		}
	}
	
	/*
	 *	@DELETE 
	 */
	public void delete() {
		System.out.print("삭제할 데이터의 용도를 입력해주세요 > ");
		String usage = scanner.next();
		
		int index = searchMethod(usage);
		System.out.print("위의 데이터를 삭제하시겠습니까?(Y/N) ");
		String answer = scanner.next();
		if(answer.equalsIgnoreCase("Y")) {
			list.remove(index);
			System.out.println(".\n.\n.\n데이터가 성공적으로 삭제되었습니다.");
		} else if(answer.equalsIgnoreCase("N")) {
			delete();
		} else System.out.println("잘못 입력하셨습니다.");
		
		if(index == -1) {
			System.out.println("해당하는 데이터를 찾을 수 없습니다.");
		}
		
	} // end of delete()
	
} // end of class

Main클래스에서 AccountDAO를 생성하면 기본적으로 샘플데이터 몇 개가 만들어지도록 설정하였다.

가계부 기입(INSERT)을 제외한 기능들은 데이터 검색 작업이 필수이므로 코드의 중복성을 줄이기 위하여

데이터 검색하는 부분은 메서드(searchMethod)로 따로 만들었다.

 

 

- MAIN

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method 
		AccountDAO dao = new AccountDAO();
		
		Scanner scanner = new Scanner(System.in);
		
		
		
		loop : while(true) {
			System.out.println("\n====가계부 프로그램====");
			// menu
			System.out.println("1. 검색\n2. 기입\n3. 수정\n4. 삭제\n5. 종료");
			System.out.print("\n메뉴를 선택해주세요 > ");
			
			int menu = scanner.nextInt();
			
			switch(menu) {
				case 1 : dao.select();
				break;
				case 2 : dao.insert();
				break;
				case 3 : dao.update();
				break;
				case 4 : dao.delete();
				break;
				case 5 : break loop;
			} // end of switch
			
		} // end of while 
		
	} // end of main
} // end of class

 

4. 테스트

 

5. 개선할 점

검색 기준을 용도뿐만 아니라, 년월별로도 검색 가능하게 만들었으면 더 좋았을 거 같다.

용도값이 같은 데이터가 여러개 있을시에, 원하는 데이터 하나를 삭제할 수 있었으면 더 좋았을 거 같다.

두 가지는 어떻게 구현하면 좋을지 계속 생각해보자..!

 

 

댓글