본문 바로가기
개발/Java

Java 파일 입출력 + 컬렉션을 이용해서 메모장 만들기

by yhyuk 2021. 5. 1.
728x90
반응형

파일 입출력(백업 장치) + 컬렉션(주대상)

 

[기능]

- 메모 쓰기

- 메모 읽기

- 메모 삭제

 

[데이터]

- 메모: 고유번호, 작성자, 메모내용, 날짜, 중요도

- 파일: memo.dat

 

[프로그램 흐름]

- 프로그램 시작: 파일 모든 내용 읽기(파일 입출력) --> 메모리 저장(컬렉션)

- 프로그램 사용: 메모리 조작(컬렉션)

- 프로그램 종료: 메모리 저장(컬렉션) > 모든 파일 내용 쓰기(파일 입출력)

 

[추가한 클래스]

public class Memo {
	
	private String seq;     //고유번호
	private String name;	//이름
	private String regdate;	//날짜
	private String priority;//중요도(A, B, C)
	private String content;	//메모내용
	
	
	//각 변수명 Getter / Setter
	public String getSeq() {return seq;}
	public void setSeq(String seq) {this.seq = seq;}
	public String getName() {return name;}
	public void setName(String name) {this.name = name;}
	public String getRegdate() {return regdate;}
	public void setRegdate(String regdate) {this.regdate = regdate;}
	public String getPriority() {return priority;}
	public void setPriority(String priority) {this.priority = priority;}
	public String getContent() {return content;}
	public void setContent(String content) {this.content = content;}
    
	@Override
	public String toString() {
		return "Memo [seq=" + seq 
				+ ", name=" + name 
				+ ", regdate=" + regdate 
				+ ", priority=" + priority 
				+ ", content="+ content + "]";
	}

}

 

- ArrayList 배열에 들어갈 값을 각 변수명과 getter/setter를 만들어줬습니다. 

 

 

[메소드 - menu, pause, add, getseq]

//콘솔 첫화면 출력
private static String memu() {

    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("선택: ");
		
    String sel = scan.nextLine();
    return sel;
}

//콘솔 항목마다 엔터
private static void pause() {
    System.out.println("엔터를 누르시면 다음으로 진행합니다.");
    scan.nextLine();
}

