Java 제네릭(Generic) 타입 




- Java API Document를 보면 많은 제네릭 타입을 사용하고 있으므로 이를 이해하고 있어야만 정확히 이해하고, 사용할 수 있다.

https://docs.oracle.com/javase/8/docs/api/



- 제네릭 타입은 "<>" 부호를 사용하며 타입을 인수로 받을 수 있도록 한다.



- 제네릭 타입을 사용함으로써 타입 검사를 강화함으로써 에러를 줄일 수 있다.

또한, 캐스팅(타입 변환)을 없애주므로 성능을 향상시킬 수 있다.






결과

결과





코드

package pk;

public class Test<T, S> {
	T num;
	S[] count;
	
	public Test(T n, int size) {
		this.num = n;
		this.count = (S[]) new Object[size];
	}
	
	void getC() {
		System.out.print(num + ". ");
		for(S i : count) {
			System.out.print(i + " ");
		}
		System.out.println();
	}

	public static void main(String[] args) {
		Test<Integer, String> t = new Test<Integer, String>(1, 3);
		Test<Integer, Integer> t2 = new Test<>(3, 4);
		t.getC();
		t2.getC();
	}

}



- 제네릭 타입은 클래스<T, S> 이렇게 쓰곤 한다. (보통 대문자로 표기한다.)


- 제네릭 타입은 멤버 변수 타입을 지정하거나 메소드 리턴형을 지정할 때나 다 사용할 수 있다.


- 21라인 : int형을 지정하고자 하면 Integer를 사용해야 한다.


- 9라인 : 제네릭 타입 배열을 초기화 해줄 때는 Object 객체형으로 생성한 후 강제 형변환으로 변환해주어야 한다.

(Object는 모든 객체의 최상위 부모이다.)


- 22라인 : 뒤쪽을 보면 21라인과 달리 "<>" 속 값을 생략할 수도 있다.






제네릭 타입 제한


- 제네릭 타입<?> : 모든 클래스나 인터페이스가 올 수 있다.



- 제네릭 타입<? extends 클래스> : 상위 클래스 제한

해당 클래스 및 해당 클래스의 자식 클래스만이 올 수 있다.



- 제네릭 타입<? super 하위타입> : 하위 클래스 제한

해당 클래스 및 해당 클래스의 부모 클래스만이 올 수 있다.







Java 시간 차 구하기 ChronoUnit





결과

결과





코드

public static void main(String[] args) {
		LocalDateTime temp = LocalDateTime.of(2019, 1, 1, 13, 0, 0);
		LocalDateTime target = LocalDateTime.of(2020, 3, 1, 14, 0, 0);
		System.out.println("오늘 날짜와 시간 : " + temp);
		System.out.println("목표 날짜와 시간 : " + target);
		
		// temp가 target보다 이후이다.
		if(!temp.isAfter(target)) 
			System.out.println("temp가 target보다 이후이다.(거짓)");
		// temp가 target보다 이전이다.
		if(temp.isBefore(target)) 
			System.out.println("올바른 시간을 입력하였습니다.\n");
		
		
		System.out.println("남은 년 : " + ChronoUnit.YEARS.between(temp, target));
		System.out.println("남은 월 : " + ChronoUnit.MONTHS.between(temp, target));
		System.out.println("남은 일 : " + ChronoUnit.DAYS.between(temp, target));
		System.out.println("남은 시 : " + ChronoUnit.HOURS.between(temp, target));
		System.out.println("남은 분 : " + ChronoUnit.MINUTES.between(temp, target));
		System.out.println("남은 초 : " + ChronoUnit.SECONDS.between(temp, target));
		
	}





isAfter() : 이후 날짜인지 검사

- A.inAfter(B) : A가 B 이후이면 True 이다.


- 계획 일정이나, 목표같은 날짜를 입력받을 때 옳바른 값을 입력하였는지 검사할 수 있다.





isBefore() : 이전 날짜인지 검사

