자바 컬렉션 프레임워크

Dear·2025년 5월 28일

TIL

목록 보기
30/74

💙컬렉션 프레임워크란??

다수의 객체를 저장해두고 필요할 때마다 꺼내서 사용한다. 배열은 저장할 수 있는 객체 수가 배열 생성할 때 결정되서 불특정 수의 객체를 저장할때 문제가 있다.

컬렉션 프레임의 주요 인터페이스List, Set, Map이 있다.

💙 List 컬렉션

객체를 일렬로 늘어놓은 구조를 가지고 있다.

객체를 인덱스로 관리해서 객체를 저장하면 자동 인덱스가 부여되고 인덱스로 객체를 검색, 삭제할 수 있다.

객체 자체를 저장하는 것이 아닌 객체의 번지를 참조한다. 동일한 객체를 중복 저장할 경우 동일한 번지가 참조된다.

null도 저장이 가능한데, 이 경우 해당 인덱스는 객체를 참조하지 않는다.

추가 : add() / 검색 : get() / 삭제 : remove()

ArrayList

ArrayList는 List 인터페이스의 구현 클래스이다.

일반 배열(Array)과 차이점은 저장 용량(capacity)을 초과한 객체들이 들어오면 자동적으로 저장 용량(capacity)이 늘어난다는 것이다.

ArrayList는 인덱스 0부터 차례대로 저장된다.
특정 인덱스의 객체를 제거하면 뒤의 인덱스들이 모두 1씩 앞으로 당겨진다.
특정 인덱스에 객체를 삽입하면 해당 인덱스부터 마지막 인덱스까지 모두 1씩 밀려난다.
빈번한 객체 삭제와 삽입이 일어나면 ArrayList를 사용하는 것이 바람직하지 않다. 그런 경우 LinkedList를 사용하는 것이 좋다.
인덱스 검색이나, 맨 마지막에 객체를 추가하는 경우에는 ArrayList가 더 좋은 성능 발휘한다.

고정된 객체들로 구성된 List를 생성하기

Arrays.asList(T... a)를 사용하면 해당 리스트는 수정할 수 없다.

Vector

ArrayList와 동일한 내부 구조를 가지고 있다.

ArrayList와 다른 점은 Vector는 동기화된(synchronized) 메소드로 구성되어 있어 멀티스레드가 동시에 이 메소드들을 실행할 수 없다. 즉, 안전하게 객체를 추가, 삭제할 수 있다.(Thread safe)

add 되는 동안 다른 메소드들이 동시에 실행할 수 없다.

LinkedList

ArrayList와 사용 방법은 똑같지만 내부 구조가 완전 다르다.
LinkedList는 인접 참조를 링크해서 체인처럼 관리한다.
특정 인덱스의 객체를 제거하면 앞뒤 링크만 변경되고 나머지 링크는 변경되지 않는다. 처음 생성될 때에는 어떠한 링크도 없어서 내부는 비어 있다.

끝에서부터(순차적으로) 추가/삭제하는 경우는 ArrayList가 빠르지만, 중간에 추가 또는 삭제할 경우는 앞뒤 링크 정보만 변경하면 되는 LinkedList가 더 빠르다. ArrayList는 뒤쪽 인덱스들을 모두 1씩 증가/감소시키는 시간이 필요해 처리 속도가 느리다.

💙 Set 컬렉션

List 컬렉션은 저장 순서를 유지하지만, Set 컬렉션은 저장 순서가 유지되지 않는다.

객체를 중복해서 저장할 수 없고, 하나의 null만 저장할 수 있다.

Set은 비선형 구조이기 때문에 ‘순서’의 개념과 ‘인덱스’가 존재하지 않는다.

때문에 값을 추가 / 삭제하는 경우 Set 내부에 해당 값을 검색하여 해당 기능을 수행해야 한다. 이로 인해 처리 속다가 List 구조에 비해 느리다는 것이 단점

HashSet

HashSet은 Set 인터페이스의 구현 클래스이다.

특징

  1. HashSet은 중복된 값을 허용하지 않는다. 값의 존재 유무를 파악할 때 사용할 수 있다.
  2. List 등과 다르게 저장한 순서가 보장되지 않는다.저장 순서를 유지해야 한다면 LinkedHashSet 이용
  3. null 값 허용
  4. HashSet은 객체의 인스턴스 뿐만 아니라 해시코드 역시 비교해서 중복인지 확인한다.

💙 Map 컬렉션

키(key)와 값(value)으로 구성된 Entry 객체를 저장하는 구조를 가지고 있다.

키와 값은 모두 객체이다.

키는 중복 저장될 수 없지만 값은 중복 저장될 수 있다. 기존의 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대치된다.

get()으로 key를 이용하여 value 값을 가져올 수는 있지만 value 값을 이용해서 key값은 가져오는 메소드는 없다. value 값으로 key로 가져오려면 해당 코드 같이 만들어 사용한다.

profile
친애하는 개발자

0개의 댓글