//메모 쓰기
private static void add() {
    System.out.println("[메모 쓰기]");
    
    System.out.print("이름: ");
    String name = scan.nextLine();
    
    System.out.print("중요도(A, B, C): ");
    String priority = scan.nextLine();
    
    System.out.print("내용(exit:입력종료): ");
    String content = "";
    
    while (true) {
        String temp = sacn.nextLine();
        if(temp.equals("exit") {
            break;
        }
        content += temp + "\r\n";
    }
    
    Memo memo = new Memo();
    Calendar now = Calendar.getInstance();
    
    memo.setSeq(getseq());
    memo.setName(name);
    memo.setPriority(priority);
    memo.setContent(content);
    memo.setRegdate(String.format("tF %tT", now, now));
    
    list.add(memo);
    
    pause();
}

//고유번호 구하기(중복X)
private static String getseq() {
    int max = 0;
    for(Memo temp : list) {
        if(Integer.parseInt(temp.getSeq()) > max) {
            max = Integer.parseInt(temp.getSeq());
        }
    }
    
    return (max+1) + "";
}

menu: 먼저 콘솔 첫 화면에 출력할 화면이며, 각 항목중에 선택값을 입력받습니다.

 

pause: 각 기능에서 공통으로 들어갈 화면전환을 엔터로 할 수 있게 만들었습니다. 각 기능(메소드)마다 들어갈 예정이라 먼저 만들었습니다.

 

add: 메모장의 쓰기 기능을 구현했으며 메모에 들어갈 값을 각각 따로 입력받아서 저장하고 메모내용에 해당하는 부분은 입력시 사용자가 엔터를 쓴다는 것을 감안하여 \r\n(엔터처리) 해줬으며, 만약 메모를 다 작성하고 'exit'를 입력하면 이전화면으로 나올 수 있게 구현했습니다. 그렇게 각각 입력받은 값을 Memo 클래스에서 구현한 각 변수와,  set에 대입합니다. 마지막으로 ArrayList 배열에 추가합니다.

 

getseq: 메모장 기능에 해당되는 고유번호입니다. 만약 현재 memo.dat에 메모된 값이 총 3개라면 최대값에서 +1을 해주어 그다음 메모장 고유번호를 주어서 중복이 불가하게 설정했습니다. 

 

 

[메소드 - getMemo, part, list, delete]

//입력받은 자세히 확인할 메모 확인
private static Memo getMemo(String seq) {
    for (Memo memo : list) {
        if (memo.getSeq().eqauls(seq)) {
            return memo;
        }
    }
    
    return null;
}

//일부 내용만 보여주기
private static void part() {
    for (Memo memo : list) {
        String content = memo.getContent().replace("\r\n", " ");
        if (content.length() > 10) {
            content = content.substring(0, 10) + "...";
        }
        
        System.out.printf("%s\t%s\t%s\t\n"
                           , memo.getSeq()
                           , memo.getName()
                           , content);
    }    
}

//메모 확인하기
private static void list() {
    System.out.println("[메모읽기]");
    System.out.println("[번호]\t[이름]\t[내용(일부분)]");
    part();
    
    System.out.println("0: 목록끝내기");
    System.out.print("메모장 상세보기 선택(번호): ");
    
    String seq = scan.nextLine();
    if (seq != "") {
        if (!seq.equals("0")) {
            Memo memo = getMemo(seq);
            System.out.println("[메모 상세보기]");
            System.out.println("번호: "   + memo.getSeq());
            System.out.println("이름: "   + memo.getName());
            System.out.println("날짜: "   + memo.getRegdate());
            System.out.println("중요도: " + memo.getPriority());
            System.out.println("내용: "   + memo.getContent());
        }
    }
    
    pause();
}

//메모 삭제
private static void delete() {
    System.out.println("[메모 삭제]");
    System.out.println("[번호]\t[이름]\t[내용(일부분)]");
    
    part();
    System.out.print("삭제할 번호: ");
    String seq = scan.nextLine();
    
    for (int i=0; i<list.size(); i++) {
        if (list.get(i).getSeq().equals(seq)) {
            list.remove(i)
        }
    }
    
    pause();
}

getMemo: 확인할 메모의 고유번호를 입력받으면 그 고유번호를 확인하고 세부내용을 보여줍니다.

 

part: 메모 읽기/삭제에 작업을 하기전, 해당 메모의 일부분 내용만 출력 해주는 메소드입니다. 여기서 쓰인 list는 ArrayList배열의 변수명입니다. 또한 미리 입력받은 content (메모내용)를 불러와서 엔터 부분을 공백처리 해주며, 내용의 길이만큼 '...'이 나오게 했습니다. 

 

list: 메모장에 저장된 내용들을 읽을 수 있으며, 저장된 내용들의 일부분만 먼저 확인하고 세부내용은 고유번호를 선택하면 Memo 클래스에서 객체를 생성해 get을 불러와서 대입된 값을 출력하게 해줍니다. 입력해야할 고유번호가 아닌 엔터키나 0을 입력하면 출력되지 않고 다음단계로 넘어가게됩니다.

 

delete: 삭제하기전 메모장의 내용을 일부분만 확인 할 수 있게 먼저 출력해주며,  그 다음 삭제할 고유번호를 입력받은 뒤, ArrayList배열의 사이즈만큼 루프를 돌며 배열에 저장된 값중 고유번호와 일치하는 방이 삭제됩니다.

 

 

[메소드 - load, save]

//처음 시작전 DATA값 불러오기(읽기)
private static void load() {
    try {
        BufferedReader reader = new BufferedReader(new FileReader(DATA));
        
        String line;
        
        while ((line = reader.readLine()) != null) {
            Memo memo = new Memo();
            String[] temp = line.split(",");
            
            memo.setSeq(temp[0]);
            memo.setName(temp[1]);
            memo.setRegdate(temp[2]);
            memo.setPriority(temp[3]);
            
            String tempContent = "";
            while (!(line = reader.readLine()).eqauls("==========")); {
                tempContent = line + "\r\n";
            }
            memo.setContent(tempContent);
            
            list.add(memo);
        }
        reader.close();
    } catch (Exception e) {}
}

//ArrayList배열에 저장된 값 memo.dat 파일에 저장하기(쓰기)
private static void save() {
    try {
        BufferedWriter writer = new BufferedWriter(new FileWriter(DATA));
        
        for (Memo memo : list) {
            writer.write(String.format("%s,%s,%s,%s\n%s==========\n"
                                      , memo.getSeq();
                                      , memo.getName();
                                      , memo.getRegdate();
                                      , memo.getContent()));
        }
        writer.close();
    } catch (Exception e) {}
}

load: 사용자에게 콘솔 출력전 맨 처음 선언되며, 지정해준 DATA 경로값을 읽어오며 memo.dat의 형식인 CSV로 기록한 값을 콤마로 구분하였기 때문에 split(",")으로 각 콤마마다 값을 Memo 클래스에서 불러온 고유번호, 이름, 날짜, 중요도를 임의로 지정해준 배열에 저장시킨다. 또한 메모 내용은 memo가 끝나는 지점인 "============"이 아닐때 까지 변수에 메모내용을 엔터(\r\n)를 구분해서 저장시킨다. 마지막으로 그렇게 대입한 값을 ArrayList 배열에 추가한다. 

 

save: 마지막 단계에 속하며, 쓰기작업을 하는 BufferedWriter와 FileWriter 호출하여 Memo 클래스에 있는 값을 ArrayList 배열로 루프에 넣어주어 메소드 write를 통해 전부 쓰기 작업을 한다. (저장시킨다)  

 

 

[Main 클래스]

import java.io.*;
import java.util.*;

public class FileMemo {
	
    private final static String DATA;
    private static Scanner scan;
    private static ArrayList<Memo> list;
	
    static {
        scan = new Scanner(System.in);
        DATA = "dat\\memo.dat";
        list = new ArrayList<Memo>();
    }
    
    public static void main(String[] args) {
    
        load();
        System.out.println("\t[메모장]");=
        boolean loop = true;
        
        while (loop) {
			
            String sel = menu();
			
            if (sel.equals("1")) {
                add();
            } else if (sel.equals("2")) {
                list();
			} else if (sel.equals("3")) {
                delete();
            } else {
                loop = false;
            }
        }
        
        System.out.println("메모장을 종료합니다.");
		
        save();
    }
}
	

 

728x90
반응형

댓글