본문 바로가기
국비지원/JAVA

[JAVA] 21-1. API - java.util pkg (Array, Date, Calendar, Random)

by cosmog 2022. 10. 25.
반응형
API - java.util

<java.util 패키지의 주요 클래스>

  1. Arrays
  2. Date
  3. Calendar
  4. Random
Arrays Class

주요 method인 binarySearch method

package cover;

import java.util.Arrays;

public class ArraysMain {
	
	public static void main(String[] args) {
		String[] lesserafim = {"사쿠라","김채원","허윤진","카즈하","홍은채"};
		
		//이분검색 수행 - sort를 하지 않아서 음수가 return 됨(잘못된 결과)
		int result = Arrays.binarySearch(lesserafim, "카즈하");
		System.out.println(result);
		
		//데이터 정렬
		Arrays.sort(lesserafim);
		System.out.println(Arrays.toString(lesserafim));
		result = Arrays.binarySearch(lesserafim, "카즈하");
		if(result >= 0) {
			System.out.printf("%s 는 %d 번째 존재\n", "카즈하", result);
		}else {
			System.out.printf("%s는 존재하지 않음\n", "카즈하");
		}
	}
}
  • 제어검색(정렬이 된 상태에서 검색을 수행) 중에 이분 검색을 수행해서 데이터가 존재하면 그 데이터의 위치를 리턴하고 존재하지 않으면 음수를 리턴하는 method
  • 찾는 것은 음수가 나올수 없기때문에 못찾았을 때 음수를 주게 된다

 

Fibonacci 수열
  • 첫번째와 두번째는 무조건 1 그 이후 부터는 앞의 두개 값을 더한 수가 된다.
  • ex) 1 1 2 3 5 8 13 21 34....
  • 규칙은 3번째부터 (반복문은 3번째부터이다) 처음 두개의 값은 무조건 고정.(규칙 미적용)

 

재귀를 이용한 해결 - 시간이 오래 걸리지만 이해하기는 쉬움

  • method호출하면 stack이 쌓이는데 method가 안끝난 상태에서 또 method를 호출하고 .... 나중에 계속 다시 돌아와야 하기 때문에 시간은 오래 걸림.
package cover;

public class RecursionFibonacci {
	
	//n번쨰 피보나치 수열의 값을 리턴해 주는 method
	public static int fibonacci(int n) {
		//시작 1,2번째는 1
		if(n == 1 || n == 2) {
			return 1;
		}
		//세번째 부터는 앞 두개의 합
		else {
			return fibonacci(n-1) + fibonacci(n-2);
		}
		
	}
	
	public static void main(String[] args) {
		System.out.println(fibonacci(10));
	}

}

 

재귀를 이용하지 않고 해결

package cover;

public class NoRecursionFibonacci {
	
	public static int fibonacci(int n) {
		int f1 = 1;
		int f2 = 1;
		
		int fibo = 1;
		
		for(int i = 3; i <= n; i++) {
			fibo = f1 + f2;
			f1 = f2;
			f2 = fibo;
		}
		return fibo;
	}
	
	public static void main(String[] args) {
		System.out.println(fibonacci(10));
	}
}

 

날짜 관련 Class

🔹 epoch time : 1970년 1월 1일 자정

1. java.util.Date 

  • 1970년 1월 1일 자정을 기준으로 지나온 시간을 밀리초 단위의 long타입으로 관리
  • 년도를 설정할 때는 1900년 이후 지나온 년수로 설정
  • 월을 설정할 때는 1을 빼서 설정 0부터 시작하기 때문이다.
  • toString method와 단위 별로 추출하는 method를 제공한다.

출력을 할 때는 java.text.SimpleDateFormat 클래스와 같이 사용하는 경우가 많다.

SimpleDateFormat sdf = new SimpleDateFormat("날짜서식");
sdf.format(date객체); //를 이용해서 날짜 서식이 적용된 문자열을 리턴받을 수 있다.
<date 표시에 대하여>
년도 - yy, yyyy
월 - M,MM,MMM
일 - d, dd
요일 - E, EE, EEE
시간 - H, HH
오전/오후 - a
분 - m, mm
초 - s, ss

 

Date와 SimpleDateFormat 사용

package cover;

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

public class DateCreate {
	
