본문 바로가기
Java 공부 기록

컬렉션 프레임(collections framework)

by moonchance 2023. 6. 20.

 

컬렉션 프레임웍의 핵심 인터페이스

Collection인터페이스의 메서드

 

List인터페이스의 메서드 순서O, 중복O

 

Set인터페이스 순서X, 중복X

 

Map인터페이스의 메서드 순서X,중복(X,O)

 

ArrayList의 장점과 단점

LinkedList - 배열의 단점을 보완

LinkedList 이중 연결 리스트

ArrayList vs. LinkedList – 성능 비교

 

스택과 큐(Stack & Queue)

 

HashSet TreeSet순서X, 중복X

 

HashSet boolean add(Object o)

HashSet hashCode()오버라이딩 조건

 

TreeSet 범위 검색과 정렬에 유리

TreeSet 데이터 저장과정  boolean add(Object o)

TreeSet 주요 생성자와 메서드

TreeSet 범위 검색 subSet(), headSet(), tailSet()

 

HashMapTreeMap순서X, 중복(X,O)

HashMap 주요 메서드

해싱(hashing)

 

 

컬렉션 클래스 정리 & 요약

 

[출처]자바의 정석

 

 

실습을 해보자.

package chap_19;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;

public class _01_Collection {

	public static void main(String[] args) {
		/* 컬렉션 프레임워크 : 표준화된 방식의 자료구조
		 * List, Set, Map => 인터페이스. 반드시 구현 클래스로 객체를 생성
		 * 데이터를 묶어서 관리할 때 사용
		 * 주로 배열 대신에 사용
		 * 
		 * List : 배열과 동일
		 * - 값을 하나씩 저장
		 * - 순서를 보장(index)
		 * - 중복 허용
		 * - 배열 대신에 가장 많이 사용하는 구조
		 * 
		 * Set
		 * - 값을 하나씩 저장
		 * - 순서 보장x(index 없음, 번지가 없음)
		 * - 중복허용x(같은 자료가 입력되면 버려짐)
		 * 
		 * Map
		 * - 값을 두개씩 저장 key / value 쌍으로 저장
		 * - key는 중복 불가능 / value는 중복 가능
		 * - key가 중복되면 value는 덮어쓰기 됨
		 * - 아이디 / 패스워드 와 같이 묶어서 하나의 자료로 저장해야 할 때 사용
		 * 
		 * 배열은 기본자료형, 클래스 자료형으로 구성가능
		 * int[] arr, String[] arr, Student[] arr
		 * collection에서는 기본자료형 사용x, class자료형으로만 구성 가능
		 * 
		 * int => Integer, String, 나머지 기본자료형들은 첫 글자만 대문자로 변경하면 클래스가 됨.(Byte, Boolean => 기본 자료형의 클래스들)
		 * 
		 * 만약 클래스를 지정하지 않으면 Object가 자동 설정됨.
		 * -----------------------------------------------------------
		 * List<클래스형> 객체명 = new 구현클래스<클래스형>(); 
		 * List => 구현 클래스 ArrayList(검색이 많은 케이스)
		 *                / LinkedList(추가, 삭제가 많은 케이스)
		 * 
		 * ArrayList => 배열과 비슷한 자료구조 값을 등록하는 형태
		 * - 미리 길이를 지정하지 않음. 추가하면 늘어나고, 삭제되면 줄어드는 형태
		 * - 추가, 삭제가 쉽다
		 * 
		 * LinkedList => 값을 중간에 끼워넣기, 중간에서 빼기 형태가 쉽다
		 * - 검색이 느리다
		 */
		List<Integer> list = new ArrayList<Integer>();
		ArrayList<Integer> list2 = new ArrayList<Integer>();
		ArrayList list3 = new ArrayList<>(); // 자료형이 Object가 됨.
		
		// add() : 요소를 추가하는 메서드
		list.add(1);
		list.add(2);
		list.add(3);
		System.out.println(list); // toString() 생략가능
		
		// size() : List의 총 개수
		System.out.println(list.size());
		
		// 문자열을 담을 수 있는 ArrayList 생성
		// 문자를 5개 저정한 후 출력
		// 총 개수가 몇개인지도 출력
		ArrayList<String> sArr = new ArrayList<String>();
		sArr.add("사관");
		sArr.add("포도");
		sArr.add("바나나");
		sArr.add("귤");
		sArr.add("딸기");
		System.out.println(sArr); 
		System.out.println(sArr.size());
		
		// 값을 하나씩 찍어보기
		// 값을 가져올 때 : get() / 값을 변경할 때 : set()
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i) + " ");
		}
		
		// List 생성 후, 1 ~ 10 까지 저장한 후 출력
		List<Integer> num = new ArrayList<Integer>();
		
		for (int i = 0; i < 10; i++) {
			num.add(i+1);
			System.out.print(num.get(i) + " ");
		}
		System.out.println();
		
		// set(index, 값) : 값을 변경할 때
		num.set(0, 7);
		System.out.println(num);
		
		// remove(index) : index 번지의 값을 삭제
		// remove(Object) : Object의 요소(값)를 삭제
		num.remove(0);
		System.out.println(num);
		
		Integer a = 9;
		num.remove(a); // 요소를 삭제
		System.out.println(num);
		
		// contrains(Object) : List에 값이 있는지 검사 true / false로 리턴
		System.out.println(num.contains(a));
		
		// clear() : List 비움(요소 전부 삭제)
		num.clear();
		System.out.println(num);
		
		// isEmpty() : List가 비어있는지 체크 비어있으면 true
		System.out.println(num.isEmpty());
		
		// 리스트 생성 후, 1 ~ 10까지 채운 후 출력(for문 이용하여 요소를 꺼내서 출력)
		List<Integer> num2 = new ArrayList<Integer>();
		for (int i = 0; i < 10; i++) {
			num2.add(i + 1);
			System.out.printf("[%d]", num2.get(i));
		}
		System.out.println();
		
		// 요소에서 5를 삭제
		Integer five = 5;
		num2.remove(five);
		
		// 다시 출력 : 향상된 for문
		for (Integer i : num2) {
			System.out.printf("[%d]", i);
		}
		System.out.println();
		System.out.println("--------------------------");
		
		// Iterator : index가 없는 값을 출력하기 위해 사용
		/* List에서는 순서를 보장하기 때문에 get(i)를 사용하여 원하는 번지에 접근이 가능
		 * Set / Map은 순서를 보장하지 않기 때문에 (일반)for문을 이용할 수 없음
		 * 향상된 for문, Iterator 처럼 순서와 상관없이 값을 가져올 수 있는 구문을 사용
		 * 향상된 for문 / Iterator 는 Map에서 직접 사용 불가능
		 */
		System.out.println("--Iterator 출력--");
		Iterator<Integer> it = num2.iterator();
		while(it.hasNext()) { // hasNext() 다음 요소가 있는지 체크 true / false
			Integer tmp = it.next(); // next() 다음 요소 가져오기
			System.out.print(tmp + " ");
		}
		System.out.println();
		// indexOf(값) : 해당 값이 List의 index를 반환 / 없다면 -1 리턴
		Integer n = 9;
		System.out.println(num2.indexOf(n)); // 7번째 index 리턴
		
		// List 생성 후, 값을 무작위로 5개만 추가
		num2.clear();
		num2.add(4);
		num2.add(2);
		num2.add(6);
		num2.add(7);
		num2.add(10);
		num2.add(1);
		num2.add(5);
		num2.add(9);
		num2.add(8);
		num2.add(3);
		System.out.println(num2);
		
		// Collections.sort() // 오름차순만 가능
