◎ JAVA

◆ 프로그래밍에서는 날짜를 어떻게 관리하는가?

◆ 1. System.currentTimeMillis();

  • 측정용 시간

  • 1970년 1월 1일 0시 0분 0초(기준시) 부터 지금까지 흘러온 밀리초(ms)

    	import java.time.LocalDate;
    	import java.util.Calendar;
    	import java.util.Date;
    
    	public class Test01 {
    		public static void main(String[] args) }
    			long a = System. currentTimeMillis(); // 결과를 / 1000 / 60 / 60 / 24 / 365로 나눠야 현재 년도가 나온다. 
    			System.out.println("a = " + a);
    	

◆ 2. java.util.Date

  • 최초로 등장한 시간 클래스

  • 1900년을 기준으로 하므로 현재는 버려진 기능이 많음.

  • 한 번 지정된 날짜는 변경이 불가능하다.

  • 월이 0부터 시작하므로 사용을 권장하지 않음.

  • Date()의 가장 큰 문제점은 계산 기능이 어렵다.

  • 현재 시각을 원하는 방식을 출력하는데 주로 사용한다.

  • 포맷 설정용 클래스를 이용하면 원하는 형식으로 변환하여 출력이 가능하다.(java.text.SimpleDateFormat)

  • java api 17버전 사이트를 들어가서 java.util.Date를 검색해보면 Deprecated : 사용을 권장하지 않음이 많다.

    		   Date b = new Date();
    		   System.out.println("b = " + b);
    	
  • Deprecated : 사용을 권장하지 않음. (java api사이트 Instance Method에서)

    			Date c = new Date(12, 1, 16);
    			System.out.println("c = " + c);
    	

◆ 3. java.util.Calender

  • Date를 개선한 클래스

  • 생성 대행 방식을 사용

  • 지정된 날짜는 변경이 가능하므로 날짜 계산에 특화 되어있다.

  • 월이 0부터 시작한다.

    			Calendar d = Calendar.getInstance();
    			System.out.println("d = " + d);
    	
  • 날짜를 바꾸고 싶을 때

    			d.set(2023, 5, 13);
    			System.out.println(d.getTime());
    	

◆ 4. java.time 패키지

  • 날짜만, 시간만, 날짜와 시간을 같이 쓰고 싶은 경우에 맞게 구성

  • 월도 일반적인 방식으로 설정 가능

  • Time은 기술적 한계로 Date와 Calendar를 더 우선적으로 사용한다.

    			LocalDate f = LocalDate.now();
    			LocalDate g = LocalDate.of(2023, 1, 16);
    			System.out.println("f = " + f);
    			System.out.println("g = " + g);
    		}
    	}
       

    ◆ 5. java.text.SimpleDateFormat

    예시1)

    	import java.text.SimpleDateFormat;
    	import java.util.Date;
    
    	public class Test02 {
    		public static void main(String[] args) {
    		Date a = new Date();
    			System.out.println("a = " + a);
    	
    			SimpleDateFormat f  = new SimpleDateFormat("yyyy-MM-dd");
    			System.out.println("f = " + f.format(a));
           

    예시2)

    public class Test03_2 {
    		public static void main(String[] args) {
    			try(Scanner sc = new Scanner(System.in);){
    				System.out.print("날짜 입력 : ");
    				String input = sc.next();
    		
    				//String 날짜 형식을 Date로 변환할 수 있다(SimpleDateFormat 고유 기능)
    				//SimpleDateFormat에 고유 기능은 업캐스팅에서 사용을 할 수 없다. (Format 사용 불가)
    				//parse를 사용해서 역으로 계산하는 것이 되지만 예외 처리를 해줘야 한다.
    				SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd");
    				Date time = parser.parse(input);
    		
    				//객체 생성
    				Calendar c = Calendar.getInstance();
    		
    				//기준 날짜로 변경(2023.06.13)
    				c.setTime(time);
    		
    				//D-100 계산
    				c.add(Calendar.DATE, -100);
    
    				Format f = new SimpleDateFormat("yyyy-MM-dd E");
    				System.out.println(f.format(c.getTime()));
    			}
    			catch(Exception e) {
    				e.printStackTrace();
    			}
    		}
    	}

◆ 6. java.util.Locale

  • 변환 기본 언어 설정

    	import java.util.Date;
    	import java.util.Locale;
    	import java.text.Format;
    	import java.text.SimpleDateFormat;
    
    	public class Test03 {
    
    		public static void main(String[] args) {
    			//현재시각을 다음 날짜 형식으로 출력해보세요.
    			1) 포맷의 날짜에 언어를 바꿔서 출력 할 수 있다.
    
    				Locale.setDefault(Locale.CANADA_FRENCH);
    				Date a = new Date();
    				//System.out.println("a = " + a);
    	
    		1. 2023년 1월 16일 월
    		- 앞으로 java api 사이트에서 최상위 클래스를 찾아서 업캐스팅으로 코드 작성 권장한다.
    		- SimpleDateFormat b = new SimpleDateFormat("y년 M월 d일 E");
    				Format b = new SimpleDateFormat("y년 M월 d일 E");
    				System.out.println("b = " + b.format(a));
    	
    		2. 오전 10시 40분
    		- 참고 : 시간을 H, h를 사용한다.
    				Format c = new SimpleDateFormat("a h시 m분");
    				System.out.println("c = " + c.format(a));
    
    		3. 10:40:35
    				Format d = new SimpleDateFormat("HH:mm:ss");
    				System.out.println("d = " + d.format(a));
    	
    		4. 2023-01-16 월 10:40:35
    				Format f = new SimpleDateFormat("yyyy-MM-dd E HH:mm:ss");
    				System.out.println("f = " + f.format(a));
    			}
    		}