- A.inBefore(B) : A가 B 이전이면 True 이다.


- 계획 일정이나, 목표같은 날짜를 입력받을 때 옳바른 값을 입력하였는지 검사할 수 있다.





ChronoUnit.YEARS.between(temp, target) : (년) 차이를 구함

- temp와 target 년 차이를 구한다.


- YEARS뿐만 아니라 MONTHS, DAYS, HOURS 를 사용하여서 날짜나 시간 차이도 구할 수 있다.









Java 날짜와 시간 얻기 

LocalDate, LocalTime 

LocalDateTime, ZonedDateTime





결과

결과






코드

public static void main(String[] args) {
		// 1. 날짜만 저장
		LocalDate ld = LocalDate.now();
		LocalDate ld2 = LocalDate.of(2022, 2, 15);
		System.out.println("오늘 날짜 : " + ld);
		System.out.println("만든 날짜 : " + ld2);
		
		// 2. 시간만 저장
		LocalTime lt = LocalTime.now();
		LocalTime lt2 = LocalTime.of(14, 29, 30);
		System.out.println("지금 시간 : " + lt);
		System.out.println("만든 시간 : " + lt2);
		
		//3. 1번+2번 = 날짜+시간
		LocalDateTime ldt = LocalDateTime.now();
		System.out.println("오늘 날짜와 현재 시간 : " + ldt);
		
		// 4. TimeZone(타임존)의 날짜와 시간을 저장하며 타임존에 대한 정보까지
		ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("Asia/Seoul"));
		ZonedDateTime zdt2 = ZonedDateTime.now(ZoneId.of("America/Los_Angeles"));
		System.out.println("서울 타임존 : " + zdt);
		System.out.println("LA 타임존 : " + zdt2);
	}





자바 8부터 추가되었고 기존의 사용하던 Date와 Calendar의 불편함을 보완하기 위하여 추가되었다.



LocalDate : 날짜만 저장 가능

- now() 메소드를 사용하면 오늘 날짜의 정보를 가져온다.


- LocalDate.of()를 사용하여서 직접 날짜를 지정해 줄 수 있다.


- 메소드

메소드

설명

getYear()

년도

getMonthValue()

getDayOfMonth()

getDayOfWeek()

요일 (영어로 리턴)

isLeapYear()

윤년 검사

minusMonths(long n)

월 빼기

plusWeeks(long n)

주 더하기

withDayOfMonth(int n)

일 변경 

->  plus, minus 로 년, 월, 일, 주 등을 더해고 뺄 수 있다.

-> with를 사용하면 지정한 값으로 년, 일, 월을 변경할 수 있다.






LocalTime : 시간만 저장 가능

- LocalDate와 유사하다. (날짜 대신 시간)


- LocalDate와 마찬가지로 now() 사용하여서 현재 시간을 가져올 수도 있으며 of() 메소드를 사용하여서 직접 시간을 지정해 줄 수 있다.


- 메소드

메소드

설명

getHour()

시간

getMinute()

getSecond()

plusMinutes(long n)

분 더하기

minusHours(long n)

시 빼기

withMinute(int n)

분 변경 

-> plus, minus로 시간, 분, 초를 더하거나 빼줄 수 있다.

-> with를 사용하여서 값을 변경할 수도 있다.





LocalDateTime : 날짜와 시간을 저장

- 이름에서 짐작할 수 있듯이 LocalDate + LocalTime 이다.


- 날짜와 시간 둘다 저장할 수 있으며 now()나 of()로 값을 줄 수 있다.


- 결과를 보면 맨 뒤 '.'하고 쓸때없이 긴 숫자가 이어져 있다. 이는 나노초를 나타내며 이를 표시않기 위해서는 오버라이딩하여 재정의해야한다.





ZonedDateTime : 타임존과 날짜 시간 저장

- Timezone(타임존)의 따른 날짜와 시간을 저장한다.


