본문 바로가기
💾 Backend/자바

💖자바 컬렉션 🎞🚶‍♀️프레임워크💖

by 정람지 2023. 5. 24.

🎞컬렉션 프레임워크🎞

 java.until.*에서 제공하는 미리 구현한 자료 구조 라이브러리

 

컬렉션 프레임워크 = Collection 인터페이스 + Map 인터페이스

대략적 구조

🎞Collections 클래스

메소드들은 모두 Static 타입

sort()

reverse()

max(),min()

binarySearch()


🎞Collection 인터페이스🎞

하나의 자료를 모아서 관리하는 데 필요한 기능 제공

 

🎞Collection 인터페이스의 메서드

boolean add(E e) 컬렉션에 객체를 추가.
void clear() 컬렉션의 모든 객체 제거
Iterator<E> iterator 컬렉션을 순환할 반복자 반환
boolean remove(Object o) 컬렉션에 매개변수에 해당하는 인스턴스가 존재할 시 제거
int size() 컬렉션에 있는 요소의 개수 반환

 

Collection 인터페이스 = List 인터페이스 + Set 인터페이스


🖼List 인터페이스🚶‍♀️

객체를 순서에 따라 저장하고 유지 / 순차 자료 구조


💥ArrayList 클래스

 

💕자바 ArrayList 클래스💕

 

junggoldchae-coding.tistory.com

벡터와는 달리 현재 용량을 알려주는 메소드 없음


💥Vector 클래스

가변 크기 지원! 객체의 삽입,삭제,이동 쉬움

ArrayList 클래스와는 다르게 동기화를 지원

동기화 : 멀티 스레드 실행 시 메모리에 동시 접근하지 못하도록 순서를 맞추는 것. 메서드 호출 시 잠금, 끝나면 해제하는 식으로 작동

따라서 ArrayList보다 수행 속도가 느림

 

+ vector 사용 대신 synchronized 사용 가능

//1
Vector<Integer> v = new Vector<Integer>(용량);

//2
Vector<Integer> v;
v = new Vector<Integer>();

() 안에 숫자를 넣어 초기 용량을 정할 수 있음

+ null도 add 가능!

+ 크기보다 큰 요소에 add하면 예외발생

 

+

벡터의 크기 == 벡터에 들어 있는 요소 개수.   size()

벡터의 용량 == 벡터가 수용할 수 있는 크기.   capacity()

 

+

remove() 벡터 요소 삭제

 

컬렉션은 객체들만 요소로 다룸!!

v.add(Integer.valueof(4));
v.add(4); // 자동 박싱됨

int k = v.get(0) //자동 언박싱

💥LinkedList 클래스

각 요소가 다음 요소를 가리키는 주소 값을 가짐

요소들을 양방향으로 연결하여 관리함

배열 LinkedList
- 메모리의 물리적 순서 = 논리적 순서

- 자료 추가/ 제거 시 연속된 자료 구조 구현
- 크기 증가 시 다른 큰 배열 생성 후 복사시킴

- 탐색에는 물리적으로 구조가 연결되어 있어 빠름
- 물리적인 메모리는 떨어져 있지만 논리적 앞뒤 순서 존재

- 자료를 추가/ 제거하는 데 시간이 적게 걸림(메모리만 변경, 가비지 콜렉터가 수집)
- 크기를 동적으로 증가시킬 수 있음

-탐색은 비교적 느림

따라서 자료의 변동(추가,삭제) 가 많은 경우에는 LinkedList,

적은 경우에는 배열 쓰기.


🖼Set 인터페이스🚶‍♀️

중복을 허용하지 않는 "집합"

순서도 존재하지 않음


💥Hash 클래스

//import java.util.hashset; 임포트

HashSet<String> hashset = new HashSet<String>();

동일한 객체는 중복저장되지 않음

=> 동일함에 대한 정의가 새로 필요할 경우엔 해주어야 함( ex 회원아이디가 같으면 같은 것 )

=> equals() 와 hashCode() 메서드를 재정의하기!


💥TreeSet 클래스

Tree로 시작하는 클래스들(컬렉션 프레임워크 중)은 결과 출력 시 결과 값이 정렬됨

// import java.util.TreeSet;

TreeSet<String> treeSet = new TreeSet<String>();

자바는 정렬할 때 "이진 트리"를 씀

어떤 기준으로 노드를 비교하여 트리를 형성해야 하는가?

=>

☄️Comparable 인터페이스 / Comparator 인터페이스 이용하기

정렬을 구현할 수 있게 해 주는 인터페이스

정렬 기준 값이 있는 클래스에 상속시킴

public class 클래스 implements Comparable<T>{...}

각각 compareTo() / compare(인자 2개) 추상메서드를 재정의

=> 리턴값의 차이로 비교함

(내림차순 정렬 시 리턴값에 -1 곱해주면 됨!)

 

이때 사용할 TreeSet 클래스의 생성자에 Comparable를 구현한 객체를 매개변수로 전달해야 함


💥Iterator

순서가 없는 클래스에서  요소 순회 등을 할 때 사용

Iterator ir = 자료구조.iterator();
boolean hasNext() 이후에 요소가 더 있는지 체크
E next() 다음에 있는 요소 반환

활용

while (ir.hasNext(){
	// ir.next() 를 이용한 코드
}

🎞Map 인터페이스🎞

쌍( key - value 쌍) 으로 된 자료들을 관리하는 데 유용한 기능 제공 (검색용 자료구조)

key 값은 중복 불가

value 값은 중복 가능

 

🎞Map 인터페이스의 메서드

V put( k key, V value) 키값에 해당하는 밸류값을 맵에 넣습니다.
V get(K key) 키에 해당하는 밸류값을 반환합니다
boolean isEmpty 맵이 비었는지 여부를 파악합니다
boolean constainsKey(Object key) 맵에 해당 키가 있는지 여부를 반환합니다
boolean constainsValue(Object value) 맵에 해당 밸류가 있는지 여부를 반환합니다.
Set keyset 키 집합을 셋으로 반환합니다
Collection values 밸류를 컬렉션으로 반환합니다
V remove(key) 키가 있는 경우 삭제합니다
boolean remove(Object key, Object value) 키가 있는 경우 키에 해당하는 밸류가 매개변수와 일치할 때 삭제합니다.

💥HashMap 클래스

// import java.util.HashMap

public HashMap<Integer, String> hashmap = new HashMap<Integer, String>;

hashmap.put(1, "hamster");

put(키,값), get(키)

- 요소의 삽입 삭제가 매우 빠름

- 요소 검색은 더욱 빠름

- 없는 키값 get하면 null 반환

- keySet() 모든 키를 컬렉션으로 만들어 리턴! (이후 Iterator로 뽑아보기)

 

💥HashTable 클래스

멀티스레드를 위한 동기화 제공

 

💥TreeMap 클래스

TreeSet 클래스 와 유사!


❓배열 용량(capacity)

size()(유효한 값이 저장된 크기)와는 다르다.

Arraylist() 기본 크기는 10개

용량 부족 시( add(), insert() 사용) 큰 용량의 배열 생성 후 복사함

 

❓스레드

=작업 단위 

하나의 스레드 수행 => 단일 스레드

두개 이상의 스레드 수행. => 멀티 스레드 

멀티스레드 수행 시 같은 메모리 공간에 접근하기 때문에 오류가 생길 수 있음

 

❓가비지 콜렉터

프로그램이 동적으로 할당했던 메모리 영역 중에서 필요없게 된 영역을 해제하는 기능

 

❓해시 테이블

해시 방식의 자료를 저장하는 공간