//		Collections.sort(num2);
//		System.out.println(num2);
		
		// sort(comparator를 구현한 객체) : 정렬
		// 객체 : comparator 인터페이스를 구현한 객체를 넣어야 함(익명클래스 사용)
		// 비교(comparator) 메서드를 구현하여 객체를 정렬
		// compareTo : 사전상 앞에 있으면 -1, 같으면 0, 뒤에 있으면 1
		
		num2.sort(new Comparator<Integer>() {
			@Override
			public int compare(Integer o1, Integer o2) {
				// compare 역할 : 결과가 (-)면 앞으로 보내고, (+)면 뒤로 보내는 역할
				// o1-o2 : 오름차순,   o2-o1 : 내림차순
				return o2 - o1;
			}
			
		});
		System.out.println(num2);
		
		
	}

}

List

package chap_19;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;

public class _02_List {

	public static void main(String[] args) {
		/* 하루 일과를 저장하는 List 생성
		 * 
		 * 출력을 for문 / 향상된for문 / Iterator 사용하여 출력
		 */
		List<String> routines = new ArrayList<String>();
		routines.add("아침 기상");
		routines.add("아침 식사");
		routines.add("오전 공부");
		routines.add("점심 식사");
		routines.add("학원 등원");
		routines.add("오후 수업");
		routines.add("저녁 식사");
		routines.add("저녁 수업");
		routines.add("집으로 귀가");
		routines.add("취침");
		
		// for문
		System.out.println("         -----------for문---------");
		for (int i = 0; i < routines.size(); i++) {
			System.out.printf("%d.[%s] ",i+1,routines.get(i));
		}
		System.out.println();
		
		// 향상된 for문
		System.out.println("         --------향상된 for문------");
		int i = 1;
		for (String s : routines) {
			System.out.printf("%d.[%s] ", i, s);
			i++;
		}
		System.out.println();
		// Iterator
		
		System.out.println("         ---------Iterator-------");
		Iterator<String> it = routines.iterator();
		i = 1;
		while (it.hasNext()) {
			String s = it.next();
			System.out.printf("%d.[%s] ", i,  s);
			i++;
		}
		System.out.println();
		
		Collections.sort(routines);
		System.out.println(routines);
		
		routines.sort(new Comparator<String>() {
			@Override
			public int compare(String o1, String o2) {
				// 숫자는 - 크다, 작다를 이용 가능
				// 문자는 compareTo 메서드를 활용하여 정렬
				return o2.compareTo(o1);
			}
			
		});
		System.out.println(routines);
	}

}
package chap_19;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class _06_List2 {

	public static void main(String[] args) {
		/* 두 배열을 매개변수로 입력받아서 하나로 합치는 ArrayList를 구성
		 * List = a b c d e f g h
		 */
		String arr1[] = new String[] {"a", "e", "c", "g"};
		String arr2[] = new String[] {"b", "f", "d", "h", "i"};
		// 합치기 => 정렬
		
		List<String> list = new ArrayList();
		for (int i = 0; i < arr1.length; i++) {
			list.add(arr1[i]);
		}
		for (int i = 0; i < arr2.length; i++) {
			list.add(arr2[i]);
		}
		// 합치기
		System.out.println(list);
		
		// Collections.sort() 정렬
		Collections.sort(list);
		System.out.println(list);
		
		// sort() 사용 정렬
		list.sort(new Comparator<String>() {
			@Override
			public int compare(String o1, String o2) {
				// TODO Auto-generated method stub
				return o1.compareTo(o2); // 오름차순
			}
		});
		System.out.println(list);
		
	}

}