- 위 코드에서는 Seoul이나 LA를 예로 들었다.


- Zone ID의 관하여서는 

https://docs.oracle.com/javase/8/docs/api/java/time/ZoneId.html

해당 페이지를 참고하면 된다.








'JAVA > 심화' 카테고리의 다른 글

Java 제네릭(Generic) 타입  (0) 2020.04.01
Java 시간 차 구하기 ChronoUnit  (0) 2020.03.28
Java Pattern 문자열 검증하기  (0) 2020.03.27
Java 배열 Arrays 클래스  (0) 2020.03.26
Java DecimalFormat 천단위마다 쉼표 입력  (0) 2020.03.26

Java Pattern 문자열 검증하기





결과

결과





코드

public static void main(String[] args) {
		String sec1 = "(010|02)-\\d{3,4}-\\d{4}";
		String phone = "010-1234-5678";
		
		if(Pattern.matches(sec1, phone)) {
			System.out.println("전화번호가 양식에 맞습니다.");
		}
		else {
			System.out.println("전화번호가 양식에 맞지 않습니다.");
		}
		
		String sec2 = "\\w+@\\w+\\.\\w+";
		String sec3 = "\\w+@\\w+\\.\\w+(\\.\\w+)?";
		String email = "abcde@abcde.co.kr";
		
		
		System.out.println("이메일이 양식에 " + (Pattern.matches(sec2, email) ? "맞습니다." : "맞지 않습니다.") );
		System.out.println("이메일이 양식에 " + (Pattern.matches(sec3, email) ? "맞습니다." : "맞지 않습니다.") );
		
	}





Pattern 클래스 : 문자열 검증

- 이메일이나 전화번호 등 특정 형식(양식)이 정해져있는 값을 입력 받았을 때 올바른 양식대로 값을 입력하였는지 확인하기 위하여 사용한다.


- java.util.regex.Pattern 을 import 한다.


- Pattern 클래스의 matches 메소드의 표현식과 검증할 문자열을 주어 검사한다.



- 정규 표현식 기호들

 기호

의미 

\d

한 개의 숫자

\w

한 개의 영어 또는 수잦

\s

공백

[a-z]

a~z 중 한개의 문자

ex) [0-9] : 0~9 중 한 개

?

없거나 또는 한 개

*

없거나 또는 한 개 이상

+

한개 이상

( )

수식처럼 묶기

|

파이프 문자(OR)

{ }

{n} : 정확히 n개만 있다.

{n,} : 최소 n개는 있다.

{n, m} : n개 이상 m개 이하이다.



- 정규 표현식 기호를 사용하여 정규 표현식을 만들 때 이는 문자열이므로 문자열 안에서 \를 표현하기 위하여 '\\' 처럼 2번을 써주어야 한다.

'.'을 사용해 줄 때도 '\.' 처럼 작성해주어야 한다.



- 괄호로 묶은 다음 ? 를 준다면 괄호 내의 내용이 없거나 한개 라는 의미이다.

위 결과를 보면 검사할 이메일의 형식이 '.co.kr' 으로 2번의 '.'과 문자들이 사용된다.

따라서 ( )와 ?를 사용하여 맨 뒤에 '.kr' 처럼 '.'이 한번더 사용하여도 검사의 통과되도록 할 수 있다.





Java 배열 Arrays 클래스





결과

결과





코드

public static void main(String[] args) {
		int[] arr1 = {4, 2 , 5, 1, 3};
		char[] arr2 = {'C', 'A', 'b', 'a', 'c' };
		String[] arr3 = {"afd", "gdr", "abg", "bcg", "zfg" }; 
		String[] arr4 = Arrays.copyOf(arr3, arr3.length);
		
		Arrays.sort(arr1);
		for(int i=arr1.length-1;  i>=0; i--)
			System.out.print(arr1[i] + ", ");
		System.out.print("\n");

		Arrays.sort(arr2);
		for(int i=0; i<arr2.length; i++)
			System.out.print(arr2[i] + ", ");
		System.out.print("\n");
		
		Arrays.sort(arr3);
		for(int i=0; i<arr3.length; i++)
			System.out.print(arr3[i] + ", ");
		
	}





