프로젝트

프로젝트1 ( java만 사용한 프로젝트)(만드는과정)

동곤일상 2025. 2. 26. 22:07
반응형

자바팀과제.pdf
0.35MB

 

 

 

 

 

 

내용은 다음과같다.

일단 전체적인 틀을 한번 잡아봤습니다

 

Event클래스 ( 날짜를 추가해야함 , 일정에관련된 클래스)

class Event {
    String title;
    String startTime;
    String details;
    Event(String title, String startTime, String details) {
        this.title = title;
        this.startTime = startTime;
         //이부분에 이벤트의 종료시간이 없고
        this.details = details;
        //이벤트의 날짜도 안넣어서 추가를 해야할것같다.!!!
    }
}
package event;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class EventEx1  {
	private static String name;
	private static Map<String, Event> events = new HashMap<>();
    //Event객체를 Map에 넣었지만 이벤트가 늘어난다면 추가를 할수가없을것이다
    //List<Event>로 바꿔보자 
	public static void main(String[] args) throws IOException{
		Scanner scan = new Scanner(System.in);
		System.out.print("사용자 아이디를 입력하세요 : ");
		name = scan.nextLine();
		loadEvents();
		while(true) {
			System.out.print
			("메뉴번호를 입력하세요(1.종료, 2. 달력조회, 3.이벤트추가, 4.이벤트 조회, 5이벤트 변경, 6.이벤트 삭제)");
			int choice = scan.nextInt();
			scan.nextLine();
			switch(choice) {
			case 1 : saveEvents();System.out.println("프로그램을 종료합니다.");return;
			case 2 : printEvent();break;
			case 3 : addEvent();break;
			case 4 : viewEvent();break;
			case 5 : changeEvent();break;
			case 6 : deleteEvent();break;
			default:
                System.out.println("잘못된 입력입니다. 다시 선택하세요.");
			}
		}
	}


}

종료메서드(파일 저장 후 종료)

	private static void saveEvents() throws IOException {
		PrintWriter writer = new PrintWriter(new FileWriter(name + "_events.txt"));
        //이부분도 printWriter가아닌 ObjectOutputStream을 이용해보자
		for (Map.Entry<String, Event> entry : events.entrySet()) {
			String date = entry.getKey();
			Event event = entry.getValue();
			writer.println(date + "#" + event.title + "#" + event.startTime + "#" + event.details);
		}
	}

 

변경메서드( 이벤트를 수정할 때 사용 )

날짜를 입력받고 해당날짜와 일치한다면

변경을 시도하게 하는 메서드

	private static void changeEvent() {
		Scanner scan = new Scanner(System.in);
		System.out.print("수정할 이벤트의 날짜를 입력하세요 (yyyy-MM-dd): ");
        String date = scan.nextLine();
        Event event = events.get(date);
        if (event != null) {
            System.out.print("새로운 제목을 입력하세요: ");
            event.title = scan.nextLine();
            System.out.print("새로운 시작 시간을 입력하세요: ");
            event.startTime = scan.nextLine();
            System.out.print("새로운 상세 정보를 입력하세요: ");
            event.details = scan.nextLine();
            System.out.println("이벤트가 변경되었습니다.");
        } else {
            System.out.println("해당 날짜에 이벤트가 없습니다.");
        }
		
	}

이벤트추가 메서드 ( 날짜 , 제목 , 시간 등을 입력받아 List에 추가할것임)

	private static void addEvent() {
		Scanner scan = new Scanner(System.in);
		System.out.print("이벤트 제목을 입력하세요: ");
	    String title = scan.nextLine();
	    System.out.print("이벤트 시작 시간을 입력하세요: ");
	    String startTime = scan.nextLine();
	    System.out.print("이벤트 상세 정보를 입력하세요: ");
	    String details = scan.nextLine();
        System.out.print("이벤트 날짜를 입력하세요 (yyyy-MM-dd): ");
        String date = scan.nextLine();
        Event event = new Event(title, startTime, details);
        events.put(date, event);
        System.out.println("이벤트가 추가되었습니다.");	   
		
	}

