study/Java

[sist] 2024.01.22_Java : Calendar 클래스, java.time 패키지, 날짜비교, DecimalFormat, Random 함수, Enum

듀2 2024. 3. 7. 18:11

* Calendar

- 단편적인 날짜(년, 월, 일,,) 정보를 얻을 때 사용.

- 추상클래스 : 객체화가 되지 않는다.

 

1. 객체생성)
 - 객체를 얻는 method 사용

Calendar cal = Calendar.getInstance();

 

 - 자식 클래스를 사용

Calendar cal = new GregorianCalendar();

 

2. method 사용)

 : 년, 월, 일 등의 정보를 get()에 constant를 할당하여 얻는다.

int year = cal.get(Calendar.YEAR);	// 가독성 향상

int year = cal.get(1); // 가독성이 좋지 않다.
int month = cal.get(Calendar.MONTH) + 1; // 월은 0월부터 시작 0~11월
int day = cal.get(Calendar.DAY_OF_MONTH); // 오늘 얻기
int dayOfYear = cal.get(Calendar.DAY_OF_YEAR); // 오늘이 이번 년의 몇 번째 날인지

// 요일 : 요일의 index가 반환
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);

// 오전 : 0 , 오후 : 1
int amPm = cal.get(Calendar.AM_PM);

// 시간
int hour = cal.get(Calendar.HOUR); // 12시간
int hour = cal.get(Calendar.HOUR_OF_DAY); // 24시간

// 분
int minute = cal.get(Calendar.MINUTE);

// 초
int second = cal.get(Calendar.SECOND);

 

* 특정 날짜로 변경

1. 생성)

Calendar cal = Calendar.getInstance();
// cal : 시스템의 현재 날짜 : 2024-01-22

 

2. 특정 날짜 정보를 변경) - 설정할 날짜정보만 변경되고, 다른 정보는 그대로이다.

cal.set(필드, 변경할 값);

// 년
cal.set(Calendar.YEAR, 2025);	// 2025-01-22

// 월 : 사람이 사용하는 월보다 -1 설정
cal.set(Calendar.MONTH, 1);	// 2025-02-22

// 일 : 현재 월에 없는 일이 설정되면 다음 달 1일로 변경된다.
cal.set(Calendar.DAY_OF_MONTH, 30); // 2025-02-30 -> 2025-03-01

 

* java.time 패키지

- JDK 1.8에서부터 제공되는 패키지

- LocalDate : 날짜 정보만 가진 클래스

- LocalTime : 시간 정보만 가진 클래스

- LocalDateTime : 날짜와 시간 정보를 모두 가진 클래스

- Period : 두 날짜 간의 연산을 하기 위한 클래스

- Duration : 두 시간 사이의 연산을 하기 위한 클래스

 

- 사용법)

 1. 객체 생성을 직접 할 수 없다.

now() // static method (시스템의 현재 시간)
LocalDate ld = LocalDate.now();
LocalTime lt = LocalTime.now();
LocalDateTime ldt = LocalDateTime.now();

of() // static method (개발자가 원하는 시간으로 객체를 얻을 수 있다.)
LocalDate ld = LocalDate.of(년, 월, 일);
LocalTime lt = LocalTime.of(시, 분, 초);
LocalDateTime ldt = LocalDateTime.of(년, 월, 일, 시, 분, 초);
LocalDateTime ldt = LocalDateTime.of(LocalDate, LocalTime);

 

 2. method 호출

// LocalDate : 시간 관련 method는 제공X
// 년
int year = ld.getYear();
// 월(1~12월)
int month = ld.getMonthValue();
// 일
int dayOfMonth = ld.getDayOfMonth();
// 요일 - 반환형 : Enumeration
ld.getDayOfWeek() // 요일
ld.getDayOfWeek().getValue(); // enum DayOfWeek 에서 제공하는 method, enum이 가진 상수의 요일 숫자

// LocalTime : 날짜 관련 method는 제공X
// 시
int hour = lt.getHour(); // 24시간
// 분
int minute = lt.getMinute();
// 초
int second = lt.getSecond();

 

* 한글로 출력

- java.time.format.DateTimeFormatter 클래스를 사용.

- letter은 java.text.SimpleDateFormat과 같음.

 

사용법)

 1. 생성 - 안됨

 - 객체를 얻는 ofPattern method 사용

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("패턴", Locale);

 

2. LocalDate 객체나 LocalDateTime 객체의 method를 호출

String dateFormat = ld.format(dtf);
// parttern이 설정된 날짜가 문자열로 반환

 