Arrays.copyOf(배열, 배열 길이) : 배열 복사

- 배열을 깊은 복사한다.





Arrays.sort() : 배열을 오름차순으로 정렬한다.

- 내림차순은 간단하게 정렬을 한 후 뒤에서부터 참조하면 된다.


- 클래스 배열을 정렬하고자 하면 compareTo 메소드를 Override 해서 정렬할 값을 지정해주면 된다.







Java DecimalFormat 천단위마다 쉼표 입력





결과

결과





코드

public static void main(String[] args) {
		double num;
		
		num = 1234.5678;
		DecimalFormat df = new DecimalFormat("#.##");
		System.out.println("소수점 아래 2째자리까지(반올림) : " + df.format(num));
		
		num = 12345678;
		df = new DecimalFormat("#,###");
		System.out.println("천단위로 쉼표 : " + df.format(num));
		
		num = -1234567;
		df = new DecimalFormat("+#,###; -#,###");
		System.out.println("마이너스 표시 : " + df.format(num));
		num = 1234567;
		System.out.println("플러스 표시 : " + df.format(num));
		
		df = new DecimalFormat("\u0024 #,###");
		System.out.println("달러 표시 : " + df.format(num));
		
		num = 0.2591;
		df = new DecimalFormat("#.# %");
		System.out.println("퍼센트 표시 : " + df.format(num));
	}





DecimalFormat() : 숫자 표현 클래스

- 날짜를 표시할 때 SimpleDateFormat을 사용하여 포맷팅해주는 것처럼 DecimalFormat은 숫자를 표현할 때 포맷팅할 수 있다.


- 예를 들어 천 단위마다 ","를 사용하여 구분하고자 할 때 사용할 수 있다.


-> # : 10진수 표현, 결과에서 볼 수 있듯이 소수점 아래에서 표현 범위가 넘어갈 때는 반올림하여 표현해준다. 반면 정수 부분은 다 표현된다. 

따라서 천 단위 ","로 구분해주기 위하여는 "#,###" 처럼 작성하면 된다.


-> ; : +와 -를 같이 표현해줄 경우 구분자로 쓸 수 있다.


-> \u0024 : 달러를 표현해주기 위하여 달러문자의 유니코드 입력해준다.


-> % : 100 곱한 후 %를 붙여준다. "#.#" 으로 소수점 아래는 한자리만 표현하였으므로 소수점 아래 2째자리에서 반올림하여 표시된다.







Java Date, Calendar, SimpleDateFormat 시간 구하기





결과

결과





코드

public static void main(String[] args) {
		Date date = new Date();
		System.out.println("시간 확인 : " + date.toString());
		
		SimpleDateFormat sf = new SimpleDateFormat("yy-MM-dd, hh:mm:ss, E요일, 올해D일째");
		System.out.println("시간 확인(포맷팅) : " + sf.format(date) + "\n");
		
		Calendar cal = Calendar.getInstance();
		int year = cal.get(Calendar.YEAR);		// 년도
		int month = cal.get(Calendar.MONTH) + 1;	// 월 0~11
		int day = cal.get(Calendar.DAY_OF_MONTH);	// 일
		int yoil = cal.get(Calendar.DAY_OF_WEEK);	// 요일
		int hour = cal.get(Calendar.HOUR_OF_DAY);	// 시 0~23
		int min = cal.get(Calendar.MINUTE);	// 분
		int sec = cal.get(Calendar.SECOND);	// 초
		String[] yo = {"일", "월", "화", "수", "목", "금", "토"};
		// Calendar.SUNDAY : 1 ~ Calendar.SATURDAY : 7
		
		System.out.println("Cal 얻은 값 : " + year + "년" + month + "월" + day + "일 " +
		yo[yoil-1] + "요일 " + hour + "시" + min + "분" + sec + "초");
	}





