수업내용/Java

[2022.09.30.금] Date, Format, Math 클래스

주니어주니 2022. 10. 1. 03:11

 

Java API 중 다른 클래스 더 살펴보기 

 

 

1. Date 

 

 

  • java.util.Date 
    • 현재 날짜와 시간정보를 표현하는 클래스 
    • 가장 많이 사용되는 클래스 
  • java.sql.Date : 날짜 정보를 표현하는 클래스
  • java.sql.Timestap : 시간 정보를 표현하는 클래스 

 

  • 자바 1.8부터 날짜와 시간정보를 제공하는 클래스가  추가됨 (얘는 나중에) 
    java.time.LocalDate : 날짜 정보를 표현하는 클래스 
    java.time.LocalTime : 시간 정보를 표현하는 클래스
    java.time.LocalDateTime : 날짜와 시간정보를 표현하는 클래스 

 

 

* 유닉스 타임 : 1970년 1월 1일 0시 0분 0초부터 현재 싯점까지의 시간을 1/1000초 단위로 환산한 값이 반환

 

 

1-1. java.util.Date

 

  • java.util.Date의 주요 API
    • 생성자)
      - new Date()                        : 시스템의 현재 날짜와 시간정보를 표현하는 객체 생성
      - new Date(long unixTime)  : 지정된 유닉스타임에 해당하는 날짜와 시간정보를 표현하는 객체 생성

    • 메소드)
      - long getTime()                      : Date객체의 유닉스타임 반환
      - boolean before(Date other)  : Date객체의 날짜와 시간정보 other보다 이전이면 true 반환
      - boolean after(Date other)     : Date객체의 날짜와 시간정보 other보다 이후면 true 반환
      - int compareTo(Date other)    : Date객체의 날짜와 시간정보가 other보다 이전이면 0보다 작은 정수
                                                       : Date객체의 날짜와 시간정보가 other보다 이후이면 0보다 큰 정수
                                                       : Date객체의 날짜와 시간정보가 other과 같으면 0 반환 
      - String toString()                    : Date객체의 날짜와 시간정보를 문자열로 반환하도록 Object의 toString()을 재정의

 

* java.util - 다른패키지에 있기 때문에 반드시 import 

  단, java.lang 패키지에 있는 것만 import 안해도 사용 가능 (다른 패키지는 모두 import) 

 

* Date로는 특정날짜의 시간을 구할 수 없음 (현재날짜만 가능) 

-> Calendar로 사용 

얘는 추상클래스 -> 객체 생성할 필요 없음

( 이 추상클래스를 구현해서 -> 태양력, 음력, 이슬람력, 유태력 등을 만듦 -> 기능이 조금만 달라서 인터페이스를 따로 안만들고 추상클래스에서 대부분 구현 ) 

 

 

- Date 클래스로 날짜, 시간 조회하기 (특정날짜는 조회 못함!) 

import java.util.Date;

public class DateApp {
	
	public static void main(String[] args) {
		
		// 시스템의 현재 날짜와 시간정보를 가지고 있는 Date객체 생성하기 (생성과 동시에 메소드)
		Date now = new Date();	// Date는 util패키지(다른패키지)에 있으므로 반드시 import
		System.out.println(now);
		
		// 생성된 Date객체에서 유닉스타임 획득하기
		long unixTime = now.getTime();
		System.out.println(unixTime);
	}
}

 

Fri Sep 30 11:49:36 KST 2022
1664506176415

 

 

 

1-2. java.util.Calendar 

  • 날짜와 시간정보 및 다양한 정보를 표현하는 추상 클래스 (캘린더는 잘 안씀) 
  • Calendar 클래스를 구현한 대표적인 클래스는 GregorianCalendar(서력기원 태양력)
  • 주요 API
    • 정적 메소드
      Calendar.getInsatance()
      : 시스템의 지역과 날짜, 시간정보와 맞는 Calendar객체 반환
        (실제로 생성되는 객체는 GregorianCalendar객체)
    • 멤버 메소드
      int get(int field) 
      : 지정된 필드에 해당하는 정보 반환
      : field값은 상수로 정의되어 있다
      ex) Calendar.YEAR                            연도
            Calendar.MONTH                         월 (월은 0부터 시작)
            Calendar.DAY_OF_MONTH         일
            Calendar.HOUR                            시
            Calendar.MINUTE                         분
            Calendar.SECOND                        초
            Calendar.DAY_OF_WEEK            요일(숫자)

      void set(int field, int value) 
      : 지정된 필드에 해당하는 값을 입력한 value값으로 변경

      void set(int year, int month, int dayOfMonth)
      : 지정된 날짜(연월일)에 해당하는 값으로 변경

      void setTime(Date date) 
      : 전달받은 Date객체로 날짜와 시간정보가 변경

      Date getTime()
      : Calendar객체의 날짜와 시간정보가 동일한 정보를 가지는 Date객체 반환

      long getTimeInMillis()
      : Calendar객체의 날짜와 시간정보에 해당하는 유닉스타입값을 반환

 