Set

package chap_19;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;

public class _03_Set {

	public static void main(String[] args) {
		/* Set 순서보장x, 중복x
		 * HashSet(대표적인 Set 컬렉션 구현 클래스) 
		 * TreeSet(정렬이 되는 Set)
		 * 순서가 없다. index가 없음.
		 */
		HashSet<String> set = new HashSet<String>();
		set.add("apple");
		set.add("banana");
		set.add("apple");
		set.add("peach");
		set.add("홍길동");
		set.add("이순신");
		
		System.out.println(set);
		for (String tmp : set) {
			System.out.print(tmp + " ");
		}
		System.out.println();
		System.out.println("-------------------------");
		Iterator<String> it = set.iterator();
		while (it.hasNext()) {
			String tmp = it.next();
			System.out.print(tmp + " ");
		}
		System.out.println();
		System.out.println("--------------------------");
		
		// Set정렬 : set은 순서가 없어서 정렬이 안됨.
		// Set => List로 변환한 후 정렬
		List<String> list = new ArrayList<String>(set);
		Collections.sort(list);
		System.out.println(list);
		
		
	}

}
package chap_20;

import java.util.HashSet;
import java.util.Random;
import java.util.TreeSet;

public class _02_Set_Ex1 {

	public static void main(String[] args) {
		/* set 중복저장x
		 * set에 로또번호 6개 성성 후 출력
		 * 랜덤으로 1~45
		 * 
		 * Math 클래스에서 제공하는 랜덤 메서드 사용
		 */
		
		// Random class 별도로 있음.
		// 1 ~ 45까지 랜덤수 출력
		
		HashSet<Integer> set = new HashSet<>();
		
		// 6번 생성x 6개가 중복없이 생성되어 찰때까지
		int size = 6;
		while (set.size() < 6) {
			int random = new Random().nextInt(45) + 1; // (45) = 개수 +1; = 1부터 45개
			set.add(random);
		}
		for (Integer s : set) {
			System.out.print(s + " ");
		}
		System.out.println();
		
		// 오름차순 : set, map은 순서가 없기 때문에 정렬이 안됨.
		// set 중 정렬이 되는 Set => TreeSet
		
		TreeSet<Integer> tree = new TreeSet<>();
		while (tree.size() < 6) {
			int random = new Random().nextInt(45) + 1;
			tree.add(random);
		}
		System.out.println(tree);
	}

}
package chap_20;

