티스토리 뷰

Chapter 10. 기본 API 클래스 알아보기

 

▶ 학습 목표

: API가 무엇인지 알고 기본적으로 제공하는 클래스를 적절하게 사용할 수 있다.

 

 

 

 

 

 

10-9. formatting

: 데이터를 일정한 형식으로 통일되게 형식을 지정해 주는 것

데이터를 동일한 형식으로 통일하여 보이기 때문에 보기가 편하다.

 

 

 

- DecimalFormat

 

: DecimalFormat 클래스는 숫자를 형식화하는 클래스이다.

많은 데이터를 사용시 형식이 제각각이면 불편하기 때문에 편하게 읽기 위해 패턴을 지정한다.

 

 

# 있으면 출력 , 콤마 넣음
0 없으면 0으로 채움 E 지수 기호
. 소수점 % 100곱하고 퍼센트 붙여서 출력
- 음수 기호를 붙임    

 

 

 

package chapter10;

import java.text.DecimalFormat;

public class format1 {

	public static void main(String[] args) {
		String[] pattern = { //문자열 데이터타입의 패턴이름을 가진 배열
				"###.###","000.000","-###.###","000000.00%"
		};
		
		double[] arr = {1.3, 3.33, 124.243, 242};
		
		
		for(int p=0; p<pattern.length; p++) {
			DecimalFormat d = new DecimalFormat(pattern[p]);
			System.out.println("<<<<<"+pattern[p]+">>>>>");
			for(int i=0; i<arr.length; i++) {
				System.out.println(d.format(arr[i]));
			}
		}

	}

}

 

출력

<<<<<###.###>>>>>
1.3
3.33
124.243
242
<<<<<000.000>>>>>
001.300
003.330
124.243
242.000
<<<<<-###.###>>>>>
-1.3
-3.33
-124.243
-242
<<<<<000000.00%>>>>>
000130.00%
000333.00%
012424.30%
024200.00%

 

 

 

 

 

 

- SimpleDateFormat

 

: 날짜를 형식화 하는 클래스이다.

Date와 Calendar에 있는 출력 이외 원하는 형태로 출력하기 위해서 사용한다.

 

 

y a 오전/오후
M H 시간
d m
E 요일 s

 

 

 

SimpleDateFormat을 사용 시 원하는 패턴을 파라미터로 인스턴스를 생성한 후 format 메서드를 사용한다.

 

 

package chapter10;

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

public class format2 {

	public static void main(String[] args) 
	{
		Date day = new Date();
		String patternKorea = "yyyy-MM-dd";
		String patternUSA = "MM-dd-yyyy";
		String patternUK = "dd-MM-yyyy";
		String pattern1 = "E요일 HH시 mm분 ss초";
		
		SimpleDateFormat p1 = new SimpleDateFormat(patternKorea);
		SimpleDateFormat p2 = new SimpleDateFormat(patternUSA);
		SimpleDateFormat p3 = new SimpleDateFormat(patternUK);
		SimpleDateFormat p4 = new SimpleDateFormat(pattern1);
		
		System.out.println("현재 날짜"+day);
		System.out.println("한국 형식(년,월,일) : "+p1.format(day)); 
        //p1안의 format함수(p1이참조변수? 그럼format은 인스턴스메서드?)
		System.out.println("미국 형식(월,일,년) : "+p2.format(day));
		System.out.println("영국 형식(일,월,년) : "+p3.format(day));
		System.out.println(p4.format(day));
		

	}

}

 

현재 날짜Fri Oct 27 12:34:02 KST 2023
한국 형식(년,월,일) : 2023-10-27
미국 형식(월,일,년) : 10-27-2023
영국 형식(일,월,년) : 27-10-2023
금요일 12시 34분 02초

 

 

 

 

 

 

10-10. Object 클래스

 

: 클래스는 모든 클래스의 부모 클래스이다.

자바의 모든 클래스는 따로 표기가 되어 있지 않아도 Object 클래스를 상속 받는다.

상속 받기 때문에 Object 클래스의 멤버를 사용할 수 있다.

 

 

 

protected Object clone() 객체의 복사본을 반환한다.
boolean equals(Object obj) obj와 같은 객체인지 아닌지 boolean 값으로 반환한다.
protected void finalize)_ 객체가 소멸할 때 호출된다
Class<?> getClass() 클래스의 정보를 담고 있는 'Class' 객체를 반환한다.
int hashcode() 해시코드를 반환한다.
void notify() 대기 중인 하나의 스레드를 깨운다.
void notifyAll() 대기 중인 모든 스레드를 깨운다.
String toString() 객체의 정보를 문자열로 반환한다.
void wait() 현재의 스레드를 멈추고 대기한다
void wait(long timeout) timeout만큼 스레드를 멈추고 대기한다.
void wiat(long timeout, int nanos) 실제로 일어난 시간만큼 스레드를 멈추고 대기한다.

 

 

 

 

 