- Calendar 클래스로 특정 날짜 조회, 변경

import java.util.Calendar;

public class CalendarApp {

	public static void main(String[] args) {
		
		// 시스템의 지역, 시간대 정보를 바탕으로 현재 날짜와 시간정보를 포함하는 Calendar객체 반환
		Calendar now = Calendar.getInstance();	//시스템 설정에 맞는 지역과 날짜 정보
        	System.out.println(now);
		
		// 연, 월, 일 정보 변경
		now.set(Calendar.YEAR, 1996);
		now.set(Calendar.MONTH, 8);
		now.set(Calendar.DAY_OF_MONTH, 22);
		
		// 시스템 설정에 맞는 Calendar객체에서 연, 월, 일, 시, 분, 초 정보 조회
		int year = now.get(Calendar.YEAR);
		int month = now.get(Calendar.MONTH) +1;
		int day = now.get(Calendar.DAY_OF_MONTH);
		int hour = now.get(Calendar.HOUR);
		int minute = now.get(Calendar.MINUTE); 
		int second = now.get(Calendar.SECOND); 
		
		System.out.println("년: " + year);
		System.out.println("월: " + month);
		System.out.println("일: " + day);
		System.out.println("시: " + hour);
		System.out.println("분: " + minute);
		System.out.println("초: " + second);
	}
}

 

java.util.GregorianCalendar[time=1664535057321,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Seoul",offset=32400000,dstSavings=0,useDaylight=false,transitions=30,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2022,MONTH=8,WEEK_OF_YEAR=40,WEEK_OF_MONTH=5,DAY_OF_MONTH=30,DAY_OF_YEAR=273,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=5,AM_PM=1,HOUR=7,HOUR_OF_DAY=19,MINUTE=50,SECOND=57,MILLISECOND=321,ZONE_OFFSET=32400000,DST_OFFSET=0]
년: 2022
월: 9
일: 30
시: 11
분: 51
초: 0

(set메소드 실행 후)
년: 1996
월: 9
일: 22
시: 8
분: 17
초: 37

 

 

 

import java.util.Calendar;
import java.util.GregorianCalendar;

public class CalendarApp2 {

	public static void main(String[] args) {
		
		Calendar now = Calendar.getInstance();
		Calendar birth = new GregorianCalendar(1996, 1, 22);	//날짜 바로 바꾸는 생성자가 있음
		
		long nowUnixTime = now.getTimeInMillis();
		long birthUnixTime = birth.getTimeInMillis();
		
		long lifeUnixTime = nowUnixTime - birthUnixTime;
		int days = (int)(lifeUnixTime/(60*60*24*1000));
		System.out.println("내가 몇일이나 살았나? " + days);
	}
}

 

내가 몇일이나 살았나? 9717

 

 

 

 

* Date 객체 - 현재시간만 나와 

  Calendar 객체 - 특정시간을 설정할 수 있지만, 잘 안써 (얘가 적용되는 경우는 거의 없고, 다 Date를 씀)

  Date를 쓰는데, 현재시간만 나온다는 점을 개선해야돼

 

 

1-3. Format

 

 

1) java.text.SimpleDateFormat (날짜 ↔ 문자열) 

  • Date를 원하는 포맷(형식)의 문자열로 변환 ( 날짜 -> 문자열 ) 
  • 지정된 패턴(날짜형식)으로 작성된 문자열을 Date로 변환 ( 문자열 -> 날짜 )
  • 주요 API
    • 생성자
      - SimpleDateFormat()                         : SimpleDateFormat 객체 생성
      - SimpleDateFormat(String pattern)   : 지정된 패턴을 가진 SimpleDateFormat 객체 생성

    • 멤버메소드
      <날짜 -> 문자열>
      - void applyPattern(String pattern)     : 기본생성자 쓰는 경우, SimpleDateFormat 객체의 패턴 적용
      - String format(Date date)                   : Date를 지정된 패턴의 문자열로 반환

      <문자열 -> 날짜>
      - Date parse(String text)                      : 지정된 패턴으로 작성된 문자열을 Date객체로 반환

    • 날짜 -> 문자열로 바꿀 때, 
      - SimpleDateFormat("yyyy-MM-dd");      처음부터 이런식으로 형식을 바로 정해도 되고,
                                                                          (원래 얘를 씀) 
      - SimpleDateFormat();                              생성자를 먼저 만들고 나서,
        applyPattern(String pattern);                그 다음에 형식 정해도 됨
  • 사용예시)
    영화예매, 기차예매 등 내가 날짜를 선택,입력해서 날짜를 지정할 때 (문자열 -> 날짜) 
  • 주요 패턴문자