import java.util.TreeSet;

public class _03_Set_Ex2 {

	public static void main(String[] args) {
		/* 배열의 점수 중 가장 큰 점수와 가장 작은 점수를 출력
		 */
		int[] score = {80, 99, 48, 68, 58, 88, 77, 100};
		
		TreeSet<Integer> set = new TreeSet<>();
		for (int i = 0; i < score.length; i++) {
			set.add(score[i]);
		}
		
		System.out.println(set);
		
		// 가장 앞에 있는 값(first), 가장 뒤에 있는 값(last)
		System.out.println(set.first()); // 가장 앞
		System.out.println(set.last()); // 가장 뒤
		
		// headSet : 지정한 값 보다 작은 값 출력
		System.out.println(set.headSet(77));
		
		// tailSet : 지정한 값 보다 큰 값 출력
		System.out.println(set.tailSet(77));
		
		// subSet : 검색 범위 뒤쪽 값은 미포함
		System.out.println(set.subSet(70, 90)); // 70은 포함 90은 미포함
		
	}

}

Map

package chap_19;

import java.util.HashMap;
import java.util.Iterator;

public class _04_Map {

	public static void main(String[] args) {
		/* Map
		 * - 값을 2개 쌍으로 저장, key / value 값으로 저장
		 * - key는 중복x, value는 중복o
		 * - HashMap을 가장 많이 사용
		 * 
		 * HashMap<클래스, 클래스> map = new HashMap<클래스, 클래스>();
		 * Map은 값이 2개이기 때문에 향상된 for문, Iterator 사용할 수 없음.
		 * Map => Set으로 구성한 후 출력
		 * 
		 * List, Set => add() : 추가
		 * Map => put() : 추가
		 * getKey() / getValue() // 추출
		 */
		
		HashMap<String, Integer> map = new HashMap<String, Integer>();
		map.put("apple", 2000);
		map.put("banana", 3000);
		map.put("orange", 1000);
		map.put("peach", 4000);
		map.put("kiwi", 5000);
		
		System.out.println(map);
		System.out.println(map.get(map.keySet())); // key 값을 set으로 분리
		System.out.println(map.values()); // value 값만 추출
		
		// key = apple 값의 value만 추출
		System.out.println(map.get("apple"));
		
		System.out.println("----Iterator 출력----");
		Iterator<String> it = map.keySet().iterator();
		while (it.hasNext()) {
			String key = it.next();
			System.out.println(key + " : " + map.get(key));
		}
		
		System.out.println("----향상된 for문----");
		int sum = 0;
		for (String s : map.keySet()) {
			sum += map.get(s); // value의 합계
			System.out.println(s + " : " + map.get(s));
		}
		System.out.println("총 금액 : " + sum);
		System.out.println(map.entrySet()); // key / value를 한쌍으로 set구성
		

		
	}

}
package chap_19;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;

public class _05_Map2 {

