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

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()

HashMap과 TreeMap – 순서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 |