기호 설명 예시
y year "yyyy" = "2022"      ,  "yy" = "22"
M month "MM" = "09"            ,  "M" = "9"
d day in month "dd" = "09"              ,  "d" = "9"
E day name (요일)  "EEEE" = "금요일"  ,  "EE" = "금"
a am/pm "a" = "오전"             ,  "오후"
h hour in am/pm (1~12)  "h" = "1"                  ,  "hh" = "01" 
H hour in day (0~23)  
m minute  
s second  
S millisecond  

 

 

 

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

public class DateFormatApp {

	public static void main(String[] args) throws Exception {
		
		Date now = new Date();				// 현재 날짜 <-> 문자열 할거니까, 현재날짜를 실행하는 기본생성자
		
		SimpleDateFormat sdf = new SimpleDateFormat();	// 생성자 먼저 만들기 (형식 고정하려면 생성자 매개변수로 넣으면 됨)
		
		
		// Date 객체의 날짜와 시간정보를 지정된 패턴의 문자열로 변환
		sdf.applyPattern("yyyy-MM-dd");			// SDF객체를 호출해서 형식을 설정하고
		String text1 = sdf.format(now);			// Date객체의 날짜(현재)를 지정된 형식의 문자열로 변환 
		System.out.println("[yyyy-MM-dd] " + text1);
		
		sdf.applyPattern("yyyy-M-d");
		String text2 = sdf.format(now);
		System.out.println("[yyyy-M-d] " + text2);
		
		sdf.applyPattern("yyyy년 M월 d일");
		String text3 = sdf.format(now);
		System.out.println("[yyyy년 M월 d일] " + text3);
		
		sdf.applyPattern("yyyy년 M월 d일 EEEE");				// EE = 금
		String text4 = sdf.format(now);
		System.out.println("[yyyy년 M월 d일 EEEE] " + text4);	
		
		sdf.applyPattern("a h:m:s");
		String text5 = sdf.format(now);
		System.out.println("[a h:m:s] " + text5);
		
		sdf.applyPattern("a hh:mm:ss");
		String text6 = sdf.format(now);
		System.out.println("[a hh:mm:ss] " + text6);
		
		sdf.applyPattern("a h시 m분 s초");
		String text7 = sdf.format(now);
		System.out.println("[a h시 m분 s초] " + text7);
		
		sdf.applyPattern("yyyy년 M월 d일 EEEE a h시 m분 s초");
		String text8 = sdf.format(now);
		System.out.println("[yyyy년 M월 d일 EEEE a h시 m분 s초] " + text8);
		
		
		// 지정된 패턴으로 작성된 문자열을 분석해서 Date객체로 변환
		sdf.applyPattern("yyyy-MM-dd");		// SDF에 이런형식을 지정해
		Date birth = sdf.parse("1996-01-22");	// 이 형식의 문자열을 넣으면 그 날짜의 객체 반환
		System.out.println(birth);
		
	}
}

 

[yyyy-MM-dd] 2022-09-30
[yyyy-M-d] 2022-9-30
[yyyy년 M월 d일] 2022년 9월 30일
[yyyy년 M월 d일 EEEE] 2022년 9월 30일 금요일
[a h:m:s] 오후 12:51:58
[a hh:mm:ss] 오후 12:51:58
[a h시 m분 s초] 오후 12시 51분 58초
[yyyy년 M월 d일 EEEE a h시 m분 s초] 2022년 9월 30일 금요일 오후 12시 51분 58초
Mon Jan 22 00:00:00 KST 1996

 