	public static void main(String[] args) {
		
		//현재 시간을 갖는 Date 인스턴스 생성
		Date currentTime = new Date();
		//출력 - 년월일 시분초
		System.out.println(currentTime);
		
		//원하는 날짜를 가지고 생성 1995년 2월 7일 12:45:00로 설정
		Date firstMeetingTime = new Date(95, 2-1, 7, 12, 45, 0);
		//출력 - 
		System.out.println(firstMeetingTime);
		
		//년도만 추출해서 출력
		//방법1
		System.out.printf("%tY년\n", firstMeetingTime);
		//방법2
		SimpleDateFormat sdf = new SimpleDateFormat("Y년");
		System.out.println(sdf.format(firstMeetingTime));
		//방법3
		System.out.println(firstMeetingTime.getYear()+1900+"년");
		
		//원하는 포맷으로 출력
		//1986년 5월 5일 ?요일이라고 출력
		SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy년 M월 d일 E요일");
		System.out.println(sdf2.format(firstMeetingTime));
		
	}
}


2. java.sql.Date, java.sql.Time

  • 날짜와 시간이 분리된 클래스로 관계형 DB와 연동할 때 사용할 수 있는 클래스.

3. java.util.Calender, java.util.GregorianCalender

  • 날짜 관련된 method를 가진 추상클래스(abstract class : 인스턴스를 생성할 수 없는 클래스)
  • GregorianCalender 클래스는 calendar 클래스 method를 구현한 하위 클래스이다.
인스턴스 생성
calendar calendar = new GregorianCalender();
  • 여러 종류의 생성자가 제공되서 날짜 및 시간을 설정해서 생성하는 것도 가능
  • Date 클래스에 비해서 많은 양의 정보를 제공합니다.


4. LocalDateTime

  • 최근에 DB의 날짜 및 시간 데이터에 매핑할 때 많이 이용하는 클래스
  • 월을 계산할 때 -1을 하지 않아도 된다.
  • 날짜와 시간 에디터를 많이 사용할 것 같으면 학습이 조금 필요하다.
package cover;

import java.time.LocalDateTime;
import java.util.Calendar;
import java.util.GregorianCalendar;

public class DateETC {
	
	public static void main(String[] args) {
		//날짜와 시간을 다른 형태로 사용하는 클래스
		Calendar cal = new GregorianCalendar();
		//date보다 많은 정보를 출력
		System.out.println(cal);
		
		//특정 data를 조회 - 년도 추출
		System.out.println(cal.get(Calendar.YEAR));
		
		//최근에 많이 사용하는 날짜 타입 LocalDateTime
		LocalDateTime ldt = LocalDateTime.of(2022, 10, 27, 18, 50);
		System.out.println(ldt);
	}

}


💡 날짜와 시간에서 조금 더 학습해 볼만한 내용
calendar 클래스나 LocalDateTime 클래스에서 시간의 연산 부분(특히 뺄셈)
calendar 클래스나 LocalDateTime 클래스에서 지역이나 시간대 설정하는 부분

 

Random Class
  • random class : seed를 만든후 seed에서 숫자를 하나씩 추출하는 클래스
  • random 생성자 seed 를 현재 시간에 생성 : 어느정도 랜덤 보장
  • random(long seed) : seed 를 고정 랜덤이 아니고 일정한 패턴의 숫자를 가져온다.
data를 추출하는 method
next 자료형
next(int n) 0부터 n 보다 자은 수 까지 범위에서 추출하는
UUID
랜덤한 문자열을 만들어주는 클래스
UUID.randomUUID().toString() 을 이용해서 랜덤한 문자열을 만들어준다.
고유한 식별자를 생성할 때 주로 사용한다.

 

seed를 사용하는 경우와 그렇지 않은 경우를 구분하고 배열 안에서 랜덤한 요소를 추출해보고 UUID를 생성

package cover;

import java.util.Random;
import java.util.UUID;

public class RandomTest {
	
	public static void main(String[] args) {
		
		//seed를 사용하지 않는 경우와 사용하는 경우의 차이
		//여러번 실행해보고 확인
		/* java 에서는 seed를 설정하지 않으면 seed가 랜덤 */
		Random r = new Random();
		System.out.println(r.nextInt());
		
		//seed를 사용하면 랜덤값이 고정
		/* seed를 설정하면 고정된 패턴의 숫자가 리턴 */
		r = new Random(42);
		System.out.println(r.nextInt());
		
		r = new Random();
		String[] ar = {"오미크론", "오미크론", "오미크론", "다크스펙터", "다크스펙터", "라투"};
		for(int i = 0; i<10; i++) {
			System.out.println(ar[r.nextInt(ar.length)]);
		}
		
		//랜덤한 문자열 추출
		System.out.println(UUID.randomUUID().toString());
	}

}

 

반응형