삭제메서드 ( 날짜를 입력받고 같은날짜에 이벤트가 여러개있다면

인덱스를 통해 원하는 일정을 삭제하게 할 예정)

	private static void deleteEvent() {
		Scanner scan = new Scanner(System.in);
        System.out.print("삭제할 이벤트의 날짜를 입력하세요 (yyyy-MM-dd): ");
        String date = scan.nextLine();
        Event event = events.remove(date);
        if (event != null) {
            System.out.println("이벤트가 삭제되었습니다.");
        } else {
            System.out.println("해당 날짜에 이벤트가 없습니다.");
        }
    }

 

이벤트조회메서드( 날짜를 입력받아 해당날짜의 이벤트를 모두출력)

	private static void viewEvent() {
		Scanner scan = new Scanner(System.in);
		System.out.print("조회할 날짜를 입력하세요 (yyyy-MM-dd): ");
        String date = scan.nextLine();
        Event event = events.get(date);
        if (event != null) {
            System.out.println("이벤트 제목: " + event.title);
            System.out.println("시작 시간: " + event.startTime);
            System.out.println("상세 내용: " + event.details);
        } else {
            System.out.println("해당 날짜에 이벤트가 없습니다.");
        }		
	}

 

달력 출력메서드 ( 년도와월을 입력받고 해당 년월의 이벤트가보이는 달력을 출력할것임)

	private static void printEvent() {
		Scanner scan = new Scanner(System.in);
		System.out.print("조회할 년도를 입력하세요 : ");
		int year = scan.nextInt();
        System.out.print("조회할 월을 입력하세요: ");
        int month = scan.nextInt();
        scan.nextLine();
        Calendar ca1 = Calendar.getInstance();
        ca1.set(year, month-1,1);
        int firstweek =ca1.get(Calendar.DAY_OF_WEEK);
        int lastday = ca1.getActualMaximum(Calendar.DATE);
		System.out.println("\t"+year + "년 " + month + "월");
		System.out.printf("%3c %3c %3c%3c %3c%3c %3c",'일','월','화','수','목','금','토');
		System.out.println();
		for(int i=1,day=1;day<=lastday;i++) {
	
			if(i < firstweek) System.out.printf("%4s"," ");
			else System.out.printf("%4d",day++);
			if(i%7==0)System.out.println();
			}
	}

 

유저이름이 입력되면 시작되는 메서드 ( 파일로드 메서드)

파일이존재한다면 불러오고

아니라면 새로운 맵객체를 만들어 반환해주는 방식으로 변경예정

	 private static void loadEvents()throws IOException {
		 File file = new File(name + "_events.txt");
		 if (file.exists()) {
			 BufferedReader reader = new BufferedReader(new FileReader(file));\
             //이부분도 그냥 파일을 불러오려했으나 ObjectInputStream이 아니라면
             //객체를 통쨰로 가져올 방법이없다 바꾸자!!!!
             //그리고 가져온객체를 쓰려면 반환을해줘야할것같다.
	         String line;
	         while ((line = reader.readLine()) != null) {
	        	 String[] parts = line.split("#");
	             if (parts.length == 4) {
	            	 events.put(parts[0], new Event(parts[1], parts[2], parts[3]));
	            	 }
	             }
	         }
	 }

1,2,3,4,5,6의 기능을대충 잡아봤다

지금은 실행도 잘 되지않고 느낌만잡았음!!

 

바꿀점을 간략하게 얘기해본다면

 

일단 아이디별로 다른일정관리를위해 아이디를 key로사용한 map을 써볼것이다

그리고

아이디 별로

각각 다른 "Id.ser"에다가

ObjectOutputStream을 이용해

객체를 통째로 저장할것이고

 

불러올때는

파일이름이존재한다면 ObjectInputStream()을 

이용해서 그냥 Id를 key로 갖고 List<Event>를 value로 갖는

Map객체를 그대로 가져온 후

반환을해줘서 그 객체로 조회를하든 추가를 하든 해야할것같다

 

파일이 존재하지않는다면 

List는 null값이며 객체가존재하지않는다

new ArrayList로 객체를 만들어 준후 반환해줄것이다.

 

또한 java8 이전의 Date클래스가아닌

LocalDate를 사용해 요일출력이나 날짜설정등

더 간단하고 가독성 좋게 만들예정

 

 

최종수정한 클래스 ( 기능별로 나누지는않아서 가독성이 매우떨어짐)

Project_LocalDate.java
0.01MB

 

 

package project;



import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.Serializable;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.time.temporal.TemporalAdjusters;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.InputMismatchException;

import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;