* 설명

  • Date now = new Date();
    : date값에 넣을 날짜 객체. 현재시간을 넣을거니까 현재시간을 자동 실행하는 Date의 기본 생성자 실행
  • SimpleDateFormat sdf = new SimpleDateFormat();
    : java.util에 있는 SimpleDateFormat기능을 이용할거니까 객체가 필요해. 매개변수 있는 생성자에 형식을 바로 넣어도 되지만, 여기서는 여러가지 형식을 적용할 거니까 일단 기본생성자로 만들어놔
  • sdf.applyPattern("yyyy-MM-dd");   
    : sdf에 있는 기능 중에 applyPattern을 이용해서 형식을 정할거야
  • String text1 = sdf.format(now);                 
    : 그리고 sdt에 있는 기능 중에 입력한 Date에 내가 지정한 형식을 적용할건데, 얘는 문자열로 반환이 돼 

 

 

 

2) java.text.DecimalFormat (숫자 ↔ 문자열) 

 

  • 숫자를 지정된 포맷의 문자열로 변환 (숫자 -> 문자열) 
  • 지정된 패턴으로 작성된 숫자형식의 문자열을 숫자로 변환 (문자열 -> 숫자) 
  • 주요 API
    • 생성자
      - DecimalFormat()
      - DecimalFormat(String pattern)   : 지정된 패턴이 적용된 DecimalFormat 객체 생성 

    • 멤버메소드
      <숫자 -> 문자열> 
      - void applyPattern(String pattern)   : 기본생성자 쓰는 경우, DecimalFormat객체에 지정된 패턴 적용 
      - String format(long number)            : 정수를 지정된 패턴의 문자열로 변환
      - String format(double number)        : 실수를 지정된 패턴의 문자열로 변환

      <문자열 -> 숫자> 
      - Number parse(String text)              : 지정된 패턴으로 작성된 문자열을 Numbr객체로 변환
                                                                (Number객체의 intValue(), longValue(), doubleValue() 를 통해 숫자 반환)

      (int parse, double parse 이런식으로 하면, 매개변수가 똑같으니까 중복정의를 할 수 없음
      -> 문자열을 넣고 반환타입만 다르니까 -> Number라는 객체로 반환 -> 이 객체의 intValue()를 통해 정수 반환)

      * 원래 문자열 -> 숫자의 방법은
      - "1234" ->    Integer.ParseInt("1234")           -> 1234
      - "3.14"  ->    Double.ParseDouble("3.14")    -> 3.14
       
      근데 얘네는 ParseInt로 안됨 (숫자가 아닌 성분이 있어서) 
      - "1,000,000"       -> DecimalFormat.parse("1,000,000") -> Number객체 획득 -> Number의 intValue() -> 1000000
      - "1,000,000.23"  -> DecimalFormat.parse("1,000,000.23") -> Number객체 -> Number의 doubleValue() -> 1000000.23

    • 주요 패턴문자 
기호 설명
# 숫자 하나
0 숫자 하나
- 마이너스 부호
, 자릿수
. 소수점 

 

import java.text.DecimalFormat;

public class DecimalFormatApp {

