JAVA/JAVA2

[java2] #34 - Memo Project

yoonddo 2022. 11. 19. 21:12

MemoVO Class : 한 개의 게시물을 기억하는 클래스

  • 글 번호(자동 증가), 이름, 비밀번호, 메모, 작성일 멤버를 선언한다.
    * 글 번호를 자동 증가하기 위해 증가시켜서 넣어 줄 다른 멤버도 선언한다.
  • 멤버들을 초기화 할 생성자를 선언한다.
    -> 이름, 비밀번호, 메모를 입력받고 글 번호는 증가, 날짜는 입력 됐을 때의 시간을 넣어준다.
  • 멤버들의 getter & setter 를 선언한다. (단축키 사용)
  • 원하는 출력 형식으로 toString()을 재정의한다.
    * MemoList에서 전체 게시물을 출력할 때 MemoVO의 toString() 형식으로 출력된다.
package com.koreait.memoList;

import java.util.Date;

//	게시글 1건을 기억할 클래스
public class MemoVO {

	public static int count;	// MemoVO 클래스의 객체가 생성될 때 1씩 증가시킬 변수
	private int idx;			// 글번화 => count를 이용해서 자동으로 1증가
	private String name;		// 작성자 이름
	private String password;	// 비밀번호
	private String memo;		// 게시글
	private Date writeDate;		// 작성일 => 컴퓨터 시스템의 날짜와 시간을 자동으로 저장
	
	public MemoVO() { }
	public MemoVO(String name, String password, String memo) {
		idx = ++count;
		this.name = name;
		this.password = password;
		this.memo = memo;
		writeDate = new Date();
	}
	
	public int getIdx() {
		return idx;
	}
	public void setIdx(int idx) {
		this.idx = idx;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getMemo() {
		return memo;
	}
	public void setMemo(String memo) {
		this.memo = memo;
	}
	public Date getWriteDate() {
		return writeDate;
	}
	public void setWriteDate(Date writeDate) {
		this.writeDate = writeDate;
	}
	
	@Override
	public String toString() {
		return idx + ". " + name + "(" + password + ") 님이 " + writeDate + "에 남긴글\n" + memo;
	}
	
}

 

 

MemoList Class : 여러 개의 게시물을 기억하는 클래스

  • 여러 개의 MemoVO를 기억하는 클래스이므로 MemoVO를 자료형으로 하는 ArrayList 객체를 만든다.
  • ArrayList memoList를 불러오는 getMemoList() 메서드와 ArrayList memoList를 수정하는 setMemoList()
    메서드를 만든다.
  • 원하는 출력 형식으로 toString()을 재정의한다.
    -> 여기서의 toString()이 게시판 전체를 출력하는 형식이 된다.
package com.koreait.memoList;

import java.util.ArrayList;

//	게시글 여러건을 기억하는 클래스
public class MemoList {

	private ArrayList<MemoVO> memoList = new ArrayList<MemoVO>();

	public ArrayList<MemoVO> getMemoList() {
		return memoList;
	}
	public void setMemoList(ArrayList<MemoVO> memoList) {
		this.memoList = memoList;
	}
	
