[JAVA] Collection Framework(컬렉션 프레임워크)

suyeon·2022년 7월 6일
0

JAVA

목록 보기
2/4
post-thumbnail
post-custom-banner

📌 Collection Framework

Collection : 데이터를 수집하기 위한 집합
Framework : 틀, 구조

Collection Framework : 데이터를 수집하여 저장하기 위해 사용할 수 있도록 정의해 놓은 클래스 집합

  • 향상된 배열
    - 배열은 선언 시 정한 크기를 변경할 수 없고, 항목을 저장, 삭제, 추가하는 메소드가 없기 때문에 직접 인덱스를 사용해야 함.
  • 자료 구조 : 데이터를 저장하는 공간의 구조
  • 기존의 순수 배열의 성능 향상(입출력), 사용법을 개량 > 클래스
  • 내부에 순수 배열을 가지고 있음 > public 메소드들을 통해서 성능 or 사용법 개량
  • 길이 가변 > 방의 개수를 마음대로 늘리고 줄이는게 가능

[ 배열은 크기를 한번 설정하면 바뀔수가 없는데 어떻게 길이가 가변이지❓ ]

  • 배열 처음 4byte, 배열 크기가 부족하면 원래 크기 x 2 해서 새로운 배열을 만듦
  • 즉, 시작 주소가 바뀜 > 우리는 배열의 크기가 늘어나는것처럼 보임

[ 컬렉션은 왜 사용 하는가❓ ]

  • 데이터 관리를 직접 할 필요가 없다.
  • 배열의 크기를 알아서 늘려준다.]

[ 종류 ]

  1. List : 순차적, 데이터의 중복을 허용 O
    • ArrayList
    • Stack
    • Queue
    • LinkedList
    • Vector(legacy)
  1. Set : 비순차적, 데이터의 중복을 허용 X
    • HashSet
    • TreeSet
  1. Map : (key, value)의 piar으로 이루어진 데이터의 집합. 비순차적, 키는 중복 X, 값은 중복을 허용 O
    • HashMap
    • TreeMap
    • HashTable(legacy)
    • Properties(legacy)

📌 List 계열

1️. ArrayList

ArrayList<T> list = new ArrayList<T>();
  • 순수 배열과 구조가 가장 유사함 > index 사용해서 element(요소)에 접근
  • 사용 빈도가 가장 높음

✅ 사용법

  1. 요소 추가
  • boolean add(T value)
  • 배열의 맨 마지막에 추가함 > Append Mode
list.add("바나나");
list.add("딸기");
list.add("사과");
list.add("포도");
list.add("파인애플");	
  • void add(int index, T value)
  • 배열의 원하는 위치에 요소를 추가 > Insert Mode > 삽입(새치기)
  • 삽입된 방 이후의 모든 요소가 right shift가 발생함
list.add(2, "망고");
  1. 요소 수정
  • String set(int index, T newValue)
list.set(2, "파인애플");
  1. 요소 개수
  • int size()
list.size()
  1. 요소 접근
  • T get(int index)
list.get(0)
list.get(list.size() - 1) // 마지막 요소
  1. 요소 삭제
  • 순수 배열은 요소 삭제 불가능
  • 컬렉션은 요소 삭제 가능
  • T remove(int index) > 방 번호를 찾아서 삭제
  • boolean remove(T value) > 값을 찾아서 삭제 > 처음 만나는 요소를 삭제
  • 삭제된 방 이후의 모든 요소는 left shift가 발생
list.remove(2);
list.remove("파인애플");
  1. 초기화
  • 모든 요소 삭제
  • void celar()
list.clear();
  1. 요소 검색
  • int indexOf(T value)
  • int lastIndexOf(T value)
  • boolean contains(T value)
list.indexOf("사과")
list.contains("사과")
  1. 빈 배열 확인
  • boolean isEmpty()
list.isEmpty()
list.size() == 0

💡 배열(고정) vs ArrayList(불확실)

  • 길이로 선택해

💡 컬렉션에 반복적으로 데이터에 넣는 행동으로 생기는 문제점

  • 가비지 발생 > 비용 발생
  • 배열 복사 발생 > 비용 발생
  • 해결방법 : ArrayList의 초기 길이를 지정하면 됨

💡 ADT(Adstract Data Type, 추상적 자료형)

  • Stack, Queue
  • 물리적인 특성을 가지는것이 아니라 사용법에 특성을 가진다.

2. Stack

  • LIFO(후입선출)
  • 저장소에 나중에 들어간 요소가 먼저 나옴
  • ex) 메모리 구조(Stack), 되돌리기(Ctrl+Z), 다시하기(Ctrl+Y)

✅ 사용법

  1. 요소 추가
  • T push(T value)
stack.push("빨강");
stack.push("파랑");
stack.push("노랑");
  1. 요소 개수
  • int size()
stack.size()
  1. 요소 접근(꺼내기 == 삭제)
  • 복구 불가능
  • 마지막 요소부터 꺼내짐
  • T pop