Date : 날짜 표현 클래스

- 생성자가 여러개 있지만 대부분 비권장(Deprecated) 되어 사용 않는다.


- Date()를 생성하면 컴퓨터의 현재 날짜를 읽어 Date 객체를 생성한다.


- toString() 메소드를 사용하면 날짜를 문자열로 얻을 수 있다.


- 문자열을 특정한 포맷으로 얻고자 한다면 SimpleDateFormat을 사용한다.





SimpleDateFormat : 날짜 포맷 클래스

- 특정 포맷 문자열로 Date 객체의 날짜와 시간을 얻고자할 때 사용한다.


- 문자열 포맷은 SimpleDateFormat 객체를 생성할 때 생성자에서 지정해주며 포맷 기호들을 사용하여서 작성한다.


문자

설명

문자

설명

y

년도

M

d

D

올해 기준 일

H

시(0~23)

h

시(1~12)

k

시(1~24)

K

시(0~11)

m

s

E

요일

a

오전 / 오후

W

이번달 몇 번째 주

w

올해 몇 번째 주





Calendar : 이름처럼 달력을 표현하는 클래스

- 지역이나 나라마다 날짜를 계산하는 방법이 다르므로 Calendar는 인스턴스를 생성할 수 없도록 추상 클래스로되어 있다.


- Calendar cal = Calendar.getInstance(); 로 한다면 현재 OS의 설정된 시간을 갖는 객체를 얻을 수 있다.


- Calendar.MONTH 는 리턴값이 0~11로서 0부터 시작하므로 결과의 1을 더해주어야 원하는 값을 얻을 수 있다.


- Calendar.DAY_OF_WEEK는 요일을 얻을 수 있으며 리턴형은 int이다. 

값을 확인해보면 Calendar.SUNDAY : 1 ~ Calendar.SATURDAY : 7 이다.

따라서 위 코드에서는 요일을 갖는 문자열 배열을 만들어 간단하게 표현하였다.


- Calendar.HOUR = 0~11 이며 Calendar.HOUR_OF_DAY = 0~23 이므로 HOUR을 사용하고자 한다면 따로 AM/PM을 표시해주어야 한다.







Java max, min, random - 랜덤 수 구하기




결과

결과





코드

public static void main(String[] args) {
		int a = 5, b = 3;
		double x = 4.52, y= 3.45;
		System.out.println("a와b 중 큰 값 : " + Math.max(a, b) );
		System.out.println("x와y 중 작은 값 : " + Math.min(x, y) +"\n" );
		
		for(int i=0; i<6; i++) {
			System.out.println("1~6 랜덤 값 : " + ((int) (Math.random()*6) + 1 )  );
		}
	
	}





Math 메소드


int max(int a, int b) | double max(double x, double y) : 큰 값 구하기

- 인자로 받은 2개의 값을 비교하여 더 큰값을 리턴해준다.





int min(int a, int b) | double min(double x, double y) : 작은 값 구하기

- 인자로 받은 2개의 값을 비교하여 더 작은값을 리턴해준다.





double random() : 랜덤한 실수 얻기

- random 메소드는 0.0 <= Math.random() < 1.0 범위의 값을 얻어온다.


- 이 실수형의 랜덤한 값을 가지고 랜덤한 정수를 얻을 수 있다.


- (int)( Math.random()* n) + s  =>  s<= <s+n 사이의 수를 얻을 수 있다.


- 만약 n=6이고, s=1이면은 "0 <= Math.random() * 6 < 6" 의 범위를 갖는다.

여기의 s=1을 더한다면 "1 <= Math.random() * 6 +1 < 7" 의 범위를 갖는다.

이를 int로 형변환해줌으로써 1~6까지의 정수만을 얻을 수 있다.






+ Recent posts