10-11. java.time 패키지

 

: 날짜와 시간을 다루기 위한 패키지이다.

 

java.time의 하위 패키지로는 java.time(날짜와 시간), java.time.format(날짜와 시간을 파싱하고 포맷팅), java.time.chrono(달력 시스템 사용가능), java.time.temporal(날짜와 시간을 연산하기 위한 api포함), java.tiem.zone(타임존 지원-한국은 +9) 이 있다.

java.time 패키지는 날짜를 나타내는 LocalDate와 시간을 나타내는 LocalTime 등을 포함한다.

 

클래스들은 불변하는(immutable) 속성이 있기 때문에 날짜나 시간을 변경하게 되면 실제로는 변경하는 것이 아니라 새로운 객체를 반환한다.

 

 

 

- time 패키지의 시간과 날짜 클래스 종류

 

- LocalDate 클래스

 

 : 날짜 정보를 저장하는 클래스이다.

저장하는 방법에는 now()와 of() 두가지가 있다.

now()에는 현재 날짜를 지정하는 것이고 of()는 파라미터 자리에 특정 값을 넣어 틀정 날짜를 지정하는 메서드이다. 

 

LocalDate ld = LocalDate.now();
LocalDate mld = LocalDate.of(int year, int month, int dayOfMonth);

* of()는 세팅해서 받음 

* 싱글턴 패턴이랑 비슷 

* 싱글턴도 두가지 방법이 있음 

 

싱글턴 첫번째 방법 예시

class A
static A tmp = new A();
static A getInstance(){
	resturn tmp;
}

싱글턴 두번째 방법 예시

static A getInstance()
{
	return new A(파라미터값);
}

 

 

 

 

 

- Localtime 클래스

 

: 시간 정보를 저장하는 클래스이다.

date와 동일하게 now() 쓰는 방식과 of() 메서드를 쓰는 방식이 있다.

 

LocalTime lt = LocalTime.now();
LocalTime mlt = LocalTime.of(int hour, int minute, int second, int nanoOfSecond);

 

of() 메서드는 파라미터의 개수나 종류에 따라 다양하게 사용할 수 있다. (=오버로딩)

of(int hour, int minute);
of(int hour, int minute, int second);
of(int hour, int minute, int second, int nanoOfSecond);

 

 

 

 

 

- LocalDate Time 클래스

 

: LocalDate 클래스와 LocalTime 클래스를 결합한 클래스이다.

날짜 정보와 시간 정보 모두 저장하므로 날짜와 시간 정보 모두 사용하고 싶을 때 사용가능하다.

이것 또한 앞서 본 클래스와 동일하게 now() 방법과 of() 방법이 있다.

 

LocalDateTime ldt = LocalDateTime.now();
LocalDateTime mldt = LocalDateTime.of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond);

 

 

 

- ZonedDateTime 클래스

 

: 타임존에 따라 날짜와 시간을 저장하는 클래스이다.

협정세계시(UTC)와 차이 나는 시간(존 오프셋)이 따로 저장된다.

 

ZoneDateTime 클래스는 now() 메서드 뒤에 ZoneID를 매개 값으로 넘겨야한다.

ZonedDateTime zdt = ZonedDateTime.now(Zoneld.of("UTC");

 

 

 

 

- Instant

 

: 특정 시점의 타임스탬프 객체이다.

1970년 1우러 1일(millisecond)부터 현재까지의 시간을 세는 객체로 사람이 아닌 Machine time에 유리하다.

Instant i1 = Instant.now();

 

 

 

 

 

 

- 클래스들의 정보 값 읽어보기

 

- LocalDate/LocalTime

 

: 이전에 학습했던 Calendar이 일요일 = 1 월요일 = 2 으로 표현했지만

LocalDate와 LocalTime 에서는 월요일이 1 화요일이 2와 같이 표현하고 월도 정상적으로 출력된다.

 

 

LocalDate int getYear() 년도
Month (=클래스주소) getMonth() Month의 열거값
int getMonthValue()
int getDayOfYear() 1년의 몇 번째 일
int getDayOfMonth() 월의 몇번째 일
DayOfWeek getDayOfWeek() 요일
boolea isLeapYEar() 윤년여부
LocalTime int getHour()  시간
int getMinute()
int getSecond()
int getNano() 나노초

 

 

 

 

 

- 클래스들의 정보 더하기/빼기

 

: 클래스는 필드(전역변수) 값을 변경하기 위한 메서드들을 가지고 있다.

 

 

클래스들의 정보를 연산하기 위한 메서드 종류

minusYears(long) 년도 빼기 plusWeeks(long) 주 더하기
minusMonths(long) 월 빼기 minusHours(long) 시간 빼기
minusDays(long) 일 빼기 minusMinutes(long) 분 빼기
minusWeeks(long) 주 빼기 minusSeconds(long) 초 빼기
plusYears(long) 년도 더하기 minusNanos(long) 나노초 빼기
plusMonths(long) 월 더하기 plusHours(long) 시간 더하기
plusDays(long) 일 더하기 plusMinutes(long) 분 더하기

 

 

 

ex)  날짜를 더하고 빼는 메서드 