	public static void main(String[] args) throws Exception {
		
		// 숫자를 지정된 패턴의 문자열로 변환 (숫자 -> 문자열) 
		DecimalFormat df = new DecimalFormat();		// 실제로는 DecimalFormat(String pattern) 얘 사용함
		
		// 소수점이 없는 정수로 표현하고, 3자리마다 ,를 추가
		df.applyPattern("#,###");
		String text1 = df.format(100000);
		System.out.println("[#,###] " + text1);
		
		df.applyPattern("0,000");
		String text2 = df.format(123456789);
		System.out.println("[0,000] " + text2);
		
		// 소수점 3번째자리에서 반올림해서 2번째자리까지 표시 
		df.applyPattern("#,###.##");			// 소수점 둘째자리까지(세번째에서 반올림) 
		String text3 = df.format(123.4567);
		System.out.println("[#,###.##] " + text3);
		
		// 소수점 3번째자리에서 반올림해서 2번째자리까지 표시.
		// 지정된 소수점자리보다 소수점자리가 적으면, 값이 있는 부분까지만 표시
		df.applyPattern("#,###.##");			// .##은 값이 없으면 표시가 안되니까, 정확히 소수점 몇째자리에서 반올림했는지 몰라 
		String text4 = df.format(123.4);
		System.out.println("[#,###.##] " + text4);
		
		// 소수점 3번째자리에서 반올림해서 2번째자리까지 표시.
		// 지정된 소수점자리보다 소수점자리가 적어도, 0으로 표시
		df.applyPattern("#,###.00");			// .00은 값이 없어도 0으로 표시되니까, 정확히 소수점 몇째자리에서 반올림했는지 알수 있음
		String text5 = df.format(123.4);
		System.out.println("[#,###.00] " + text5);
		
		double average = 230/3.0;			// 76.666666666... 
		String text6 = df.format(average);
		System.out.println("평균점수: " + text6);
		
		// 문자열을 숫자로 변환
		df.applyPattern("#,###");
		Number number1 = df.parse("10,000,000");
		int value1 = number1.intValue();
		System.out.println(value1);
	}
}

 

