국비 수업 11일차

김성수·2022년 11월 1일
0
post-thumbnail
post-custom-banner

1. 날짜 및 시각 정보를 관리하는 java.util.Date 클래스

  • 생성자에 값을 전달하지 않는다면, 객체 생성 시점의 날짜 및 시간을 그대로 적용한다.
  • 생성자.getTime( ) 함수는 1070년 1월 1일 부터 지금까지의 밀리초를 정수형( 너무 길어서 long )으로 받아준다. 밀리초이므로 1000으로 나눠줄 경우 초 단위를 구할 수 있다.
  • SimpleDateFormat은 날짜 데이터를 형식에 맞춰 문자열로 변환시켜준다. 아래 예시를 보면 이해하기 쉽다.
  • parse는 반대로 문자열 형식의 날짜를 입력받으면 그에 맞게 날짜 데이터로 변환해서 보여주는 함수로, 사용할 경우 반드시 예외 처리가 필요하다.

package date;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Ex02 {
	public static void main(String[] args) throws ParseException {
		// java.util.Date
		// 다양한 데이터를 구성할 때 primitive나 String이 아닌 것 중에서 가장 많이 사용하는 자료형
		
		// 컴퓨터는 1970년 1월 1일을 0시 0분 0초를 기준으로 지난 시간을 초단위로 계산한다
		// 자바에서는 1초 대신 1/1000 초(millisecond)로 기록한다
		
		Date today = new Date();	
		System.out.println(today);
		
		long ln1 = today.getTime();
		System.out.printf("ln1 : %,d\n", ln1);
		
		// 날짜를 문자열 형식으로 간편하게 바꿔주는 자료형 : SimpleDateFormat
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		String s1 = sdf.format(today);	// today를 위 형식에 맞춰 문자열로 변환
		System.out.println(s1);
		
		SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy년 MM월 dd일 hh시 mm분 ss초");
		String s2 = sdf2.format(today);
		System.out.println("지금은 " + s2 + "입니다");
		
		Date d2 = sdf.parse("2022-12-25");
		System.out.println(d2);
		
	}
}

2. 자바의 여러 객체 생성 방법 중 ( 입력을 처리하는 메인 클래스 , 기능을 부여하는 handler 클래스 , 멤버 필드를 매개변수로 받아 객체를 생성하는 DTO 역할의 클래스 )로 만들어진 프로그램

1. 이곳은 Main 클래스 입니다.


package movie2;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

public class Main {
	static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
	
	static void prepareDummy() throws ParseException {
		
		Movie t1 = new Movie("블랙아담", "자움 콜렛 세라", 
				"드웨인 존슨,노아 센티네오,피어스 브로스넌,퀸테사 스윈들".split(","), 
				"액션", 125, sdf.parse("2022-10-19"), 7.63);
		
		Movie t2 = new Movie("A", "B", "C,D,E".split(","), "F", 100, sdf.parse("2000-01-01"), 10.0);
		Movie t3 = new Movie("G", "H", "I,J".split(","), "K", 100, sdf.parse("2000-05-05"), 3.14);
		Movie t4 = new Movie("분노의 질주", "??", "빈 디젤,드웨인 존슨".split(","), "K", 100, sdf.parse("2000-05-05"), 3.14);
		
		Handler.arr[0] = t1;	// static이므로 객체 생성 없이 속성이나 기능에 접근할 수 있다
		Handler.arr[1] = t2;
		Handler.arr[2] = t3;
		Handler.arr[3] = t4;
		
	}
	
	public static void main(String[] args) throws ParseException {
		prepareDummy();
		
		int select, row;
		String keyword;
		Scanner sc = new Scanner(System.in);
		
		do {
			System.out.println("1. 목록");
			System.out.println("2. 단일검색");
			System.out.println("3. 다중검색");
			System.out.println("4. 추가");
			System.out.println("5. 삭제");
			System.out.println("0. 종료");
			System.out.print("메뉴 선택 >>> ");
			select = Integer.parseInt(sc.nextLine());
			
			switch(select) {
			case 1:	System.out.println(Handler.getList()); break;
			case 2: 
				System.out.print("검색어를 입력 : ");
				keyword = sc.nextLine();
				System.out.println(Handler.search(keyword)); 
				break;
			case 3: 
				System.out.print("검색어를 입력 : ");
				keyword = sc.nextLine();
				System.out.println(Handler.searchList(keyword)); 
				break;
			case 4:
				Movie ob = input(sc);
				row = Handler.insert(ob);
				System.out.println(row == 1 ? "추가 성공" : "추가 실패");
				break;
			case 5:
				System.out.println(Handler.getList());
				System.out.print("삭제할 영화의 제목을 입력하세요 : ");
				keyword = sc.nextLine();
				row = Handler.delete(keyword);
				System.out.println(row == 1 ? "삭제 성공" : "삭제 실패");
				break;
			}
		} while(select != 0);
		sc.close();
		
	} // end of main
	