package chapter10;

import java.time.LocalDate;

public class Timeplus {

	public static void main(String[] args) {
		LocalDate ld = LocalDate.now();
		System.out.println(ld);
		LocalDate ld2=ld
				.minusYears(2)
				.plusMonths(3)
				.minusDays(4);
		System.out.println(ld2);
		
		
		LocalDate ld3 = ld2.minusDays(3);
		System.out.println(ld3);
		
		
		LocalDate ld4=ld3.plusWeeks(3);
		System.out.println(ld4);
		

	}

}

 

2023-10-27
2022-01-23
2022-01-20
2022-02-10

 

 

 

 

 

 

ex) 시간을 더하고 빼는 메서드

 

package chapter10;
import java.time.LocalDateTime;

public class Timeplus2 {

	public static void main(String[] args) {
		LocalDateTime ld=LocalDateTime.now();
		System.out.println("현재 시간 : "+ld);
		LocalDateTime ld2 =ld
				.minusHours(5)
				.plusMinutes(30)
				.minusSeconds(4); 
		//ld의 변수 minus plus minus해라 체이닝 변수 변경하고 ld에 덮어씀(return있으면 안됨)
		/*ld=ld.minusHours(5)
		 * ld=ld.plusMinutes(3)
		 * ld=ld.minusSeconds(4) 와 같이 보면 된다.*/
		
		System.out.println("변경 시간 : "+ld2);
		LocalDateTime ld3 = ld2.minusHours(24);
		System.out.println("자동 변환 시간 : "+ld3);
				
				

	}

}

 

현재 시간 : 2023-10-27T15:33:14.713963900
변경 시간 : 2023-10-27T11:03:10.713963900
자동 변환 시간 : 2023-10-26T11:03:10.713963900

 

 

 

 

 

 

- 클래스들의 정보(전역변수) 값 변경하기

 

: 각 클래스에는 필드(전역변수)값들을 특정 값으로 변경할 수 있는 메서드들이 존재한다.

 

 

특정 값으로 변경할 수 있는 메서드 종류

 

withYear(int) 년 변경 withHour(int) 시간 변경
withMonth(int) 월 변경 withMinute(int) 분 변경
withDayOfMonth(int) 월의 일 변경 withSecond(int) 초 변경
withDayOfYear(int) 년의 일 변경
(그 해의 int번째 일)
withNano(int) 나노초 변경

 

 

 

ex)  클래스의 값 (날짜)변경하기 예시

package chapter10;

import java.time.LocalDate;

public class Withprac {

	public static void main(String[] args) {
		LocalDate ld = LocalDate.now();  //날짜 데이터를 ld에 set해줌
		System.out.println(ld);  //날짜 데이터 출력(toString 포함된 클래스라 연속되서 나옴)
		LocalDate new_ld = ld.withYear(1999)
				.withDayOfYear(23)
				.withMonth(8);
				
				
		System.out.println(new_ld);

	}

}

 

2023-10-27
1999-08-23

 

 

 

ex) 시간 변경하는 예시

package chapter10;

import java.time.LocalTime;

public class Withprac2 {

	public static void main(String[] args) {
		LocalTime lt = LocalTime.now();
		System.out.println(lt);
		
		LocalTime new_time = lt.withHour(3)
				.withMinute(25)
				.withSecond(24)
				.withNano(33333);
		System.out.println(new_time);

	}

}

 

15:43:40.456322500
03:25:24.000033333

 

 

firstDayOfYear() 년도의 첫 번째 일
lastDayOfYear() 년도의 마지막 일
firstDayOfMonth() 달의 첫 번째 일
lastDayOfMonth() 달의 마지막 일
firstInMonth(DayOfWeek.dayOfWeek) 달의 첫번째 요일
lastInMonth(DayOfWeek.dayOfWeek) 달의 마지막 요일
next(DayOfWeek.dayOfWeek) 돌아오는 요일
NextOrSame(DayOfWeek.dayOfWeek) 오늘을 포함한 돌아오는 요일
previous(DayOfWeek.dayOfWeek) 지난 요일
previousOrSame(DayOfWeek.dayOfWeek) 오늘을 포함한 지난 요일

 

 

 

ex) with 메서드 사용 예시

 

package chapter10;