class Event implements Serializable,Comparable<Event>{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	String title;
	LocalDateTime startTime;
	LocalDateTime lastTime;
	String details;
	LocalDate date;
	

	 
	Event(LocalDate date,String title, LocalDateTime startTime,LocalDateTime lastTime, String details) {
		this.title = title;
		this.startTime = startTime;
		this.details = details;
		this.lastTime = lastTime;
		this.date = date;
	}

	@Override
	public int compareTo(Event o) {
		return this.startTime.compareTo(o.startTime); 
		//시작시간순으로 정렬을 위해 Comaprable 구현후 메서드 오버라이딩
	}
	private String formatTime(LocalDateTime t) {
		return t.format(Project_LocalDate.formatter2);
		//LocalDateTime은 날짜T시간 형식으로 출력이되므로
		//format 해 보기좋게바꾸자!!
	}

	@Override
	public String toString() {
		return "[제목] : "+title+"\n [시간] :" +formatTime(startTime)+"~"+formatTime(lastTime)+
				"\n[세부사항] :"+details;
	}
}

//--------------------------------------------------------------------------------------------------------------------

public class Project_LocalDate {
	private static String name;
	static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
	static DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
	//시간을 입력받을때 초는 생략하기위한포맷형식( String->LocalDateTime)
	
	
	public static void main(String[] args) throws IOException, ClassNotFoundException, ParseException{

		Scanner scan = new Scanner(System.in);
		System.out.print("사용자 아이디를 입력하세요 : ");
		name = scan.nextLine();
		Map<String, List<Event>> events = loadEvents();
		//		List<Event> evList = new ArrayList<Event>();
		while(true) {
			System.out.print
			("메뉴번호를 입력하세요(1.종료, 2. 달력조회, 3.이벤트추가, 4.이벤트 조회, 5이벤트 변경, 6.이벤트 삭제)");
			int choice = scan.nextInt();
			scan.nextLine();
			switch(choice) {
			case 1 : saveEvents(events);System.out.println("프로그램을 종료합니다.");return;
			case 2 : printEvent(events);break;
			case 3 : addEvent(events);break;
			case 4 : viewEvent(events);break;
			case 5 : changeEvent(events);break;
			case 6 : deleteEvent(events);break;
			default:
				System.out.println("잘못된 입력입니다. 다시 선택하세요.");
			}
		}
	}
	private static void saveEvents(Map<String, List<Event>> events) throws IOException {
		ObjectOutputStream writer = new ObjectOutputStream(new FileOutputStream(name+".ser"));
		writer.writeObject(events);
		writer.flush();
		writer.close();

	}

	//--------------------------------------------------------------------------------------------------------------------

	private static void changeEvent(Map<String, List<Event>> events) throws ParseException {//parse오류가나면 예외를던진다 잡아도됨
		Scanner scan = new Scanner(System.in);
		System.out.print("수정할 이벤트의 날짜를 입력하세요 (yyyy-MM-dd): ");
		String date = scan.nextLine();
		int count=0;
		LocalDate date2 = LocalDate.parse(date,formatter);//String->date (yyyy-MM-dd)형태로반환하자
		List<Event> list = events.get(name);
		List<Event> newList = new ArrayList<Event>();
		if(list==null) {
			System.out.println(name+"님의 이벤트가 아무것도없어요");
			return;
		}
		for (Event e : list) {
			if(e.date.equals(date2)) {
				count++;
				newList.add(e);//새로운리스트에 추가	
//				int indexOf = list.indexOf(e);
//				System.out.println((indexOf+1)+"번"+e);
				//같은날짜에 이벤트가 2개인 경우라면인덱스를 반환해서
				//사용자가 지정한 인덱스를 삭제하기위함!
			}
		}
		
		if(count==0) {System.out.println("변경할 이벤트가 없어요");return;}

		try {
			for (int i = 1; i <= count; i++) {
				System.out.println(i+"번 : "+newList.get(i-1));
			}
			
			System.out.println("변경할 제목의 번호를 입력하세요 : (안하려면 문자를 입력하세요)");
			int index = scan.nextInt();
			
			scan.nextLine();

			System.out.print(" 제목을 입력하세요: ");
			String title = scan.nextLine();
			System.out.print(" 시작 시간을 입력하세요:(HH:mm) ");
			String startTime = scan.nextLine();
			LocalDateTime start = LocalDateTime.parse(date2+" "+startTime,formatter2);
			System.out.print(" 종료시간을 입력하세요:(HH:mm) ");
			String lastTime = scan.nextLine();
			LocalDateTime last = LocalDateTime.parse(date2+" "+lastTime,formatter2);
			System.out.print(" 상세 정보를 입력하세요: ");
			String details = scan.nextLine();
			System.out.println("이벤트를 변경 하실건가요??(y)");
			String y = scan.nextLine();
			if(y.equalsIgnoreCase("y")) {
				System.out.print(newList.get(index-1).title+"-->"+title+"\n");
				list.remove(newList.get(index-1)); 
				System.out.println("변경완료");
				list.add(new Event(date2, title, start, last, details));
				events.clear();//한번 싹 지우고
				events.put(name, list);//바꾼리스트를 넣는판단이 맞는거같다!!!
				}
			else {
				System.out.println("변경취소"); //아니라면 아무 변화도 주지않는다 
				return;
				}
			
			//그렇지않다면 events맵에 변화가 전혀없을거다 list는 반환한 객체기때문에 events의 변경과 무관함
		}
		catch(InputMismatchException e) {
			scan.next();
			System.out.println("메뉴선택으로 돌아감");
			return;
		}
	}

