본문 바로가기
Study/JAVA

[JAVA] 13주차_컬렉션 프레임워크 (Queue, Set 컬렉션, Map 컬렉션, Iterator 인터페이스와 입출력 스트림)_자바 스터디

by 8희 2022. 5. 28.

1차시 Queue, Set 컬렉션

 


컬렉션 프레임워크의 구조

- 컬렉션 프레임워크는 인터페이스와 클래스로 구성

- 인터페이스는 컬렉션에서 수행할 수 있는 각종 연산을 제네릭 타입으로 정의해

  유사한 클래스에 일관성 있게 접근하게 한다

- 클래스는 컬렉션 프레임워크 인터페이스를 구현한 클래스

 

컬렉션 프레임워크의 구조

 


Queue 컬렉션 (Queue 인터페이스)

- 선입선출(FIFO) 방식을 지원

- 항상 순차적!

 

Queue 인터페이스에 추가된 메서드

 

/* 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 인터페이스가 제공하는 주요 메서드

 

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는 컬렉션에 접근할 때 쓰는 반복자! (인터페이스)

 

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"); //개구리->	나비->	다람쥐->	
	}
}