[JAVA 개념정리] 컬렉션 프레임워크(Collection Framework)

Doyeon·2023년 1월 26일
0

JAVA 개념정리

목록 보기
13/13
post-thumbnail

컬렉션 프레임워크

  • 데이터 군을 저장하는 클래스들을 표준화한 설계
    • 컬렉션(Collection) : 다수의 데이터. 데이터 그룹
    • 프레임워크(Framework) : 표준화된 프로그램

컬렉션 프레임워크 핵심 인터페이스

  • List : 순서가 있는 데이터 집합(중복 O)
    • ArrayList, LinkedList, Stack, Vector 등
  • Set : 순서를 유지하지 않는 데이터 집합(중복 X)
    • HashSet, TreeSet 등
  • Map : 키(key)와 값(value)의 쌍으로 이루어진 데이터 집합. 순서 X, 키 중복 X, 값 중복 O

Collection 인터페이스

  • List와 Set에서 공통된 부분을 뽑아 Collection 인터페이스로 정의

List 인터페이스

  • 중복 O, 순서 O

Set 인터페이스

  • 중복 X, 순서 X

Map 인터페이스

  • 키 중복 X, 값 중복 O

ArrayList

  • 순서 O, 중복 O
  • 모든 종류의 객체를 담을 수 있다.

ArrayList 추가 & 삭제

  1. 삭제할 데이터의 아래 있는 데이터를 한 칸씩 위로 복사 → 삭제할 데이터 덮어쓴다.
  2. 데이터가 한 칸씩 위로 이동했으므로 마지막 데이터 null로 변경
  3. size 값 1 감소
  • 순차적으로 저장, 마지막에 저장된 것부터 삭제 → 데이터 옮기지 않아도 되기 때문에 작업시간 짧음
  • 배열 중간에 객체 추가 or 삭제 → 데이터 위치 이동시켜야 하기 때문에 작업시간 오래 걸림

LinkedList

  • 불연속적으로 존재하는 데이터를 서로 연결(link)한 형태
    class Node {
    		Node next;  // 다음 요소의 주소를 저장
    		Object obj; // 데이터를 저장
    }

LinkedList 추가 & 삭제

  • [삭제] 삭제 대상의 이전 요소가 삭제 대상의 다음 요소를 참조하도록 변경 → 참조 하나만 변경하면 됨
  • [추가] 추가하고자 하는 위치의 이전 요소(A)가 추가 대상(B)을 참조하도록, 추가 대상(B)이 그 다음 요소(C)를 참조하도록 변경 → 처리속도 빠름

ArrayList vs LinkedList

  • ArrayList
    • 접근시간(읽기) 빠르다.
    • 추가/삭제 느리다.(순차적 추가삭제는 빠르다.)
    • 비효율적인 메모리 사용
  • LinkedList
    • 접근시간(읽기) 느리다.
    • 추가/삭제 빠르다.
    • 데이터가 많을수록 접근성이 떨어진다.

Stack & Queue

  • Stack
    • LIFO(Last In First Out)
    • ArrayList 등 배열기반 컬렉션 클래스 적합
  • Queue
    • FIFO(First In First Out)
    • LinkedList 구현 적합

Iterator, ListIterator, Enumeration

  • Iterator : 컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스
  • ListIterator : Iterator에 양방향 조회 기능 추가(List를 구현한 경우만 사용)
  • Enumeration : Iterator의 구버전
public interface Collection {   // Collection 인터페이스
			...
		public Iterator iterator(); // Iterator를 구현한 클래스의 인스턴스를 반환
			...
}
  • Collection 인터페이스의 자손인 List, Set 인터페이스를 구현하는 컬렉션은 iterator() 가 각 컬렉션 특징에 맞게 작성되어 있다.
List list = **new ArrayLsit()**;  // 다른 컬렉션으로 변경할 때 이 부분만 고치면 된다.
Iterator it = list.iteratoir();

while(it.hasNext()) {  // boolean hasNext() 읽어올 요소 있는지 확인
		System.out.println(it.next()); // Object next() 다음 요소를 읽음
}

Map과 Iterator

  • Map 인터페이스를 구현한 컬렉션 클래스는 keySet(), entrySet() 과 같은 메서드를 통해 키와 값을 Set 형태로 얻은 후 iterator() 를 호출해야 한다.
    Map map = new HashMap();
    
    Iterator it = map.entrySet().iterator();

Arrays 메서드

