JAVA/이것이 자바다

이것이 자바다 | 15장 컬렉션 프레임워크 (1)

한 면만 쓴 종이 2022. 7. 5. 15:06

컬렉션 프레임워크: 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 java.util 패키지에 컬렉션과 관련된 인터페이스와 클래스들을 포함시켜 놓은 것

 

15.2 List 컬렉션

  • list 컬렉션은 객체 자체를 저장하는 것이 아니라 객체의 번지를 참조함
  • null 도 저장이 가능함 (해당 인덱스는 객체 참조를 하지 않음)

1. ArrayList

  • 저장용량을 초과한 객체들이 들어오면 자동적으로 저장 용량이 늘어남
  • 객체를 추가하면 인덱스 0부터 저장됨
  • 특정 인덱스의 객체를 제거하면 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨짐

        => 빈번한 삭제 삽입이 일어날 경우 사용이 바람직하지 않음 but, 인덱스 검색이나 맨 마지막에 객체를 추가하는 경우 좋음

 

import.java.util.*;

public class ArrayListExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>(); // ArrayList 생성
        
        list.add("Java"); // 객체 저장(추가)
        
        int size = list.size(); // 저장된 총 객체 수 얻기
        
        String skill = list.get(2); // 2번 인덱스의 객체 얻기
        
        list.remove(2); // 2번 인덱스 객체 삭제
    }
}

 

고정된 객체들로 구성된 List 생성

List<T> list = Arrays.asList(T... a);

< 사용 예 >

List<String> list1 = Arrays.asList("홍길동", "신용권", "김자바");

 

2. Vector

  • ArrayList와 동일한 내부구조를 가짐
  • ArrayList와 다른 점은 스레드가 안전하다는 것

*스레드가 안전한다: Vector은 동기화된 메소드로 구성되어 있기 때문에 멀티스레드가 동시에 이 메소드들을 실행할 수 없고, 하나의 스레드가 실행을 완료해야만 다른 스레드를 실행할 수 있음 -> 멀티 스레드 환경에서 안전하게 객체를 추가, 삭제 가능

 

3. LinkedList

  • ArrayList와 사용 방법은 같지만, 내부구조는 완전 다름
  • 인접 참조를 링크해서 체인처럼 관리 -> 빈번한 객체 삽입과 삭제가 일어나는 곳에서 더 좋은 성능 발휘함
  • 처음 생성될 때 어떠한 링크도 만들어지지 않기 때문에 내부는 비어 있다고 보면 됨
List<E> list = new LinkedList<E>();

 

< 사용 예 >

List<String> list = new LinkedList<String>();

 

∴ 끝에서부터 추가/삭제 하는 경우 ArrayList가 빠르지만, 중간에 추가/삭제할 경우 LinkedList가 빠름

 

15.3 Set  컬렉션

  • 저장 순서를 유지하지 않음
  • 중복 저장 불가능 -> 하나의 null만 저장 가능

    Iterator<E> iterator() : 저장된 객체를 한 번씩 가져오는 반복자 리턴

        => Set 컬렉션은 인덱스로 객체를 검색해서 가져오는 메소드가 없지만, 전체 객체를 대상으로 한 번씩 반복해서 가져오는 반복자(Iterator)를 제공

< iterator 사용 예 >

Set<String> set = ...;
Iterator<String> iterator = set.iterator();

< Iterator 인터페이스에 선언된 메소드 >

리턴 타입 메소드명 설명
boolean hasNext() 가져올 객체가 있으면 true를 리턴하고 없으면 false 리턴
E next() 컬렉션에서 하나의 객체를 가져옴
void remove() Set 컬렉션에서 객체를 제거
Set<String> set = ...;
Iterator<String> iterator = set.iterator();
// 저장된 객체 수 만큼 반복
while(iterator.hasNext()) {
    // String 객체 하나를 가져옴
    String str = iterator.next();
}

 

1. HashSet

 

< 사용 예 >

Set<String> set = new HashSet<String>();

 

hashCode()로 비교한 후, 동일한 해시코드가 있으면 equals() 로 다시 비교함 => 중복 저장 X

 

 

15.4 Map 컬렉션

메소드 설명
Set<Map.Entry<K, V>> entrySet() 키와 값의 쌍으로 구성된 모든 Map.Entry 객체를 Set에 담아서 리턴
Set<K> keySet() 모든 키를 Set 객체에 담아서 리턴
Collection<V> values() 저장된 모든 값을 Collection 에 담아서 리턴

 

< Set<Map.Entry<K, V>> entrySet() 사용법 > 

Set<Map.Entry<String, Integer>> entrySet = map.entrySet();

 

< 저장된 전체 객체를 대상으로 객체를 하나씩 얻는 2가지 방법 >

  1. keySet() 메소드로 모든 키를 Set 컬렉션으로 얻은 다음, 반복자를 통해 키를 하나씩 얻고 get() 메소드를 통해 값을 얻기
  2. entrySet() 메소드로 모든 Map.Entry 를 Set 컬렉션으로 얻은 다음, 반복자를 통해 Map.Entry를 하나씩 얻고 getKey()와 getValue() 메소드를 이용해 키와 값 얻기

1. HashMap

 

키와 값의 타입은 기본 타입을 사용할 수 없고 클래스 및 인터페이스 타입만 가능함

Map<String, Integer> map = new HashMap<String, Integer>();

 

2. Hashtable

 

  • HashMap과 동일한 내부 구조를 가짐
  • HashMap과의 차이점은 Hashtable은 동기화된 메소드로 구성되어있기 때문에 멀티 스레드가 동시에 이 메소드들을 실행할 수 없고, 하나의 스레드가 실행을 완료해야만 다른 스레드를 실행할 수 있음 => 스레드가 안전함
Map<String, Integer> map = new Hashtable<String, Integer>();

 

3. Properties

  • Hashtable의 하위 클래스 - 다른점: 키와 값을String 타입으로 제한