1차시 Queue, Set 컬렉션
컬렉션 프레임워크의 구조
- 컬렉션 프레임워크는 인터페이스와 클래스로 구성
- 인터페이스는 컬렉션에서 수행할 수 있는 각종 연산을 제네릭 타입으로 정의해
유사한 클래스에 일관성 있게 접근하게 한다
- 클래스는 컬렉션 프레임워크 인터페이스를 구현한 클래스
Queue 컬렉션 (Queue 인터페이스)
- 선입선출(FIFO) 방식을 지원
- 항상 순차적!
/* Queue 인터페이스의 활용 코드 */
import java.util.LinkedList; //큐를 할당할 때엔 연결 리스트 선언 해서도 사용 가능
import java.util.NoSuchElementException;
import java.util.Queue;
public class QueueDemo {
public static void main(String[] args) {
//LinkedList는 Queue의 구현 클래스이므로 생성된 객체를 Queue 타입 변수에 대입 가능
Queue<String> q = new LinkedList<>();
// q.remove(); //예외 발생, 큐에 원소가 없는데 remove()를 호출하기 때문!
//poll()는 remove()와 달리 큐에 원소가 없으면 예외를 발생시키지 않고 null을 반환
System.out.println(q.poll()); //poll()는 큐의 원소를 삭제하는 메서드 //(1)
q.offer("사과"); //offer()는 큐에 원소를 삽입하는 메서드
System.out.println("바나나를 추가했나요? " + q.offer("바나나")); //(2)
//offer()는 반환 타입이 boolean
try { //add()가 try문 밖에 있으면 예외 발생 가능
q.add("체리");
} catch (IllegalStateException e) {
}
System.out.println("헤드 엿보기 : " + q.peek()); //peek()는 먼저 삭제될 대상 리턴 //(3)
String head = null;
try { //remove()와 element()를 호출할 때도 예외 발생 가능
head = q.remove(); //head는 사과 //remove()는 삭제 메서드
System.out.println(head + " 제거하기"); //(4) //큐는 저장된 순서대로 삭제
System.out.println("새로운 헤드 : " + q.element()); //element()는 검색할 대상 리턴 //(5)
} catch (NoSuchElementException e) {
}
head = q.poll(); //poll()는 삭제 메서드
System.out.println(head + " 제거하기"); //(6)
System.out.println("새로운 헤드 : " + q.peek()); //(7)
//contains()는 try문에 들어가지 않음!
System.out.println("체리를 포함하고 있나요? " + q.contains("체리")); //(8)
System.out.println("사과를 포함하고 있나요? " + q.contains("사과")); //(9)
}
}
/* 코드 출력 결과 */
null //(1)
바나나를 추가했나요? true //(2)
헤드 엿보기 : 사과 //(3)
사과 제거하기 //(4)
새로운 헤드 : 바나나 //(5)
바나나 제거하기 //(6)
새로운 헤드 : 체리 //(7)
체리를 포함하고 있나요? true //(8)
사과를 포함하고 있나요? false //(9)
Set 컬렉션
- 순서가 없고, 중복되지 않는 객체를 저장하는 자료구조 지원
- 추가된 메서드는 없지만 중복 원소를 배제
- 인덱스가 없어 저장 순서 무시
/* HashSet 클래스(Set 인터페이스를 구현한 클래스)의 활용 코드 */
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class HashSet1Demo {
public static void main(String[] args) {
String[] fruits = { "사과", "바나나", "포도", "수박" };
HashSet<String> h1 = new HashSet<>(); //HashSet은 클래스라서 new 키워드 사용 가능
Set<String> h2 = new HashSet<>(); //두 가지 방법 다 사용 가능
for (String s : fruits)
h1.add(s); //HashSet에 원소를 추가
System.out.println("1단계 : " + h1); //1단계 : [포도, 수박, 사과, 바나나]
//Set은 순서가 없음!
//HashSet에 원소를 추가 및 삭제, 동일한 원소는 추가하려고 해도 추가 X
h1.add("바나나"); //바나나는 중복 원소라서 이 코드 무시
h1.remove("포도"); //'포도'라는 요소 삭제
h1.add(null); //null도 하나의 요소로 보고 HashSet의 추가 가능
System.out.println("2단계 : " + h1); //2단계 : [null, 수박, 사과, 바나나]
System.out.println(h1.size()); //4
//contains()는 HashSet에 특정 원소의 포함 여부 반환
System.out.println(h1.contains("수박")); //true
List<String> list = Arrays.asList(fruits); //배열을 리스트로 변환
h2.addAll(list); //List의 모든 원소를 HashSet의 원소로 추가
System.out.println("3단계 : " + h2); //3단계 : [포도, 수박, 사과, 바나나]
h2.clear(); //clear()는 HashSet의 요소 전체 삭제
//isEmpty()는 전체가 다 비어 있는지 묻는 메서드
System.out.println(h2.isEmpty()); //true
}
}
2차시 Map 컬렉션
Map 인터페이스
- 특징: 키와 값을 쌍으로 저장하며, 키는 중복 불가능!
- 구현 클래스: HashMap, Hashtable, TreeMap, Properties
Map 컬렉션
- 사전처럼 키와 값 쌍으로 구성된 객체를 저장하는 자료구조 지원
- 키와 값도 모두 객체이며 키는 중복되지 않고 하나의 값에만 매핑
- 키는 중복 불가능, 값은 중복 가능
/* HashMap 클래스의 활용 코드 */
import java.util.HashMap;
import java.util.Map;
public class HashMap1Demo {
public static void main(String[] args) {
Map<String, Integer> m = new HashMap<>(); //키가 String 타입이고, 값이 Integer 타입인 Map
//Map의 size 할당 자리는 반드시 포장 크래스!
//HashMap에 4개의 객체 추가
m.put("사과", 5);
m.put("바나나", 3);
m.put("포도", 10);
m.put("딸기", 1);
//size()는 컬렉션의 크기 반환 - 이 코드는 4개의 객체가 있음으로 4 반환
System.out.println(m.size() + "종류의 과일이 있습니다.");
for (String key : m.keySet()) //HashMap에 있는 모든 키를 Set 타입으로 가져옴
System.out.println(key + "가 " + m.get(key) + "개 있습니다.");
//모든 키-값을 출력, HashMap에 입력한 객체는 순서와 관계 X
String key = "바나나";
if (m.containsKey(key)) //주어진 키가 컬렉션에 있다면 키와 값 출력
System.out.println(key + "가 " + m.get(key) + "개 있습니다.");
m.remove("사과"); //키와 일치하는 원소를 삭제하고 값을 반환
System.out.println("사과를 없앤 후 과일은 " + m.size() + "종류입니다.");
m.clear(); //모든 매핑을 삭제
System.out.println("모두 없앤 후 과일은 " + m.size() + "종류입니다.");
}
}
Collections 클래스
- 컬렉션을 다루는 다양한 메서드를 제공하는 java.util 패키지의 클래스
- 컬렉션 원소 정렬, 섞기, 탐색 등 문제를 쉽게 해결
- Collection 인터페이스랑 다른 것임!
/* Collections 클래스르 활용한 정렬 */
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class SortDemo {
public static void main(String[] args) {
String[] s = { "나는", "조국", "대한민국을", "사랑합니다" };
List<String> list = Arrays.asList(s); //배열을 List 타입으로 변환
Collections.sort(list, Collections.reverseOrder()); //List 컬렉션 원소를 역방향으로 정렬
System.out.println(list);
Collections.reverse(list); //List 컬렉션 원소를 역방향으로 정렬
System.out.println(list);
}
}
/* Collection 클래스를 활용한 섞기 */
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ShuffleDemo {
public static void main(String[] args) {
List<Character> list = new ArrayList<>(); //배열을 List 타입으로 변환
for (char c = 'A'; c <= 'G'; c++) //문자 A부터 G까지
list.add(c); //List 컬렉션에 저장
System.out.println("섞기 전 :\t" + list);
Collections.shuffle(list); //List 컬렉션의 원소를 무작위로 섞기
System.out.println("섞은 후 :\t" + list);
}
}
/* Collections 클래스를 활용한 이진 탐색 */
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class SearchDemo {
public static void main(String[] args) {
String[] s = { "황금을", "돌", "같이", "보라" };
List<String> list = Arrays.asList(s); //배열을 List 타입으로 변환
Collections.sort(list); //binarySearch()를 사용하기 전에 정렬 필수!
System.out.println(list);
int i = Collections.binarySearch(list, "돌"); //List 컬렉션에서 '돌' 문자열인 원소의 인덱스를 찾음
System.out.println(i);
}
}
3차시 Iterator 인터페이스와 입출력 스트림
컬렉션의 데이터 반복 처리
- 컬렉션의 종류에 관계 없이 반복자를 이용하면 컬렉션에 포함된 객체를 순차적으로 순회
- Iterator는 컬렉션에 접근할 때 쓰는 반복자! (인터페이스)
/* 반복자를 사용한 List 컬렉션 순회 */
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
public class IteratorDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("다람쥐"); //순서 있음
list.add("개구리");
list.add("나비");
//List에서 Iterator 객체를 가져와 List 컬렉션의 모든 원소 출력
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) //hasNext()는 다음 원소의 존재 여부 반환
System.out.print(iterator.next() + "\t"); //next()는 다음 원소 반환
System.out.println(); //다람쥐 개구리 나비
Collections.sort(list); //List 컬렉션 원소를 정렬
while (iterator.hasNext()) //이미 사용한 반복자로 List 컬렉션의 모든 원소를 출력
System.out.print(iterator.next() + ",\t"); //실행 안 됨
System.out.println(); //이것만 실행 됨
iterator = list.iterator(); //Itertor 다시 시작
while (iterator.hasNext()) //List에서 Iterator 객체를 다시 가져와서 List 컬렉션의 모든 원소를 출력
System.out.print(iterator.next() + "->\t"); //개구리-> 나비-> 다람쥐->
}
}