[#,###] 100,000
[0,000] 123,456,789
[#,###.##] 123.46
[#,###.##] 123.4
[#,###.00] 123.40
평균점수: 76.67
10000000

 

 

 

-StringUtils를 만들기

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

public class StringUtils {		// SimpleDateFormat을 만들지 않고, util로 다 할수있어

	private static SimpleDateFormat sdf = new SimpleDateFormat();	// 생성자라서 객체 생성해야 함 
	private static DecimalFormat df = new DecimalFormat();		// static메소드에서는 static변수밖에 못써서
	
	
	// 정적메소드로 하는 이유 
	// 광범위하게 여러클래스에서 자주 사용할거라서 -> 객체에 소속시킬수x
	// util 클래스 안에 , 조금씩만 바꿔서 사용
	
	// < 숫자 -> 문자열 > 
	/**
	 * 정수를 전달받아서 3자리마다 ","가 포함된 문자열로 반환
	 * @param number 정수
	 * @return "#,###" 형식의 문자열 
	 */
	public static String numberToString(long number) {	// 정수는 대부분 #,### 형태 
		df.applyPattern("#,###");
		return df.format(number);
	}
	
	/**
	 * 실수를 전달받아서 3자리마다 ,가 포함되고, 소수점 2자리까지 표현되는 문자열로 반환 
	 * @param number 실수
	 * @return "#,###.00" 형식의 문자열 (실수만 입력하면, 이 메소드를 통해 실수의 기본형식을 반환) 
	 */
	public static String numberToString(double number) {
		return numberToString(number, "#,###.00");
	}
		
	/**
	 * 실수를 전달받아서 지정된 패턴의 문자열로 반환 
	 * @param number 실수
	 * @param pattern 패턴
	 * @return 지정된 형식의 문자열 (실수와 형식을 입력하면, 이 메소드를 통해 지정된 형식으로 반환) 
	 */
	public static String numberToString(double number, String pattern) {
		df.applyPattern(pattern);
		return df.format(number);
	}
	
	/**
	 * java.util.Date를 전달받아서 "yyyy-MM-dd" 형식의 문자열로 반환 
	 * @param date 날짜
	 * @return "yyyy-MM-dd" 형식의 문자열 (반환형식 지정 x -> 기본형식을 반환) 
	 */
	public static String dateToString(Date date) {		// 이 메소드를 호출하면서 Date를 주면
		return dateToString(date, "yyyy-MM-dd");	// 밑에있는 매개변수 2개짜리 메소드를 호출
	}
	
	/**
	 * java.util.Date와 패턴을 전달받아서 지정된 패턴 형식의 문자열로 반환 (메소드 중복정의)
	 * @param date 날짜
	 * @param pattern 패턴
	 * @return 지정된 패턴 형식의 문자열 (반환형식을 지정하고 싶을 때)
	 */
	public static String dateToString(Date date, String pattern) {	// 위에서 반환되는 패턴을 받고
		if(date == null || pattern == null) {
			return null;
		}
		sdf.applyPattern(pattern);	// sdf에 그 패턴을 저장하고
		return sdf.format(date);	// 처음 전달했던 Date를 그 형식으로 반환
	}
	
	// < 문자열 -> 날짜 >
	/**
	 * "yyyy-MM-dd" 형식의 문자열을 java.util.Date로 반환
	 * @param text "yyyy-MM-dd" 형식의 문자열
	 * @return 날짜 
	 */
	public static Date textToDate(String text) {		// 2022-09-30 를  text에 주면 
		return textToDate(text, "yyyy-MM-dd");		// 2022-09-30의 Date객체 반환하려면 아래 메소드를 실행해야돼 
	}
	
	/**
	 * 지정된 패턴형식의 문자열과 패턴을 전달받아서 java.util.Date로 반환
	 * @param text 지정된 날짜 형식의 문자열
	 * @param pattern 패턴
	 * @return 날짜
	 */
	public static Date textToDate(String text,String pattern) {		// "yyyy-MM-dd"형식이 pattern에 들어감
		sdf.applyPattern(pattern);					// 전달받은 패턴을 저장
		try {
			return sdf.parse(text);					// text를 Date타입으로 바꿈 // 2022-09-30에 해당하는 날짜 반환
		} catch (ParseException ex) {
			throw new RuntimeException(ex);
		}
	}
}

 

- StringUtilsApp 

import java.util.Date;

import utils.StringUtils;

public class StringUtilsApp {

	public static void main(String[] args) {
		
		// 연월일만 있으면 되는 경우 
		Date date1 = StringUtils.textToDate("2022-09-30");	// 이 날짜에 해당하는 Date 반환
		System.out.println(date1);
		
		// 특수한 경우, 내가 필요한 정보를 내가 입력(연월일 + 시간) 
		Date date2 = StringUtils.textToDate("2022년 1월 22일 오전 9시 10분", "yyyy년 M월 d일 a h시 m분");	
		System.out.println(date2);				//문자열 형식과 패턴이 맞으면 Date로 반환됨
		
		Date date3 = new Date();
		System.out.println(StringUtils.dateToString(date3));				// 기본 패턴
		System.out.println(StringUtils.dateToString(date3,"yy년 M월 d일 EEEE"));	// 지정한 패턴
		
		System.out.println("구매가격: " + StringUtils.numberToString(15000000) + "원");
	}
}

 

Fri Sep 30 00:00:00 KST 2022
Sat Jan 22 09:10:00 KST 2022
2022-10-01
22년 10월 1일 토요일
구매가격: 15,000,000원

 

 

 

 

* 설명

  • < 실수 -> 문자열 >
    • public static String numberToString(double number) {
      : 만약 numberToStrint 메소드를 실행하면서 실수만 입력을 했으면
    •         return numberToString(number, "#,###.00");       }
      : 문자열이 반환되어야 하는데, 그럴려면 일단 중복정의된 메소드를 다시 호출하고, 얻어진 문자열이 반환됨
        실수만 입력했을 때, 입력한 실수와 실수의 기본형인 "#,###.00"를 매개변수로 한 메소드를 다시 호출

    • public static String numberToString(double number, String pattern) {
      : 위의 메소드 실행결과, 입력한 실수와 실수의 기본형인 "#,###.00"을 매개변수로 전달
    •         df.applyPattern(pattern);
      : 그 형식을 df에 저장하고
    •         return df.format(number);     }
      : 입력한 실수를 그 형식에 맞춰서 반환

      * 실수의 기본형인 "#,###.00"이 아닌 다른 형식을 하고 싶다면 중복정의된 메소드의 매개변수에 형식을 지정하면 됨

  • < 날짜 -> 문자열 >
    • public static String dateToString(Date date) {
      : dateToString 메소드를 실행하면서 Date만 입력했으면
    • return dateToString(date, "yyyy-MM-dd");    } 
      : 그 결과로 문자열을 얻기 위해서는, 입력한 Date와 Date의 기본형식인 "yyyy-MM-dd"를 매개인자로 한 메소드를 호출함

    • public static String dateToString(Date date, String pattern) {
      : 위에서 반환됨과 동시에 매개인자로 들어온 date와 pattern을 적용
    • sdf.applyPattern(pattern);
      : sdf의 기능 중 applyPattern을 이용해서 위의 메소드 결과 반환된 "yyyy-MM-dd"를 저장
    • return sdf.format(date);       } 
      : sdf의 기능 중 format을 이용해서 입력받은 date를 입력받은 형식으로 반환함

      * 날짜의 기본형인 "yyyy-MM-dd"가 아닌 다른 형식으로 하고싶으면 중복정의된 메소드의 매개변수로 원하는 형식을 넣으면 됨 
  • < 문자열 -> 숫자 >
    • public static Date textToDate(String text) {
      : 만약 "2022-09-30"을 text에 주면
    • return textToDate(text, "yyyy-MM-dd");     }
      : Date객체를 반환받기 위해서는, text와 Date의 기본형식을 매개변수로 갖는 메소드를 호출

    • public static Date textToDate(String text,String pattern) {
      : text에 "2022-09-30", pattern에 "yyyy-MM-dd"가 들어감 ( text 형식 = pattern 형식 이어야함 ) 
    • sdf.applyPattern(pattern);
      : 전달받은 패턴을 sdf에 저장
    • return sdf.parse(text);
      : 문자열 text("2022-09-30")를 지정한 패턴형식으로, 문자열에 해당하는 날짜 Date타입으로 바꿈

 

 

 

2. Math

 

2-1. java.lang.Math

  • 수학연산과 관련된 기능을 제공하는 유틸클래스
  • 모든 메소드가 정적메소드
  • 주요 메소드
    • static int abs(int value)     : 절대값 반환
    • static int min(int a, int b)   : 더 작은 값 반환
    • static int max(int a, int b)  : 더 큰 값 반환

    • static long round(double a)   : 실수를 일의자리까지 반올림해서 반환 (소수부 x) 
    • static double ceil(double a)   : 1 < x <=2 일 때, ceil(x) = 2.0 (올림)
    • static double floor(double a) : 1 <= x < 2 일 때, floor(x) = 1.0 (내림) 
    • static double random()          : 0.0 <= x < 1 범위의 임의의 실수(난수) 반환 
                                                     : (int)Math.random()*N           -> 0부터 (N-1) 까지의 숫자 중 임의의 숫자 반환
                                                     : (int)(Math.random()*N + 1)  -> 1부터 N까지의 숫자 중 임의의 숫자 반환

(ex. 한 페이지에 책 목록을 10개씩 표시할건데, 책이 23권이 있을 때 

        -> 23/10 = 2.3 페이지가 필요 -> ceil을 이용 -> 3페이지 생성 (한 페이지에 한 권만 있어도 페이지 생성 필요하니까) 

 

 

import java.util.Arrays;

public class MathApp {
	public static void main(String[] args) {
	
		System.out.println("### round() 메소드");
		System.out.println(Math.round(1.3));	// 1
		System.out.println(Math.round(1.5));	// 2
		System.out.println(Math.round(1.6));	// 2
		
		System.out.println("### ceil() 메소드");
		System.out.println(Math.ceil(1.3));	// 2
		System.out.println(Math.ceil(1.5));	// 2
		System.out.println(Math.ceil(1.6));	// 2
		
		System.out.println("#### floor() 메소드");
		System.out.println(Math.floor(1.3));	// 1
		System.out.println(Math.floor(1.5));	// 1
		System.out.println(Math.floor(1.6));	// 1
		
		System.out.println("### random() 메소드");
		System.out.println((int)(Math.random()*6+1));
		System.out.println((int)(Math.random()*6+1));
		System.out.println((int)(Math.random()*6+1));
		System.out.println((int)(Math.random()*6+1));
		System.out.println((int)(Math.random()*6+1));
		System.out.println((int)(Math.random()*6+1));
		
		int[] numbers = new int[10];
		for(int i=0; i<numbers.length; i++) {
			int number = ((int)(Math.random()*100/10 + 1))*10;
			numbers[i] = number;
		}
		System.out.println(Arrays.toString(numbers));
	}
}

 

### round() 메소드
1
2
2
### ceil() 메소드
2.0
2.0
2.0
#### floor() 메소드
1.0
1.0
1.0
### random() 메소드
6
1
2
6
4
2
[20, 30, 90, 40, 50, 20, 10, 30, 50, 80]

 

 

 

 

 

<과제>

 

app1 : 상품등록, 상품입고, 상품판매, 재고현황, 판매현황

app2 : 상품등록, 상품이고, 상품판해(여러 건), 재고현황, 판매현황

app3 : 학생등록, 성적등록(임의의 과목), 학생조회, 성적조회, 성적변경, 학생삭제