◆ 7. java.util.calendar

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

public class Test01 {
	public static void main(String[] args) {
		//Calendar c = new Calendar(); //직접 생성 불가
		Calendar c = Calendar.getInstance(); //생성 의뢰
	
	//출력하는 방법
	1) 정보를 하나씩 꺼내어 출력
	- .get(항목(상수)) 명령으로 원하는 항목을 추출한다.
	- 반드시 추출할 항목에 대한 정보를 인자로 전달한다.
		int year = c.get(Calendar.YEAR);
		System.out.println("year = " + year);
	
	
	(주의) 월은 0~11로 관리되므로 실제 설정/추출 시 보정을 해야 한다.
		int month = c.get(Calendar.MONTH) + 1;
		System.out.println("month = " + month);
	
		int day = c.get(Calendar.DATE);
		//int day = c.get(Calendar.DAY_OF_MONTH); //Calendar.DATE와 같은 값이다.
		System.out.println("day = " + day);
	
	2) java.util.Date로 변경하여 출력
		Date d = c.getTime();
		Format f4 = new SimpleDateFormat("yyyy-MM-dd E H:mm:ss");
       	System.out.println(f4.format(d));
		}
	}

◆ 9. java.time.LocalDate의 장점

  • JAVA 8+ 에서 나온 java.time 패키지 사용법
  • 명령이 간단해짐
  • 날짜와 시간이 분리되었다.
  • 출력과 계산이 모두 용이해졌다. (새로운 방식)
public class Test01 {
	public static void main(String[] args) {
		LocalDate a1 = LocalDate.now();
		System.out.println(a1.getYear());
		System.out.println(a1.getMonthValue());	
       	System.out.println(a1.getDayOfMonth());	
        System.out.println(a1.getDayOfWeek());
	
		//LocalDate.parse()를 사용하여 특정 날짜를 지정해서 가져올 수 있다.
		LocalDate a2 = LocalDate.of(2023, 6, 13);
		System.out.println(a2);
	
		//LocalDate.parse()를 사용하여 				String 타입 날짜를 LocalDate 타입 날짜로 변환 가능하다.
		//LocalDate a3 = LocalDate.parse("2023-06-13");
		System.out.println(a3);
	
		//차이 계산
		//Period : 연, 월, 일 계산 가능
		Period period = Period.between(a1, a3);
		System.out.println(period.getYears());
		System.out.println(period.getMonths());
		System.out.println(period.getDays());
	}
}

◆ 10. java.time.LocalTime