stack.pop()
  1. 빈 배열 확인
  • boolean isEmpty()
stack.isEmpty()
list.size() == 0
  1. 요소 확인(읽기 + 삭제 X, 꺼내기 X)
  • T peek
stack.peek()

3. Queue

  • FIFO(선입선출)
  • 저장소에 먼저 들어간 요소가 먼저 나옴
  • ex) 줄서기

✅ 사용법

  1. 요소 추가
  • boolean add(T value)
queue.add("빨강");
queue.add("파랑");
queue.add("노랑");
  1. 요소 개수
  • int size()
queue.size()
  1. 요소 접근(꺼내기)
  • 복구 불가능
  • 첫번째 요소부터 꺼내짐
  • 요소가 비어있어도 에러 발생 X
  • T poll
queue.poll()
  1. 빈 배열 확인
  • boolean isEmpty()
queue.isEmpty()
list.size() == 0
  1. 요소 확인(읽기 + 삭제 X, 꺼내기 X)
  • T peek
queue.peek()
  1. 요소 초기화
  • T clear
queue.clear();

📌 Set 계열

1. HashSet

  • 같은 문자열을 갖는 String 객체는 동등한 객체로 간주됨.

✅ 사용법

  1. 요소 추가
  • boolean add(T value)
set.add("사과");
set.add("바나나");
set.add("딸기");
  1. 요소 개수
  • set size()
set.size()
  1. 요소 삭제
  • V remove(K key)
set.remove();
  1. 요소 읽기
  • Iterator iterator()
Iterator<String> iter = set.iterator();

[ 예제 ]

import java.util.HashSet;
import java.util.Iterator;

public class Ex02 {
	public static void main(String[] args) {
		
		HashSet<Integer> hs = new HashSet();
		//Generic(제네릭)
		
		//hs.add("hello");
		hs.add(10); // new Integer(10) auto-boxing
		hs.add(20);
		hs.add(30);
		hs.add(20);
		
		// 데이터를 꺼내기
		Iterator<Integer> it = hs.iterator(); // 반복자
		while(it.hasNext()) { // 항목이 있는지 확인
			System.out.println(it.next()); // 요소를 하나씩 가져옴 / 출력 결과의 순서는 의미 없다.
		}
		
		System.out.println();
		System.out.println(hs.size());
		System.out.println(hs.isEmpty());
		System.out.println(hs.remove(30));
		System.out.println(hs.contains(30));
		System.out.println(hs.size());
		System.out.println();
		
		it = hs.iterator(); // 반복자
		while(it.hasNext()) { // 커서가 이미 끝에 있기 때문에 출력 X > 반복자를 다시 생성하면 출력 O
			System.out.println(it.next());
		}
	}
}

📌 Map 계열

1. HaspMap

✅ 사용법

  1. 요소 추가
  • V put(K key, V value)
map.put("국어", 100);
map.put("영어", 90);
map.put("수학", 80);
  1. 요소 개수
  • int size()
map.size()
  1. 요소 읽기
  • V get(k key)
map.get()
  1. 일괄 탐색 > for > 불가능
  2. 요소 수정
  • V put(k key, V value)
map.put()
  1. 요소 검색
  • boolean containsKey(K key)
  • boolean containsValue(V value)
map.containsKey()
map.containsValue()
  1. 요소 삭제
  • V remove(K key)
map.remove();
  1. 초기화
  • V clear()
map.clear();

[ 예제 ]

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

public class Ex03 {
	public static void main(String[] args) {
		
		// key -> value 매핑
		HashMap<Integer, Info> hm = new HashMap();
		
		//hm.put("hello", 100);
		//hm.put(10, "test");
		hm.put(1, new Info("홍길동", 20));
		
		//System.out.println(hm.get(key));
		System.out.println("[value 값]");
		System.out.println(hm.get(10));
		//System.out.println(hm.get("hello"));
		System.out.println(hm.get(1));
		System.out.println(hm.get(3213));
		System.out.println();
		
		System.out.println("[key 값]");
		Set<Integer> keys = hm.keySet();
		Iterator<Integer> it = keys.iterator();
		while(it.hasNext()) {
			System.out.println(it.next());
		}
		
		System.out.println();

		System.out.println("[key 값]");		
		for(Integer o : keys) {
			System.out.println(o);
		}
		
		System.out.println();
		
		System.out.println("[value 값]");		
		Collection<Info> values =  hm.values();
		for(Info o : values) {
			System.out.println(o);
		}
		
		System.out.println();
		
		System.out.println("[key:vlaue 값]");
		it = keys.iterator();
		while(it.hasNext()) {
			Integer key = it.next();
			Info value = hm.get(key);
			System.out.println(key + ":" + value);
		}
		
	}

}

[ 출력값 ]

[value 값]
null
Info@48cf768c
null

[key 값]
1

[key 값]
1

[value 값]
Info@48cf768c

[key:vlaue 값]
1:Info@48cf768c
post-custom-banner

0개의 댓글