워밍업 문제1) ArrayList list 객체에 임의의 정수( 1~100 ) 까지의 정수 5개를 입력하고 내림차순으로 정렬해서 출력하세요.
Comparator 인터페이스를 구현한 클래스 2가지)
워밍업 문제2) java.time 패키지 클래스 사용해서 오늘 현재 설문 가능한 여부 출력
1. JCF - LinkedList 컬렉션 클래스
- 불연속적 구조
- 순서유지O, 중복허용O
- 비순차적으로 삭제/추가 작업할 때 성능이 우수
- [ ] -> 하나하나를 요소(Element) == 노드(node)
[ArrayList와 LinkedList의 차이점]
- 읽는 작업 : ArrayList 빠름
- 순차적으로 추가/삭제하는 경우 ArrayList가 더 빠르다
- 중간 데이터를 추가/삭제하는 경우 LinkedList가 더 빠르다
- 데이터가 많을수록 LinkedList는 접근성이 떨어진다.
[단방향 링크드 리스트]
- 연결 선이 끊어지면 데이터 손실
[ ]--[ ]--[ ]--[ ]--[ ]--[ ]--[ ]--[ ]--[ ]
[더블형(양방향) 링크드 리스트]
- 연결 선이 하나 끊어지더라도 괜찮음]
[ ]==[ ]==[ ]==[ ]==[ ]==[ ]==[ ]==[ ]==[ ]
[더블형 써클(양방향 환형) 링크드 리스트]
- 연결 선이 두개가 다 끊어지더라도 맨 처음과 끝이 연결되어있어서 괜찮음
==[ ]==[ ]==[ ]==[ ]==[ ]==[ ]==[ ]==[ ]==[ ]==
[링크드 리스트에서 데이터 삭제]
[링크드 리스트에서 데이터 추가]
[LinkedList의 생성자와 메서드]
[LinkedList 개념 설명 코드]
Node 클래스)
main() 메서드)
[LinkedList 컬렉션 클래스 사용 예제]
2. JCF - 스택(Stack)과 큐(Queue)
2-1. 스택(Stack)
- 스택(Stack)은 마지막에 저장한 데이터를 가장 먼저 꺼내는 LIFO 구조(LIFO == Last In First Out)
- 상속계층도 : Collection <- List <- Vector <- Stack
- 스택(Stack)은 클래스로 구현하여 제공
- iterator() 반복자는 스택(Stack)에서 사용하면 안된다. -> Stack은 막혀있는 구조라서
[스택(Stack)의 메서드]
스택 코드 사용 예제)
2-2. 큐(Queue)
- 큐(Queue)는 처음에 저장한 데이터를 가장 먼저 꺼내게 되는 FIFO 구조(FIFO == First In First Out)
- 큐(Queue)는 인터페이스로만 정의, 별도의 클래스 제공 X
- 큐(Queue)를 구현한 클래스는 LinkedList 등
[큐(Queue)의 메서드]
큐(Queue) 코드 사용 예제)
3. JCF - PriorityQueue 컬렉션 클래스
- Priority(우선권) + 큐(FIFO)
- 저장한 순서에 상관없이 [우선 순위가 높은 것부터] 꺼내온다. -> Queue의 특징은 없고 우선 순위가 높은 것 부터 꺼내오는 것이 특징!
- null을 저장할 수 없다. null 저장시 NullPointerException 예외 발생
- 저장공간으로 배열을 사용, 각 요소를 힙(Heap)이라는 자료구조의 형태로 저장(JVM의 힙 X)
PriorityQueue 코드 사용 예제)
4. JCF - Deque([D]ouble-[E]nded [Que]ue) 인터페이스
- 양쪽 끝(Double-Ended)에서 추가/추출이 가능하다.
- Queue 인터페이스의 자식인터페이스
- Deque 구현한 클래스 : LinkedList, ArrayDeque
[Deque 메서드에 대응하는 Queue와 Stack의 메서드]
5. JCF - Iterator, ListIterator, Enumeration 인터페이스
- 3가지 모두 인터페이스이며, 컬렉션에 저장된 요소를 접근(가져오기)하는데 사용
- Enumeration은 Iterator의 구버젼
- ListIterator는 Iterator의 기능을 향상시킨 것
- Iterator는 단방향(뒤로 돌아가서 다시 읽을 수 없음)
- ListIterator는 양방향(뒤로 돌아가서 다시 읽을 수 있음(향상된 기능), previous() 메서드 사용)
[Iterator 메서드]
[Enumeration 메서드]
[ListIterator 메서드]
사용 예제)
6. JCF - Arrays 컬렉션 클래스
- 배열을 좀 더 쉽게 다루는 기능이 구현된 클래스
[Arrays 메서드]
- 배열을 쉽게 출력하는 메서드
// Arrays.toString(null);
- 모두 하나의 값으로 채워넣는 메서드
// Arrays.fill(null, false);
// Arrays.setAll(null, null);
- 배열을 정렬하는 메서드
// Arrays.sort(null);
- 배열 안에 있는 값을 검색하는 메서드
// Arrays.binarySearch(null, 0);
- 배열을 List에 담아서 반환하는 메서드
// Arrays.asList(Object... a);
- 배열 복사하는 메서드
// Arrays.copyOf(), Arrays.copyOfRange()
- 배열을 비교하는 메서드
// Arrays.equals(null, null);
7. JCF - Comparator와 Comparable 인터페이스
- Comparator와 Comparable은 모두 인터페이스로 컬렉션을 정렬하는데 필요한 메서드를 정의
- 비교 가능한 클래스로 만들기 위해서는 Comparable을 구현하고 비교 가능한 클래스가 아니면, 비교하기 위해서 잣대가 필요하니 Comparator로 새로운 클래스를 하나 구현하면 됨
- Comparable 인터페이스를 구현한 클래스는 sort() 메서드 그대로 사용
- Comparator 인터페이스를 구현한 클래스는
sort(구현한 클래스 객체 참조변수명)
Collections.sort(배열명, 구현한 클래스 객체 생성)하여 사용
[Comparable 인터페이스]
- 기본 정렬 기준을 구현하는데 사용(기본적으로 오름차순)
- Comparable 인터페이스를 구현한 클래스는 같은 타입의 인스턴스끼리 서로 비교할 수 있는 클래스들
- 같은 클래스 타입의 객체를 비교해야할 때 비교가 가능한 클래스를 만들기 위해서 Comparable 인터페이스로 클래스를 구현 후 ComparTo 메서드를 오버라이딩
- 즉, 비교가 가능하기 때문에 클래스 자체적으로 가능
[Comparator 인터페이스]
- 기본 정렬 외에 내림차순 정렬 등 다른 기준에 의해서 정렬되도록 하고 싶을 때 구현해서 사용
- 클래스가 비교가 가능한 클래가 아니라면(Comparable로 구현하지 않은 클래스) 비교 기능을 가지고 있는 클래스를 만들기 위해 Comparator 인터페이스로 클래스를 구현 후 compare 메서드를 오버라이딩
- Comparator는 비교하는 잣대(기준) 만드는 인터페이스
사용 예제)
Comparator 인터페이스를 구현한 클래스 DesendingComparator)
Comparable 인터페이스를 구현한 클래스 Person)
class Person implements Comparable<Person>{
String name;
int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
} // Person class
8. JCF - HashSet 컬렉션 클래스
- Set 인터페이스를 구현한 가장 많이 사용하는 컬렉션 클래스
- 순서유지X, 중복허용X
- 저장순서를 유지하고자 한다면 LinkedHashSet 사용
- LinkedHashSet은 HashSet의 자식 클래스, 순서유지O, 중복허용X
[HashSet 메서드]
사용 예제)
[로또 번호 만들고 출력하는 예제]
번호가 발생하는 순서대로 입력하기 위해 LinkedHashSet 사용
[로또 게임 회수를 입력받아서 로또 번호 생성하고 출력하는 예제]
fillLotto와 dispLotto 메서드는 위의 코딩 가져와서 사용
[빙고판 만들기 예제]
[이름과 나이가 같으면 동일인물로 취급하여 HashSet에 요소 추가하지 못하게 하기]
main() 메서드)
Person 클래스)
compareTo, hashCode, equals 메서드 오버라이딩
class Person implements Comparable<Person>{
String name;
int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Person o) {
// return this.age - o.age; // 같으면 0, 앞이 크면 양수, 뒤가 크면 음수
return this.name.compareTo(o.name); // 이름
}
@Override
public int hashCode() {
return (name+age).hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Person) {
Person p = (Person) obj;
return this.name.equals(p.name) && this.age == p.age; // 이름하고 나이가 같니?
}
return false;
}
} // Person class
[교집합, 차집합, 합집합 구하기]
public class Ex13 {
public static void main(String[] args) {
HashSet<Integer> a = new HashSet<Integer>();
a.add(1);a.add(2);a.add(3);a.add(4);a.add(5);
HashSet<Integer> b = new HashSet<Integer>();
b.add(4);b.add(5);b.add(6);b.add(7);b.add(8);
System.out.println(a); // [1, 2, 3, 4, 5]
System.out.println(b); // [4, 5, 6, 7, 8]
// 1. a∪b 합집합 : 1,2,3,4,5,6,7,8
HashSet<Integer> hab = new HashSet<Integer>();
hab.addAll(a);
hab.addAll(b);
System.out.println(hab); // 중복된 데이터가 안들어가져서 합집합 구하기 쉬움
// 2. a∩b 교집합 : 4,5
HashSet<Integer> kyo = new HashSet<Integer>();
// 3. a-b 차집합 : 1,2,3,6,7,8
HashSet<Integer> cha = new HashSet<Integer>();
Iterator<Integer> ir = a.iterator();
while (ir.hasNext()) {
Integer n = (Integer) ir.next();
// System.out.println(n);
if(b.contains(n)) { // b에 a 값이 있니?
kyo.add(n); // 있으면 교집합에 추가
} else {
cha.add(n); // 없으면 차집합에 추가
}
} // while
System.out.println(kyo); // [4, 5]
System.out.println(cha); // [1, 2, 3]
} // main
} // class
9. JCF - TreeSet 컬렉션 클래스
[특징]
1) Set의 특징인 순서유지X, 중복허용X 특징 가지고 있음
2) 이진 검색 트리(binary serch tree)를 사용해서 데이터를 저장
3) 이진 검색 트리로 저장되기 때문에 [정렬, 검색, 범위검색]하는데 성능이 뛰어남
4) 링크드 리스트처럼 노드가 서로 연결된 구조
5) 최상위 노드를 루트(root)라고 한다.
6) 부모-자식 관계, 형제 노드 관계를 가진다.
7)
class TreeNode{
TreeNode 왼쪽자식노드;
Object value;
TreeNode 오른쪽자식노드;
}
[이진 검색 트리]
[TreeSet 생성자와 메서드]
사용 예제)
'TIL > Java' 카테고리의 다른 글
[SIST] Java_days27 (0) | 2022.03.28 |
---|---|
[SIST] Java_days26 (0) | 2022.03.25 |
[SIST] Java_days24 (0) | 2022.03.23 |
[SIST] Java_days23 (0) | 2022.03.22 |
[SIST] Java_days22 (0) | 2022.03.21 |