1. [Period] / Duration 클래스
- 같은 인터페이스(TemporalAmount)를 상속 받음
- Period 클래스 - 날짜와 날짜 사이의 간격 차이 == 날짜 - 날짜
- Duration 클래스 - 시간과 시간 사이의 간격 차이 == 시간 - 시간
[메서드]
- between() 메서드(static 메서드) : 두 날짜 or 시간의 차이를 구하는 메서드
- until() 메서드(인스턴스 메서드) : 두 날짜 or 시간의 차이를 구하는 메서드(Duration 반환 X)
- of() 메서드 : 설정하는 메서드
- with() 메서드 : 수정하는 메서드
- 사칙연산 / 비교연산 / 기타 메서드
- 다른 단위로 변환하는 메서드
1-1. Period 클래스
- Period 클래스 : 날짜와 날짜 사이의 간격 차이를 계산할 때 사용
예시)
1-2. Duration 클래스
- Duration 클래스 - 시간과 시간 사이의 간격 차이를 계산할 때 사용
예시)
Duration은 시간 차이를 초와 나노초로 밖에 가져오지 못한다.
직접 계산하기에는 틀릴 수도 있기 때문에 Duration을 LocalTime으로 변환한 뒤 LocalTime이 가지고 있는 get() 메서드를 사용하면 편리하게 가져올 수 있다.
2. 파싱(parse)과 포맷(format)
- java.time.format 패키지 - DateTimeFormatter 클래스(날짜와 시간을 포맷해주는 클래스)
Date, Calendar -> 포맷, 파싱 -> [SimpleDateFormat 클래스 사용]
JDK 1.8 LocalDate, LocalTime, LocalDateTime -> 포맷, 파싱 -> [DateTimeFormatter 클래스 사용]
* LocalDate, LocalTime 클래스에도 format() 메서드가 있으니 편한 걸로 사용
[DateTimeFormatter에 상수로 정의된 형식]
예시)
2-1. 로케일에 종속된 형식화(지역에서 사용하는)
[FormatStyle에 정의된 상수]
예시)
2-2. 출력형식 직접 정의하기 - ofPattern() 메서드 사용
[DateTimeFormatter 패턴에 사용되는 기호]
예시)
3. 날짜/시간형식의 문자열을 날짜/시간으로 변환(파싱)하기
3-1. String -> LocalDateTime 변환
3-2. String -> LocalTime 변환
3-3. String -> LocalDate 변환
4. 컬렉션 프레임웍(Collection Framework == JCF)*****
JCF == Java Collection Framework
컬렉션 프레임웍에 대해서 정의와 핵심인터페이스에 대해서 정리하고 컬렉션 프레임웍에 어떠한 인터페이스와 컬렉션 클래스가 있는지 간단하게 먼저 정리하였다.
* 1. 컬렉션 프레임웤 ?
* - 정의 : 데이터 집합(군)을 저장(관리 - 추가, 수정, 삭제 등등)하는 클래스를 표준화해서 설계한 것
* 데이터 집합의 예) 배열(array)
* - 프레임웤(framework) : 표준화시킨 체계(뼈대, 틀, 체계, 체제)
*
* 2. 컬렉션 프레임웤의 핵심 인터페이스 - List, Set, Map
* 3. Collection 인터페이스 설명 - 상수, 추상메서드(디폴트, static) 6. Map 인터페이스 설명(별개)
* ↑ (상속) ↑ ㄴ Key+value 한쌍으로 관리
* 4. List 인터페이스 설명 5. Set 인터페이스 설명
* -> List 인터페이스와 Set 인터페이스의 부모 인터페이스 == Collection 인터페이스
* -> Map 인터페이스는 별개
*
* 7. Map.Entry 인터페이스 == (Key+value) 한쌍
*
* < 컬렉션 크레임웍의 핵심 인터페이스 - List, Set, Map를 구현한 클래스 종류 / 특징 / 사용법>
* 핵심 인터페이스를 구현한 클래스 == 컬렉션 클래스
*
* 8. ArrayList 컬렉션 클래스
* 9. Vector 컬렉션 클래스
* 10. LinkedList 컬렉션 클래스
*
* 11. Stack 과 Queue 컬렉션 클래스
* 12. PriorityQueue 컬렉션 클래스
*
* 13. Iterator(반복자), ListIterator, Enumeration(열거자) 컬렉션 클래스
* 14. Arrays 컬렉션 클래스
* 15. Comparator 인터페이스와 Comparable 인터페이스 : 정렬 비교할 때 사용
*
* 16. HashSet 컬렉션 클래스
* 17. TreeSet 컬렉션 클래스
*
* 18. HashMap과 Hashtable 컬렉션 클래스
* 19. 해싱과 해시함수
* 20. TreeMap 컬렉션 클래스
* 21. Properties 컬렉션 클래스
* 22. Collections 컬렉션 클래스
[각 인터페이스의 특징과 인터페이스를 구현한 컬렉션 클래스 종류]
[Collection 인터페이스에 정의된 메서드]
[List 인터페이스에 정의된 메서드]
[Map 인터페이스에 정의된 메서드] : 오늘 배우지 않았음
[Map.Entry 인터페이스에 정의된 메서드] : 오늘 배우지 않았음
5. JCF - ArrayList 컬렉션 클래스***
- 가장 많이 사용되는 컬렉션 클래스
- List 인터페이스를 구현한 클래스
- 특징 : 순서유지O, 중복허용O
배열(array)의 단점
- 배열의 크기 자동 증가 X
- 배열 안에 값을 삽입(insert) X
- 삭제(remove)
- 등등 불편함
- ArrayList는 초기용량을 설정해 주지 않으면 기본 10개
- ArrayList 생성시 <E> = 지네릭스(generics), 제네릭 : 배울 때 다시 다룰 예정
[ArrayList 컬렉션 클래스에 정의된 생성자와 메서드]
코드 예시1)
[문제] list에서 200보다 같거나 큰 요소 삭제
코드1) for문으로 해결
코드2) 람다식과 익명클래스로 해결
참고) dispList() 메서드)
코드 예시2)
오름차순 정렬, 이름 출력시 removeAll() 메서드와 retainAll() 메서드 주석 처리후 확인하기
코드 예시3) 한 반에 30명 학생의 이름, 국어, 영어, 수학, 총점, 평균, 등수 출력하기 -> ArrayList 사용
(days15 내용 참고)
package days24;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Random;
import java.util.Scanner;
import days15.Student;
public class Ex07 {
public static void main(String[] args) {
// 배열대신 컬렉션 클래스 사용하는 것이 추가/수정/삭제/크기 자동 증가 등등 용이
// days15.Ex06.java
// 한 반에 30명 학생의 이름, 국어, 영어, 수학, 총점, 평균, 등수 처리하는 예제 : days11.Ex07.java
// 1. Student 클래스 선언 <- 속성, 기능 파악해서 목록 작성
// 2. 객체 배열 == 클래스 배열(클래스 자료형으로 배열을 선언하겠다)
Scanner sc = new Scanner(System.in);
final int STUDENT_COUNT = 30;
ArrayList list = new ArrayList(STUDENT_COUNT);
int cnt = 0;
char con = 'y';
do {
int no = cnt + 1;
System.out.printf("> [%d]번 이름 국어 영어 수학 입력하세요?", no);
String name = getRandomName();
int kor = getRandomScore();
int eng = getRandomScore();
int mat = getRandomScore();
int tot = kor + eng + mat;
double avg = (double)tot / 3;
int rank = 1;
int wrank = 1;
Student s = new Student(no, name, kor, eng, mat, tot, rank, wrank, avg);
list.add(s);
cnt++; // 입력받은 학생수 1증가 + 채워넣을 인덱스 값도 1증가
System.out.println("> 계속 하시겠습니까?");
con = sc.next().charAt(0);
} while (Character.toUpperCase(con) == 'Y');
// System.out.println("> 입력받은 학생 수 : " + cnt + "명");
System.out.println("> 입력받은 학생 수 : " + list.size() + "명");
// ㄴ. 등수처리
for (int i = 0; i < list.size(); i++) {
Student a = (Student) list.get(i);
for (int j = 0; j < cnt; j++) { // cnt로 넣어주는게 더 좋음, 메서드를 계속 호출하지 않아서
Student b = (Student) list.get(j);
if(a.tot < b.tot) {
a.rank++;
} // if
} // for j
} // for i
// ㄱ. 학생정보출력
// 반복자(Iterator) 사용
/*
Iterator ir = list.iterator();
while (ir.hasNext()) {
Student s = (Student) ir.next();
System.out.println(s); // s.toString();
}
*/
// 람다로 학생 정보 출력
// -> : 람다연산자
list.forEach(s -> System.out.println(s));
System.out.println("===============================================");
// 1. 복제
ArrayList listClone = (ArrayList) list.clone(); // 복제(원본 손상안가도록)
// 2. 복제한 listClone을 성적으로 오름차순 정렬
// 에러메시지 : java.lang.ClassCastException: days15.Student cannot be cast to java.lang.Comparable
// 해석 : Comparable -> 비교할 게 없다. -> 비교할 정렬 기준이 없다.
// 이유? 정렬하는 기준이 없음
// 방법1)
listClone.sort(new StudentRankComparator());
// 방법2)
// Collections.sort(listClone, new StudentRankComparator());
// 방법3) 익명클래스 사용
/*
Collections.sort(listClone,
new Comparator() { // 익명클래스 사용
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof Student && o2 instanceof Student) {
Student s1 = (Student) o1;
Student s2 = (Student) o2;
return s2.tot - s1.tot; // 같으면 0, s2가 크면 양수, s2가 작으면 음수 - 오름차순 정렬
// return s1.tot - s2.tot; // 내림차순 정렬
}
return 0;
}
}
);
*/
// 3. 복제한 listClone을 출력
listClone.forEach(s -> System.out.println(s));
} // main
public static String getRandomName() {
String name = null;
// 무작위로 대문자 5개 생성 -> 이름으로 가정
Random rnd = new Random();
char names[] = new char[5];
for (int i = 0; i < names.length; i++) {
names[i] = (char)(rnd.nextInt(26) + 65); // 65~90 -> -65 > 0~25
}
// char[] -> String 변환 코딩
name = new String(names);
return name;
} // getRandomName
public static int getRandomScore() {
Random rnd = new Random();
return rnd.nextInt(101);
} // getRandomScore
} // class
// 학생의 정렬 기준 클래스 선언 [Comparator] / Comparable 인터페이스 구현
class StudentRankComparator implements Comparator {
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof Student && o2 instanceof Student) {
Student s1 = (Student) o1;
Student s2 = (Student) o2;
return s2.tot - s1.tot; // 같으면 0, s2가 크면 양수, s2가 작으면 음수 - 오름차순 정렬
// return s1.tot - s2.tot; // 내림차순 정렬
}
return 0;
}
} // StudentRankComparator
Student 클래스 - 오버라이딩 내용)
String[] -> ArrayList 변환 : Arrays.asList() 메서드 사용
ArrayList list = new ArrayList(Arrays.asList(String 배열명));
List에 중복된 요소가 있을 때 모든 index 찾기)
6. JCF - Vector 컬렉션 클래스
- ArrayList와 사용방법은 동일
- ArrayList와 Vector 컬렉션 클래스의 차이점 :
Vector 컬렉션 클래스는 동기화 처리가 되어져 있다(멀티스레드 안전)
- 반복자(Iterator)와 열거자(Enumeration)
- 반복자와 열거자의 차이점? [fail-fast]
- 반복자(Iterator)는 fail-fast : 요소를 읽는 중에 누가 수정을 해버리면 빨리 예외를 발생시킴 -> 다시 읽어오게끔 코딩을 수정하면 됨
- 열거자(Enumeration) 는 복사해와서 사용하기 때문에 누가 수정을 해도 모름
- 아무것도 안주면 초기용량은 10개, 아래처럼 증가치 0을 주어 코딩하는 것은 디폴트 생성자와 같은 의미
Vector v1 = new Vector(10, 0); // 초기값 10, 증가치 0
Vector v2 = new Vector(); // 디폴트
코드 예시)
- v.setSize(6); -> null로 채워서 용량(사이즈)을 6개로 수정하겠다. -> 객체의 수를 출력해도 6, 용량을 출력해도 6 즉, 비워져 있는 상태가 아니라 null로 채워져 있는 상태
이 외의 메서드 내용)
7. JCF - LinkedList 컬렉션 클래스(개념)
(오늘은 개념정도 살짝 다뤘고 내일 이어서 더 배울 예정)
'TIL > Java' 카테고리의 다른 글
[SIST] Java_days26 (0) | 2022.03.25 |
---|---|
[SIST] Java_days25 (0) | 2022.03.24 |
[SIST] Java_days23 (0) | 2022.03.22 |
[SIST] Java_days22 (0) | 2022.03.21 |
[SIST] Java_days21 (0) | 2022.03.18 |