* 날짜 변환

- method를 호출하여 변환한 날짜를 설정하고, 자신 객체에 재할당하여 사용.

- widthXxx(), plusXxx(), minusXxx()

- 년 변경

ld = ld.widthYear(변경할 년도);
ld = ld.plusYear(더할년도);
ld = ld.minusYear(뺄 년도);

 

* 날짜 비교

- isAfter, isBefore, isEqual

- 사용법)

LocalDate ld = LocalDate.now(); // 2024, 1, 22 
LocalDate ld2 = LocalDate.of(2024, 1, 23); // 2024, 1, 23

// ld : 날짜, ld2 : 비교할 날짜
ld.isAfter(ld2); // false
ld.isBefore(ld2); // true
ld.isEqual(ld2); // false

 

* 날짜 간의 차이 연산

- Period 클래스 사용

- LocalDate를 사용한 날짜를 비교한다.

- 사용법)

 1. 날짜를 가진 객체 얻기

LocalDate ld = LocalDate.of(2023, 12, 22);
LocalDate ld2 = LocalDate.of(2024, 1, 22);

 

 2. 날짜 연산을 하기 위한 객체 얻기

Period p = Period.between(ld, ld2);

 

 3. 각 날짜별 차이 얻기(해당 날짜끼리만 연산한다.)

// 년도 차
p.getYears();

// 월 차
p.getMonths();

// 일 차
p.getDays();

 

* DecimalFormat

- 숫자를 형식을 가진 문자열로 만들어 보여줄 때

1. 생성)

DecimalFormat df = new DecimalFormat(pattern);

 

2. method 호출)

String value = df.format(숫자);

 

// 0 : 해당 자리에 데이터가 없으면 0을 채워서 출력
// # : 데이터가 존재하는 것까지만 출력

DecimalFormat df = new DecimalFormat("0,000,000");
System.out.println(df.format(2024)); // 0,002,024

DecimalFormat df = new DecimalFormat("#,###,###");
System.out.println(df.format(2024)); // 2,024

DecimalFormat df = new DecimalFormat("0,000,000.00");
System.out.println(df.format(2024.1234)); // 0,002,024.12

 

 

* Random

- 난수를 추출할 목적으로 만들어진 클래스.

- 사용법)

 1. 객체화) 난수의 셋이 만들어진다.

Random r = new Random(); // 랜덤
Random r = new Random(sedd); // 시드랜덤

 

 2. method 호출)

// 정수의 난수 얻기
r.nextInt() // -2147483648 ~ +2147483647 사이의 값 중 하나가 나온다.
// 범위
Math.abs(r.nextInt() % 범위)
r.nextInt(범위)

// 실수의 난수 얻기
r.nextFloat()
r.nextDouble()
// 범위
(int)(r.nextDouble()*범위)

// 불린 난수
r.nextBoolean()

 

* Enum(Enumeration) - 열거형

- 한정된 개수의 값들을 하나로 묶어서 사용할 때

- 변형된 클래스의 일종(클래스의 성격을 가짐)

- 클래스의 성격: 변수를 가짐, 생성자(private 한정), method를 가질 수 있다.

 

// 선언
접근지정자 enum 이넘명{
    값,,,,,, // 상수이므로 대문자로 기술
}

public enum Test{
    A, B, C, D
  //0, 1, 2, 3
}

// 모든 값 출력
values() method 사용 // enum 객체 안의 모든 상수가 열거형의 배열로 나온다.
for(이넘명 객체명 : 이넘명.values()){
}

for(Test t : Test.values()){
	System.out.println(t);
}

// 특정 요소 하나 얻을 때
이넘명.요소명

System.out.println(Test.A);

// 요소가 몇 번째 값인지 얻을 때
ordinal()
이넘명.요소명.ordinal()

System.out.println(Test.A.ordinal());

 

* enum 생성자(private)와 method 정의

- enum의 요소에 이름과 별개의 값을 설정할 수 있다.

접근지정자 enum 이넘명{
    요소명("이름", 값),
    요소명("이름", 값),
    요소명("이름", 값);
    
    // 이름 저장용 변수
    private final String name;
    // 값 저장용 변수
    private final int value;
    
    private 이넘명(String name, int value){
    	this.name = name;
        this.value = value;
    }
    
    public String getName(){
    	return name;
    }
    
    public int getValue(){
    	return value;
    }
}

 

- 사용법)

이넘명 객체명 = 이넘명.요소;

객체명.getName();
객체명.getValue();
728x90