	public static void main(String[] args) {
		/* 과목과 점수를 입력받아(Scanner) 출력
		 * 합계, 평균 출력
		 * 종료 키워드가 나올때 까지 반복(0 == 종료)
		 * 과목과 점수를 입력해 주세요.
		 * 국어 89, 수학 78, 0 종료
		 * Map으로 출력 후 합계, 평균 출력
		 */
		Scanner scan = new Scanner(System.in);
		HashMap<String, Integer> map = new HashMap<>();
		
		int sum = 0;
		double avg = 0;
		while (true) {
			System.out.println("과목과 점수를 입력해 주세요.[0 => 종료]");
			System.out.println("과목 입력 =>");
			String subject = scan.next();
			if (subject.equals("0")) { break; }
			System.out.println("점수 입력 =>");
			int score = scan.nextInt();
			map.put(subject, score);
			sum += score;
			avg = (double)sum / map.size();
		}
		System.out.println(map + " 총 합: " + sum + ", 평균: " + avg);
		System.out.println(map.entrySet() + " 총 합: " + sum + ", 평균: " + avg);
		
		System.out.println("----Iterator 출력----");
		Iterator<String> it = map.keySet().iterator();
		while (it.hasNext()) {
			String subject = it.next();
			System.out.print(subject + " : " + map.get(subject));
		}
		System.out.println(" 총 합: " + sum + ", 평균: " + avg);
		
		System.out.println("----향상된 for문 출력----");
		for (String s : map.keySet()) {
			System.out.print(s + " : " + map.get(s));
		}
		System.out.println(" 총 합: " + sum + ", 평균: " + avg);
		
		
		scan.close();
	}

}
package chap_19;

import java.util.HashMap;

public class _07_Homework {
	String product; // 제품명
	Integer price; // 제품가격
	HashMap<String, Integer> map = new HashMap<>(); // 제품명,가격 배열에 저장
	int sum; // 가격 합산
	public _07_Homework() {}
	public _07_Homework(String product, int price) {
		this.product = product;
		this.price = price;
	}
	public static void main(String[] args) {
		/* Map을 이용하여 상품과 가격을 추가하여 합계를 구하시오.
		 * 상품을 Map에 추가하는 값은 메서드로 작업
		 * 1. Map은 main에 만들어 놓고, 메서드로 추가만(매개변수로 받기)
		 * 2. Map을 메서드에서 만들어서 main으로 리턴
		 * 가위, 2500
		 * 크레파스, 3000
		 * 합계 : 5500
		 */
		_07_Homework p = new _07_Homework();
		p.productInput("사과", 5000);
		p.productInput("귤", 3000);
		p.productInput("포도", 4000);
		p.productInput("바나나", 7000);
		p.printPeoduct(p);
		
		
	}
	public void productInput(String product, Integer price) {
		this.product = product;
		this.price = price;
		map.put(product, price);
		sum += price;
	}
	public void printPeoduct(_07_Homework p) {
		System.out.println(p.map + " 총 가격 : " + sum + "원");
	}
	
}
package chap_20;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class _01_MapEx1 {

	public static void main(String[] args) {
		/* 단어장
		 * 단어를(5개) 입력받아 콘솔에 출력하는 기능
		 * --단어장--
		 * hello : 안녕
		 * apple : 사과
		 * orange : 오렌지
		 */
		Scanner scan = new Scanner(System.in);
		Map<String, String> map = new HashMap<String, String>();
		System.out.println("단어장에 5개 단어를 입력 하세요.");
		int cnt = 5;
		while (map.size() < cnt) {
			System.out.println("단어 입력 >>");
			String input1 = scan.next();
			System.out.println("뜻 입력  >>");
			String input2 = scan.next();
			map.put(input1, input2);
		}
		System.out.println();
		System.out.println(map);
		
		for (String s : map.keySet()) {
			System.out.println("단어 => " + s + " , 뜻 => " + map.get(s));
		}
		
		
		scan.close();
	}

}

'Java 공부 기록' 카테고리의 다른 글

람다식(Lambda)  (0) 2023.06.27
지네릭(Generics), 열거형(enum)  (0) 2023.06.27
다형성(Polymorphism)  (0) 2023.06.19
상속(Inheritance), 오버라이딩  (0) 2023.06.14
객체지향언어와 클래스(Class)  (0) 2023.06.09