	@Override
	public String toString() {
//		마지막에 입력한 글(최신글) 부터 출력하기 위해서 ArrayList에 저장된 마지막 글 부터 출력한다.
		String str = "";
		if (memoList.size() == 0) {
			str += "저장된 메모가 없습니다.\n";
		} else {
//			for (int i = 0; i < memoList.size(); i++) {			// 처음부터
			for (int i = memoList.size() - 1; i >= 0; i--) {	// 마지막부터
				str += memoList.get(i) + "\n";
			}
		}
		return str;
	}
	
//	MemoProjectMain 클래스에서 호출되는 memoList라는 ArrayList에 저장할 데이터가 저장된 MemoVO 클래스의 객체를 넘겨받고
//	memoList라는 ArrayList에 저장하는 메소드
	public void addMemo(MemoVO vo) {
		memoList.add(vo);
	}
	
//	MemoProjectMain 클래스에서 호출되는 수정 또는 삭제할 글번호를 넘겨받고 memoList라는 ArrayList에 저장된 글 중에서 글번호에
//	해당된 글 1건을 얻어오 리턴시키는 메소드
	public MemoVO selectMemo(int idx) {
		try {
			return memoList.get(idx - 1);
		} catch (IndexOutOfBoundsException e) {
			return null;
		}
	}
	
//	MemoProjectMain 클래스에서 호출되는 수정할 글번호와 메모를 넘겨받고 memoList라는 ArrayList에 저장된 글 중에서 글번호에
//	해당되는 글 1건을 수정하는 메소드
	public void updateMemo(int idx, String memo) {
		memoList.get(idx - 1).setMemo(memo);
	}
	
//	MemoProjectMain 클래스에서 호출되는 삭제할 글번호를 넘겨받고 memoList라는 ArrayList에 저장된 글 중에서 글번호에	해당되는 
//	글 1건을 삭제하는 메소드
	public void deleteMemo(int idx) {
		memoList.remove(idx - 1);
		
//		글 삭제 후 글번호를 다시 붙여준다. => ArrayList를 사용하기 때문이 이런일이 발생된다.
		for (int i = 0; i < memoList.size(); i++) {
			memoList.get(i).setIdx(i + 1);
		}
		
//		글이 삭제된 후 새글이 입력될 때 idx가 기존 idx 값에 이어서 1씩 증가할 수 있도록 count의 값을 수정한다.
		MemoVO.count = memoList.size();
	}
	
}

 

 

MemoProjectMain Class : 게시판의 쓰기, 보기, 수정, 삭제, 저장, 읽기, 종료 메뉴를 선택하고 선택한 기능을 수행할 메서드를 호출한다. (2개 이상의 메서드에서 같이 사용해야 하는 변수 또는 객체는 멤버로 만든다.

  • 키보드로 게시판의 메뉴를 선택받는다.
    -> 이 때 주어진 메뉴를 제외한 번호가 입력되는 경우 다시 입력을 받도록 한다.
    -> 종료 메뉴가 선택되기 전까지 이전에 선택된 메뉴의 작업이 끝나면 메뉴 선택을 반복하도록 한다.
  • 선택된 기능을 수행하는 메서드를 호출한다.
package com.koreait.memoList;

import java.util.Scanner;

public class MemoProjectMain {

//	클래스 내부의 모든 메소드에서 사용할 객체나 변수는 멤버로 선언한다.
	 static MemoList memoList = new MemoList();
	
	public static void main(String[] args) {
		
//		MemoVO memo1 = new MemoVO("홍길동", "1111", "1등 입니다.");
//		System.out.println(memo1);
//		MemoVO memo2 = new MemoVO("임꺽정", "2222", "2등 입니다.");
//		System.out.println(memo2);
//		MemoVO memo3 = new MemoVO("장길산", "3333", "3등 입니다.");
//		System.out.println(memo3);
		
		Scanner scanner = new Scanner(System.in);
		int menu = 0;
		
		while (menu != 7) {
			
			while (true) {
				System.out.println("============================================================================");
				System.out.println(" 1.입력  2.목록보기  3.수정  4.삭제  5.파일로 저장  6.파일에서 읽기  7.종료 ");
				System.out.println("============================================================================");
				System.out.print("원하는 메뉴를 입력하세요: ");
				menu = scanner.nextInt();
				if (menu >= 1 && menu <= 7) {
					break;
				}
				System.out.println("메뉴는 1 ~ 7 사이로 입력해야 합니다.");
			}
			
//			여기까지 왔다면 menu에는 1 ~ 7 사이의 숫자가 입력되었다는 의미이다.
			switch (menu) {
				case 1:
					insert();
					break;
				case 2:
					System.out.println(memoList);
					break;
				case 3:
					update();
					break;
				case 4:
					delete();
					break;
				case 5:
					System.out.println("파일로 저장");
					break;
				case 6:
					System.out.println("파일에서 읽기");
					break;
			}
			
		}
		System.out.println("프로그램을 종료합니다.");
		
	}

//	키보드로 삭제할 글번호를 입력받아 삭제할 글 1건을 화면에 표시하고 비밀번호와 입력받아 memoList라는 ArrayList에 저장된 글 1건을
//	삭제한다.
	private static void delete() {
//		키보드로 삭제할 글번호를 입력받는다.
		Scanner scanner = new Scanner(System.in);
		System.out.print("삭제할 글번호를 입력하세요: ");
		int idx = scanner.nextInt();
		
//		MemoList 클래스의 memoList라는 ArrayList에 저장된 삭제할 글 1건을 얻어오는 메소드를 실행해서 얻어온 결과를 MemoVO 클래스
//		객체에 저장한다.
		MemoVO original = memoList.selectMemo(idx);
		
//		삭제할 글이 존재하면 글을 삭제하고 존재하지 않으면 존재하지 않는다고 메시지를 출력한다.
		if (original == null) {
			System.out.println(idx + "번 글이 존재하지 않습니다.");
		} else {
			System.out.println(original);
			
//			삭제할 글의 비밀번호를 입력받는다.
			System.out.print("삭제할 글의 비밀번호를 입력하세요: ");
			scanner.nextLine();		// 키보드 버퍼를 비운다.
			String password = scanner.nextLine().trim();

//			글을 삭제하기 위해 입력한 비밀번호(password)와 삭제할 글의 비밀번호(original.getPassword())가 일치하면 글을 삭제하고
//			일치하지 않으면 비밀번호가 일치하지 않는다는 메시지를 출력한다.
			if (password.equals(original.getPassword())) {
//				비밀번호가 일치하므로 MemoList 클래스의 memoList라는 ArrayList에 저장된 글 1건을 삭제하는 메소드를 실행한다.
				memoList.deleteMemo(idx);
				System.out.println("삭제완료!!!");
			} else {
//				비밀번호가 일치하지 않기 때문에 비밀번호가 일치하지 않는다는 메시지를 출력한다.
				System.out.println("비밀번호가 일치하지 않습니다.");
			}
		}
	}

//	키보드로 수정할 글번호를 입력받아 수정할 글 1건을 화면에 표시하고 비밀번호와 수정할 내용을 입력받아 memoList라는 ArrayList에 
//	저장된 글 1건을 수정한다.
	private static void update() {
//		키보드로 수정할 글번호를 입력받는다.
		Scanner scanner = new Scanner(System.in);
		System.out.print("수정할 글번호를 입력하세요: ");
		int idx = scanner.nextInt();
		
//		MemoList 클래스의 memoList라는 ArrayList에 저장된 수정할 글 1건을 얻어오는 메소드를 실행해서 얻어온 결과를 MemoVO 클래스
//		객체에 저장한다.
		MemoVO original = memoList.selectMemo(idx);
		
//		수정할 글이 존재하면 글을 수정하고 존재하지 않으면 존재하지 않는다고 메시지를 출력한다.
		if (original == null) {
			System.out.println(idx + "번 글이 존재하지 않습니다.");
		} else {
			System.out.println(original);
			
//			수정할 글의 비밀번호를 입력받는다.
			System.out.print("수정할 글의 비밀번호를 입력하세요: ");
			scanner.nextLine();		// 키보드 버퍼를 비운다.
			String password = scanner.nextLine().trim();
			
//			글을 수정하기 위해 입력한 비밀번호(password)와 수정할 글의 비밀번호(original.getPassword())가 일치하면 글을 수정하고
//			일치하지 않으면 비밀번호가 일치하지 않는다는 메시지를 출력한다.
			if (password.equals(original.getPassword())) {
//				비밀번호가 일치하므로 MemoList 클래스의 memoList라는 ArrayList에 저장된 글 1건을 수정하는 메소드를 실행한다.
//				비밀번소가 일치하므로 수정할 메모를 입력받는다.
				System.out.print("수정할 메모를 입력하세요: ");
				String memo = scanner.nextLine().trim();
				
//				메모를 수정하는 메소드를 실행한다.
				memoList.updateMemo(idx, memo);
				System.out.println("수정완료!!!");
			} else {
//				비밀번호가 일치하지 않기 때문에 비밀번호가 일치하지 않는다는 메시지를 출력한다.
				System.out.println("비밀번호가 일치하지 않습니다.");
			}
			
		}
	}

//	키보드로 이름, 비밀번호, 메모를 입력받아 MemoVO 클래스 객체에 저장한다.
	private static void insert() {
		
//		키보드로 이름, 비밀번호, 메모를 입력받는다.
		Scanner scanner = new Scanner(System.in);
		System.out.println("게시판에 저장할 글 입력");
		System.out.print("이름: ");
		String name = scanner.nextLine().trim();
		System.out.print("비밀번호: ");
		String password = scanner.nextLine().trim();
		System.out.print("메모: ");
		String memo = scanner.nextLine().trim();
		
//		MemoVO 클래스의 MemoVO(String name, String password, String memo) 생성자를 실행해사 MemoVO 클래스 객체를 생성한다.
		MemoVO vo = new MemoVO(name, password, memo);
//		System.out.println(vo);
		
//		MemoVO 클래스 객체를 인수로 넘겨받아 MemoList 클래스의 memoList라는 ArrayList에 저장하는 메소드를 호출한다.
		memoList.addMemo(vo);
		System.out.println("저장완료!!!");
//		System.out.println(memoList);
		
	}
	
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

참고 출처 : https://m.blog.naver.com/ffsj1/221527129816