배열의 복사 - copyOf(), copyOfRange()

  • copyOf() : 배열 전체 복사
  • copyOfRange() : 배열 일부 복사해서 새로운 배열 만들어 반환
    int[] arr = {0, 1, 2, 3, 4};
    int[] arr2 = Arrays.copyOf(arr, arr.length);  // arr2 = [0,1,2,3,4]
    int[] arr3 = Arrays.copyOf(arr, 3);           // arr3 = [0,1,2]
    int[] arr4 = Arrays.copyOfRange(arr, 2, 4);   // arr4 = [2,3]

배열 채우기 - fill(), setAll()

  • fill() : 배열의 모든 요소를 지정된 값으로 채운다.
  • setAll() : 매개변수로 함수형 인터페이스를 받는다.
    int[] arr = new int[5];
    Arrays.fill(arr, 9);    // arr = [9,9,9,9,9]
    Arrays.setAll(arr, (i) -> (int)(Math.random()*5)+1); // arr=[1,5,2,1,1]

배열의 정렬과 검색 - sort(), binarySearch()

  • sort() : 배열 정렬
  • binarySearch() : 배열에서 지정된 값이 저장된 위치(index) 반환 ← 배열이 반드시 정렬된 상태여야 함
    int[] arr = {3, 2, 0, 1, 4};
    Arrays.sort(arr);                       // [0,1,2,3,4]
    int idx = Arrays.binarySearch(arr, 2);  // idx=2

비교와 출력 - equals(), toString()

  • equals() : 두 배열에 저장된 모든 요소 같으면 true
    • 다차원 배열 비교는 deepEquals()
  • toString() : 배열의 모든 요소 문자열로 출력
    • 다차원 배열 출력은 deepToString()

변환 - asList()

  • 배열을 List에 담아 반환(배열 생성없이 나열도 가능)
  • asList()가 반환한 List의 크기는 변경할 수 없다. 추가, 삭제 불가. 저장된 내용 변경은 가능
  • 크기 변경할 수 있는 List가 필요하다면,
    List list = new ArrayList(Arrays.asList(1,2,3,4,5));

Comparator와 Comparable

  • 컬렉션을 정렬하는데 필요한 메서드를 정의한 인터페이스
  • Comparable : 기본 정렬기준 구현할 때(오름차순)
    • 같은 타입의 인스턴스끼리 서로 비교할 수 있는 클래스들(Integer, String, Date, File ..)
  • Comparator : 기본 정렬기준 외에 다른 기준으로 정렬하고자 할 때
public interface Comparator {
		int compare(Object o1, Object o2);   // o1과 o2를 비교
		boolean equals(Object obj);
}

public interface Comparable {
		int compareTo(Object o);   // 객체 자신(this)과 o를 비교
}
  • compare , compareTo
    • 0 → 같다
    • 음수 → 오름차순
    • 양수 → 내림차순

HashSet

  • Set 인터페이스를 구현한 가장 대표적인 컬렉션
  • 중복 X, 순서X
    • 순서 유지하고 싶다면 → LinkedHashSet
  • add 메서드는 새롭게 추가하려는 요소의 equals(), hashCode() 를 호출 → 기존에 저장된 요소와 같은지 판별하기 위해
  • 만일, set에 인스턴스를 만들어 넣는다면, 목적에 맞게 equals(), hashCode() 오버라이딩 필요
    public boolean equals(Object obj) {
    		if(!(obj instanceof Person) return false;
    		Person p = (Person)obj;
    		return name.equals(p.name) && age==p.age;
    }
    
    public int hashCode() {
    		return Objects.hash(name, age);
    }

TreeSet

  • 이진 탐색 트리(binary search tree) 형태로 데이터 저장
  • 중복 X, 순서 X, 정렬 O
  • 검색(범위검색)과 정렬에 유리
  • 추가 삭제에 시간이 걸린다.
  • TreeSet에 저장되는 객체가 Comparable을 구현하던가, Comparator를 제공해서 두 객체를 비교할 방법을 알려주지 않으면 TreeSet에 객체 저장할 때 예외 발생

TreeSet 메서드

  • subSet(Object from, Object to) : 범위 검색(from ~ to) 결과 반환(to는 범위 포함 X)
  • headSet(Object to) : 지정된 객체보다 작은 값의 객체들 반환
  • tailSet(Object to) : 지정된 객체보다 큰 값의 객체들 반환

HashMap

  • 키(Key) : 유일해야 함
  • 값(Value) : 데이터 중복 허용
  • (Key, Value) → (Object, Object)
  • 저장순서 X(해싱 구현항 컬렉션 클래스는 저장순서 X)

[참고] <Java의 정석 - 기초편>

profile
🔥

0개의 댓글