public class Test02_1 {
	public static void main(String[] args) throws ParseException {
		//사용자에게 시작, 종료시각을 HH:mm 형태로 입력받아 이용시간을 계산하여 출력
		//이용시간은 분으로 출력하며 한시간당 1000원으로 요금을 계산하여 이용요금도 출력
		//(참고) LocalTime은 Duration 클래스로 차이를 구할 수 있으며 필요시 인터넷 검색
		Scanner sc = new Scanner(System.in);
		System.out.print("시작 시간(HH:mm) : ");
		String startTime = sc.next();
    	System.out.print("종료 시간(HH:mm) : ");
		String finishTime = sc.next();
	
		sc.close();
	
		//객체 생성
		Calendar c = Calendar.getInstance();

		//처리
		LocalTime start = LocalTime.parse(startTime);
		LocalTime finish = LocalTime.parse(finishTime);
		Duration duration = Duration.between(start, finish);
	
		long second = duration.getSeconds();
		long minute = second / 60L;
	
		int pricePerHour = 1000;
		double pricePerMinute = pricePerHour / 60.0;
		long price = (long)(pricePerMinute * minute);
	
		//출력
		System.out.println("이용시간(분) : " + minute + "분");
		System.out.println("이용요금(원) : " + price + "원");
	
		(추가) java.text.DecimalFormat 클래스를 사용하여 숫자 형식을 정의
		- #은 해당 자리가 있으면 출력, 없으면 비워두는 형식
		- 0은 해당 자리가 있으면 출력, 없으면 0으로 출력하는 형식
		- ,는 그룹 표시 형식이며 패턴이 자동으로 설정됨
		- .은 소수점 표시 형식
		Format f = new DecimalFormat("#,##0.00");
		System.out.println(f.format(price));
	}
}

◆ 11. Arrays

  • 배열 정렬

  • Arrays는 원시형과 문자열은 오름차순 정렬이 가능하다.

  • 다른 방식이나 객체일 경우는 정렬 기준을 따로 구현해야 한다.

  • java.util.Comparator를 사용하여 정렬 기준을 생성한다.

  • Arrays.sort() 라이브러리를 사용하면 데이터 변경이 불가하다.

  • Lamda(람다)를 사용하여 코드를 아래와 같이 간소화 할 수 있다.

    	public class Test02_4 {
    		public static void main(String[] args) {
    			Integer[] data = new Integer[] {30, 50, 20, 10, 40};
    	
    			//Arrays.sort(data); //무조건 오름차순
    			Arrays.sort(data, (o1, o2) -> o2 - o1); //우측에 정의된 기준에 따라 정렬
    	
    			System.out.println(Arrays.toString(data));
    		}
    	}

◆ 12. Scanner

  • 문자열을 단어나 줄 단위로 끊어서 읽는 것이 가능하다.
  • 단어 : .next()
  • 단어는 띄어쓰기, 개행, 탭, null 등이 해당된다.
  • .hasNext()를 사용하면 읽을 수 있는 단어가 남았는지 확인해준다.
  • 줄 : .nextLine()
  • 줄은 개행(\n)만이 의미가 있다.

Scanner 혼합 사용시 주의사항

  • 목표 : 단어 형태와 줄 단위 입력을 같이 사용하려면?

  • .next() 계열 사용 후 nextLine() 메소드를 부르면 입력이 안된다.

  • 입력이 안되는 이유는 구분하는 기호가 다르기 때문이다.

  • 사이에 .nextLine()을 1회 더 추가해서 남긴 쓰레기를 제거해줘야 한다.

    	public class Test04 {
    		public static void main(String[] args) {
    			Scanner sc = new Scanner(System.in);
    	
    			System.out.print("숫자 입력 : ");
    			int a = sc.nextInt();
    	
    			System.out.print("단어 입력 : ");
    			String b = sc.next();
    	
    			//이전 입력에서 남긴 쓰레기를 제거해야 아래에 String c = sc.nextLine();이 실행된다.
    			sc.nextLine();
    	
    			System.out.print("문장 입력 : ");
    			String c = sc.nextLine();
    	
    			sc.close();
    	
    			System.out.println("a = " + a);
    			System.out.println("b = " + b);
    			System.out.println("c = " + c);
    		}
    	}
profile
Backend Developer

0개의 댓글