	//--------------------------------------------------------------------------------------------------------------------

	private static void deleteEvent(Map<String, List<Event>> events) throws ParseException {
				Scanner scan = new Scanner(System.in);
		System.out.print("삭제할 이벤트의 날짜를 입력하세요 (yyyy-MM-dd): ");
		String date = scan.nextLine();
		LocalDate date2 = LocalDate.parse(date,Project_LocalDate.formatter);//String->date (yyyy-MM-dd)형태로반환하자
		int count=0;
		List<Event> list = events.get(Project_LocalDate.name);
		List<Event> delList = new ArrayList<Event>();
		if(list==null) {
			System.out.println("이벤트가 아무것도없어요");return;
			}
		Collections.sort(list);
		for (Event e : list) {
			if(e.date.equals(date2)) {
				count++;
				delList.add(e);
				
			}
		}
		if(count==0) {
			System.out.println("해당날짜엔 삭제할게없어요");
			return;
		}
		
		try {
			for (int i = 1; i <= count; i++) {
				System.out.println(i+"번 : "+delList.get(i-1));
			}
			System.out.println("삭제할 이벤트의 번호를 입력해주세요(안하려면 문자입력)");
			int num = scan.nextInt();
			System.out.println(delList.get(num-1)+" => !! 삭제완료 !!");
			list.remove(delList.get(num-1));
			events.clear();
			events.put(Project_LocalDate.name, list);

		}catch(InputMismatchException e) {
			System.out.println("삭제하지않겠습니다");
			scan.next();
			return;
		}
	}
	//--------------------------------------------------------------------------------------------------------------------
	//추가메서드
	private static void addEvent(Map<String, List<Event>> events)  {
		Scanner scan = new Scanner(System.in);
		try {
			System.out.println("시간을 입력하세요 : yyyy-MM-dd");
			String a = scan.nextLine();
			LocalDate date = LocalDate.parse(a,formatter);//String->date (yyyy-MM-dd)형태로반환하자
			System.out.print("이벤트 제목을 입력하세요: ");
			String title = scan.nextLine();
			System.out.print("이벤트 시작 시간을 입력하세요:(HH:mm) ");
			String startTime = scan.nextLine();
			LocalDateTime start = LocalDateTime.parse(date+" "+startTime,formatter2);
			System.out.print("이벤트 종료 시간을 입력하세요:(HH:mm) ");
			String endTime = scan.nextLine();
			LocalDateTime last = LocalDateTime.parse(date+" "+endTime,formatter2);
			System.out.print("이벤트 상세 정보를 입력하세요: ");
			String details = scan.nextLine();
			Event event = new Event(date,title, start,last, details);
			List<Event> list = events.get(name);
			if(list==null) {
				list=new ArrayList<Event>();
			}
			list.add(event);
			events.put(name, list);
			System.out.println("이벤트가 추가되었습니다.");	   
		} catch (InputMismatchException e) { 
			System.out.println("형식을 맞추세요");
			System.out.println(e.getMessage());
			return;
		}
		catch(DateTimeParseException e) {
			System.out.println("올바른날짜형식이 아니에요");
			return;
		}
	}
//----------------------------------------ParseDate메서드( 포맷팅)----------------------------------------------------------
	
	

//--------------------------------------------------------------------------------------------------------------------
	//조회메서드( 달력 )
	private static void printEvent(Map<String, List<Event>> events) {
		List<Event> list = events.get(name);

		Scanner scan = new Scanner(System.in);
		System.out.print("조회할 년도를 입력하세요 : ");
		int year = scan.nextInt();
		System.out.print("조회할 월을 입력하세요: ");
		int month = scan.nextInt();
		scan.nextLine();
		LocalDate of = LocalDate.of(year, month, 1);
		DayOfWeek dayOfWeek = of.getDayOfWeek();
		int firstweek = (dayOfWeek.getValue()%7)+1;
		//첫번쨰날의 요일   7123456 -> %7 -> 0123456(일:0 토:6) +1 -> 
		//일월화수목금토 : 1234567 로 바뀌게됨 
		
		/*
		 * Calendar ca1 = Calendar.getInstance(); ca1.set(year, month-1,1); int
		 * firstweek =ca1.get(Calendar.DAY_OF_WEEK);//첫째날의 요일 int lastday =
		 * Calendar의요일은 1234567(일월화수목금토) 로 이루어져있다.
		 * ca1.getActualMaximum(Calendar.DATE);
		 */
		int lastday = of.with(TemporalAdjusters.lastDayOfMonth()).getDayOfMonth();//이번달의 마지막요일
		System.out.println("\t"+year + "년 " + month + "월");
		System.out.printf("%-3c %-3c %-3c%-3c %-3c %-2c %-3c",'일','월','화','수','목','금','토');
		System.out.println();
		for(int i=1,day=1;day<=lastday;i++) {
			int count=0;
			if(list==null) {}//list에 아무것도들어있지않다면 for문을 무시함
			else {
				for (Event e : list) {//date는 연,월,일 추출이너무힘들어서 LocalDate 사용함
					int monthValue = e.date.getMonthValue();//리스트의요소에서 달을 출력
					int year2 = e.date.getYear();//리스트의요소에서 연을 출력
					int dayofMonth = e.date.getDayOfMonth();//리스트의요소에서 일을 출력
					if(monthValue==month && year==year2 && day==dayofMonth) {
					count++;
					//연,월,일이 입력한날짜과 같다면 count++; (루프가한번돌면 count는 초기화됨)
					}
				}
			}
			if(i < (firstweek)) {
				System.out.printf("%-4s"," ");
				}// i가 첫째날의 요일(0:일 6:토)이 될떄까지 간격을띄워줌
			else {
				if(count>0) {//이벤트가있다면 글씨의간격을 줄이고 (count)를 붙여줌
					System.out.printf("%-2d(%d)",day++,count);

				}
				else {//없다면 4개의간격으로 날짜를 출력함
					System.out.printf("%-4d",day++);
				}
			}
			if(i%7==0)System.out.println();
		}System.out.println();
	}


//-------------------------------Event 로드 ( 아이디를 입력하면 바로 발생되는 메서드)-------------------------------------------------------------------------------------
	
	private static Map<String, List<Event>> loadEvents()throws IOException, ClassNotFoundException {
		File file = new File(name + ".ser");//입력받은 name이름과같은 ser파일을 불러옴

		if (file.exists()) {
			ObjectInputStream reader=null;
			try {
				reader = new ObjectInputStream(new FileInputStream(file));
				return (Map<String, List<Event>>)reader.readObject();
				//ser파일을 읽어서 Map<String,List<Event>>타입으로 반환해준다/
			}finally {
				reader.close();//항상 reader를 닫아줘야함(끝없이 로딩되는거 방지)
			}
		}
		else {
			//파일이 없다면 HashMap<String,List<Event>>을 만들어줘서반환
			return new HashMap<String,List<Event>>();
		}
	}
}

 

'프로젝트' 카테고리의 다른 글

주말에 프로젝트조금해보기(회원가입만 해보자...!)  (1) 2025.05.10
세미프로젝트 (로그인폼)  (0) 2025.05.09
Hashpass , UUID  (0) 2025.05.09
부트캠프 세미프로젝트1  (0) 2025.05.08
프로젝트1 (완성 )  (0) 2025.03.01