	static Movie input(Scanner sc) throws ParseException {
		
		String title;		// 제목
		String director;	// 감독
		String[] actors;	// 배우
		String genre;		// 장르
		int runningTime;	// 러닝타임(분)
		Date openningDate;	// 개봉일자
		double grade;		// 평점
		
		System.out.print("제목 : "); 			title = sc.nextLine();
		System.out.print("감독 : "); 			director = sc.nextLine();
		System.out.print("배우 : "); 			actors = sc.nextLine().split(",");
		System.out.print("장르 : "); 			genre = sc.nextLine();
		System.out.print("러닝타임(분) : "); 	runningTime = Integer.parseInt(sc.nextLine());
		System.out.print("개봉일자 : "); 		openningDate = sdf.parse(sc.nextLine());
		System.out.print("평점 : "); 			grade = Double.parseDouble(sc.nextLine());
		
		Movie ob = new Movie(title, director, actors, genre, runningTime, openningDate, grade);
		return ob;
	}
}

2. 이곳은 handler 클래스 입니다.


package movie2;

public class Handler {
	
	static Movie[] arr = new Movie[10];
	
	static String getList() {
		String result = "";
		for(int i = 0; i < arr.length; i++) {
			if(arr[i] != null) {
				result += (i + 1) + ") ";
				result += arr[i].getInfo();
				result += "\n";
			}
		}
		return result;
	}
	
	static String search(String keyword) {
		String result = "검색 결과를 찾을 수 없습니다";
		for(int i = 0; i < arr.length; i++) {
			if(arr[i] != null && arr[i].getDetail().contains(keyword)) {
				// i번째 칸이 빈칸이 아니고, i번째 요소의 내용에 keyword가 포함되어 있으면
				result = arr[i].getDetail();
				break;	// 원하는 요소를 하나 찾았다면 더이상 반복하지 않는다
			}
		}
		return result;
	}
	
	static String searchList(String keyword) {
		String result = "";
		for(int i = 0; i < arr.length; i++) {
			if(arr[i] != null && arr[i].getDetail().contains(keyword)) {
				// i번째 칸이 빈칸이 아니고, i번째 요소의 내용에 keyword가 포함되어 있으면
				result += arr[i].getInfo() + "\n";	
				// 원하는 요소를 찾고나서 다른 요소도 추가로 검색하여 결과에 누적시킨다
			}
		}
		return result;
	}
	
	static int insert(Movie ob) {
		for(int i = 0; i < arr.length; i++) {
			if(arr[i] == null) {
				arr[i] = ob;
				return 1;
			}
		}
		return 0;
	}
	
	static int delete(String keyword) {
		for(int i = 0; i < arr.length; i++) {
			if(arr[i] != null && arr[i].title.equals(keyword)) {
				arr[i] = null;
				return 1;
			}
		}
		return 0;
	}
}

3. 이곳은 DTO 클래스 입니다.


package movie2;

import java.text.SimpleDateFormat;
import java.util.Date;

public class Movie {
	String title;		// 제목
	String director;	// 감독
	String[] actors;	// 배우
	String genre;		// 장르
	int runningTime;	// 러닝타임(분)
	Date openningDate;	// 개봉일자
	double grade;		// 평점
	
	// 클래스의 모든 멤버필드를 매개변수로 전달받아서, 객체를 생성하는 생성자 자동으로 만들기
	// source - generate constructor using fields
	
	Movie(String title, String director, String[] actors, String genre, 
			int runningTime, Date openningDate, double grade) {
		
		this.title = title;
		this.director = director;
		this.actors = actors;
		this.genre = genre;
		this.runningTime = runningTime;
		this.openningDate = openningDate;
		this.grade = grade;
	}
	
	String getInfo() {	// 목록에서 사용할 간략한 정보만 문자열로 반환
		String form = "[%s] %s, %s (%.2f)";
		String result = String.format(form, title, actors[0], actors[1], grade);
		return result;
	}
	
	String getDetail() {	// 검색에서 사용할 상세한 정보를 모두 문자열로 반환
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy년 MM월 dd일");
		String form  = "-----------------------\n";
		form += "제목 : %s\n";
		form += "감독 : %s\n";
		form += "출연 : %s\n";	// 배열을 문자열로 변환하는 추가 함수를 활용해야함
		form += "장르 : %s\n";
		form += "상영시간 : %d분\n";
		form += "개봉일자 : %s\n";		// yyyy년 MM월 dd일 형식으로 반환해야 함
		form += "평점 : %.2f\n";
		form += "-----------------------\n";
		
		String result = String.format(form, title, director, 
				arrToString(actors), genre, runningTime,
				sdf.format(openningDate), grade);
		
		return result;
	}
	
	String arrToString(String[] arr) {	// 배우 목록이 배열이므로, 문자열로 변환해야 출력할 수 있다
		String result = "";
		for(int i = 0; i < arr.length; i++) {
			result += arr[i];
			if(i != arr.length - 1) {
				result += ", ";
			}
		}
		return result;
	}
	
	
}

프로그램을 어떻게 하면 효율적으로 생성할 수 있을지를 잘 생각해본다.

profile
다들 잘하는데 나만 못해?
post-custom-banner

0개의 댓글