import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.time.temporal.TemporalAdjusters;

public class Temporalprac {

	public static void main(String[] args) {
		LocalDateTime ldt = LocalDateTime.now();  //ldt참조변수에 LocalDateTime.now() 담음
		System.out.println(ldt); //현재날짜 시간 출력
		LocalDateTime new_ldt; //참조변수
		
		
		new_ldt=ldt.with(TemporalAdjusters.firstDayOfYear());
		System.out.println("올해의 첫 번째 날" +new_ldt);
		new_ldt=ldt.with(TemporalAdjusters.lastDayOfYear());
		System.out.println("올해의 마지막 날"+new_ldt);
		
		new_ldt=ldt.with(TemporalAdjusters.firstDayOfMonth());
		System.out.println("이번 달의 첫번째 날"+new_ldt);
		new_ldt=ldt.with(TemporalAdjusters.lastDayOfMonth());
		System.out.println("이번달의 마지막 날"+new_ldt);
		
		new_ldt=ldt.with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY));
		System.out.println("이번달의 첫 월요일"+new_ldt);
		new_ldt=ldt.with(TemporalAdjusters.lastInMonth(DayOfWeek.SUNDAY));
		System.out.println("이번달의 마지막 일요일"+new_ldt);
		new_ldt=ldt.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
		System.out.println("돌아오는 금요일"+new_ldt);
		new_ldt=ldt.with(TemporalAdjusters.nextOrSame(DayOfWeek.FRIDAY));
		System.out.println("오늘을 포함한 다음 금요일"+new_ldt);
		new_ldt=ldt.with(TemporalAdjusters.previous(DayOfWeek.MONDAY));
		System.out.println("지난 월요일"+new_ldt);
		new_ldt=ldt.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
		System.out.println("오늘을 포함한 지난 월요일"+new_ldt);

	}

}

 

출력

 

2023-10-27T15:50:18.148587500
올해의 첫 번째 날2023-01-01T15:50:18.148587500
올해의 마지막 날2023-12-31T15:50:18.148587500
이번 달의 첫번째 날2023-10-01T15:50:18.148587500
이번달의 마지막 날2023-10-31T15:50:18.148587500
이번달의 첫 월요일2023-10-02T15:50:18.148587500
이번달의 마지막 일요일2023-10-29T15:50:18.148587500
돌아오는 금요일2023-11-03T15:50:18.148587500
오늘을 포함한 다음 금요일2023-10-27T15:50:18.148587500
지난 월요일2023-10-23T15:50:18.148587500
오늘을 포함한 지난 월요일2023-10-23T15:50:18.148587500

 

 

 

 

 

- 클래스들의 정보 값 비교하기

 

: time 패키지에서는 각 필드 값을 비교하는 메서드를 사용한다.

 

isAfter() 이전의 날짜인지 비교하여 boolean값 반환
isBefore() 지나간 날짜인지 비교하여 boolean값 반환
isEqual() 동일 날짜인지 비교하여 boolean값 반환
until() 날짜나 시간의 차이를 반환
between() 전체 날짜나 시간의 차이를 반환

 

* 앞에 is가 붙은 함수는 리턴 값이 논리 값으로 true 나 false를 반환한다.

 

 

 

ex) 날짜 변경 예시

 

package chapter10;

import java.time.LocalDateTime;

public class After1 {

	public static void main(String[] args) {
		LocalDateTime ldt1 = LocalDateTime.of(2010,1,1,12,23,23,444);
		System.out.println(ldt1);
		LocalDateTime ldt2 = LocalDateTime.of(2010,12,25,1,12,2,232);
		System.out.println(ldt2);
		
		System.out.println(ldt1.isAfter(ldt2));
		System.out.println(ldt1.isBefore(ldt2));
		System.out.println(ldt1.isEqual(ldt2));

	}

}

 

2010-01-01T12:23:23.000000444
2010-12-25T01:12:02.000000232
false
true
false

 

 

 

 

 

ex) 메서드 호출하는 참조변수와 인자로 들어가는 참조변수간의 날짜 비교를 통해 논리값 반환

 

package chapter10;

import java.time.LocalDateTime;

public class After2 
{

	public static void main(String[] args) 
	{
		LocalDateTime ldt = LocalDateTime.now();
		System.out.println(ldt);  //현재시간 출력
		
		LocalDateTime end_time=LocalDateTime.of(2027,6,24,12,00);
		System.out.println(end_time);
		
		if(ldt.isAfter(end_time)) 
		{
			System.out.println("유통기한이 지났습니다!");	
		}
		else 
		{
			System.out.println("유통기한이 아직 지나지 않았습니다!");
		}

	}

}

 

출력

 

2023-10-27T15:54:39.481244900
2027-06-24T12:00
유통기한이 아직 지나지 않았습니다!
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday