[Java] Chapter 15. 컬렉션 자료구조

SeungWoo Cha·2025년 9월 14일

[Java] 이것이 자바다

목록 보기
13/17

Chapter 15. 컬렉션 자료구조

15.1. 컬렉션 프레임워크

자바 컬렉션 프레임워크는 객체를 효율적으로 저장·검색·삭제할 수 있도록 자료구조를 제공한다.
핵심 인터페이스는 CollectionMap이다.

1. Collection

  • List (ArrayList, Vector, LinkedList)
    : 저장 순서를 유지, 중복 저장 가능
  • Set (HashSet, TreeSet)
    : 저장 순서 유지 안 함, 중복 저장 불가

2. Map

  • (HashMap, Hashtable, TreeMap, Properties)
    : 키-값(Entry)으로 저장,
    키는 중복 저장 불가, 값은 중복 가능

15.2. List Collection

특징

  • 객체 저장 시 인덱스가 부여된다.
  • 인덱스로 검색·삭제 가능.
  • 객체의 번지를 저장하므로 같은 객체를 중복 저장할 수 있다.
  • null 저장 가능.

주요 메소드

  • 추가

    • boolean add(E e) : 맨 끝에 추가
    • void add(int index, E element) : 인덱스에 추가
    • E set(int index, E element) : 지정 인덱스의 객체를 변경
  • 검색

    • boolean contains(Object o) : 포함 여부
    • boolean isEmpty() : 비었는지 확인
    • int size() : 저장된 객체 수
    • E get(int index) : 인덱스의 객체 반환
  • 삭제

    • void clear() : 전체 삭제
    • E remove(int index) : 인덱스의 객체 삭제
    • boolean remove(Object o) : 해당 객체 삭제

1) ArrayList

  • 크기 제한 없이 객체 저장 가능.
  • 삭제 시 뒤의 모든 인덱스를 앞으로 당김 → 삽입/삭제가 빈번하면 성능 저하.
  • 선언 예시:
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
System.out.println(list.get(0)); // A

2) Vector

  • 내부 구조는 ArrayList와 동일.
  • 동기화(synchronized) 되어 있어 멀티스레드 환경에서 안전.
List<Integer> vector = new Vector<>();
vector.add(1);
vector.add(2);
System.out.println(vector.size()); // 2

3) LinkedList

  • 인접 객체를 체인(링크) 형태로 연결.
  • 삽입/삭제 시 인덱스 이동이 없어 빠르다.
List<String> linkedList = new LinkedList<>();
linkedList.add("X");
linkedList.add("Y");
linkedList.remove("X");
System.out.println(linkedList); // [Y]

15.3. Set 컬렉션

특징

  • 저장 순서 유지 안 됨.
  • 중복 저장 불가, null은 1개 가능.
  • 구현체: HashSet, LinkedHashSet, TreeSet.

주요 메소드

  • 추가

    • boolean add(E e) : 성공 시 true, 중복 시 false
  • 검색

    • boolean contains(Object o)
    • boolean isEmpty()
    • int size()
    • Iterator<E> iterator() : 반복자 획득
  • 삭제

    • void clear()
    • boolean remove(Object o)

1) HashSet

  • hashCode() 값과 equals() 값이 같으면 같은 객체로 간주.
Set<String> set = new HashSet<>();
set.add("Java");
set.add("Java"); // 중복 저장 안 됨
System.out.println(set.size()); // 1

2) Iterator

  • Set은 인덱스로 접근 불가 → 반복자 사용
Set<String> set = new HashSet<>();
set.add("A");
set.add("B");

Iterator<String> iter = set.iterator();
while (iter.hasNext()) {
    String element = iter.next();
    System.out.println(element);
}

Iterator 메소드

  • boolean hasNext() : 다음 요소 존재 여부
  • E next() : 다음 요소 반환
  • void remove() : 최근 반환한 객체 삭제

15.4. Map 컬렉션

특징

  • Key-Value 쌍(Entry) 형태 저장.
  • 키 중복 불가, 값 중복 가능.
  • 같은 키로 저장하면 기존 값이 덮어쓰기 됨.

주요 메소드

  • 추가

    • V put(K key, V value)
  • 검색

    • boolean containsKey(Object key)
    • boolean containsValue(Object value)
    • boolean isEmpty()
    • int size()
    • Set<Map.Entry<K,V>> entrySet()
    • Set<K> keySet()
    • Collection<V> values()
  • 삭제

    • void clear()
    • V remove(Object key)

1) HashMap

  • hashCode()equals() 기준으로 동일 키 여부 판단.
Map<Integer, String> map = new HashMap<>();
map.put(1, "Java");
map.put(2, "Python");
System.out.println(map.get(1)); // Java

2) Hashtable

  • HashMap과 구조 동일.
  • 동기화된 메소드 제공 → 멀티스레드 환경에서 안전.
Map<String, String> table = new Hashtable<>();
table.put("id", "admin");
System.out.println(table.containsKey("id")); // true

3) Properties

  • Hashtable의 하위 클래스.
  • 문자열(Key-Value) 쌍만 저장.
  • 주로 설정 파일(.properties) 로 사용됨.
Properties props = new Properties();
props.setProperty("username", "admin");
props.setProperty("password", "1234");

System.out.println(props.getProperty("username")); // admin

15.5. 검색 기능을 강화시킨 컬렉션

1) TreeSet

  • 이진 트리 기반Set 컬렉션.
  • 객체를 저장하면 자동 정렬된다. (기본은 오름차순)
TreeSet<Integer> treeSet = new TreeSet<>();
treeSet.add(3);
treeSet.add(1);
treeSet.add(2);

System.out.println(treeSet); // [1, 2, 3]

2) TreeMap

  • 이진 트리 기반의 Map 컬렉션.
  • TreeSet과 달리 키-값(Entry) 를 저장.
  • 저장 시 키를 기준으로 자동 정렬됨.
TreeMap<Integer, String> treeMap = new TreeMap<>();
treeMap.put(2, "B");
treeMap.put(1, "A");
treeMap.put(3, "C");

System.out.println(treeMap); // {1=A, 2=B, 3=C}

3) Comparable & Comparator

  • TreeSetTreeMap에 저장되는 객체는 자동 정렬되며,
    정렬 기준은 객체가 Comparable 인터페이스를 구현해야 한다.
  • 정렬 기준을 외부에서 부여하려면 Comparator 구현 객체를 제공한다.

(1) Comparable

  • 객체 자체에 **비교 기준(자연 순서)**을 구현.

  • int compareTo(T o)

    • 같으면 0
    • 작으면 음수
    • 크면 양수
public class Person implements Comparable<Person> {
    int age;
    public Person(int age) { this.age = age; }

    @Override
    public int compareTo(Person o) {
        return Integer.compare(this.age, o.age);
    }
}

(2) Comparator

  • Comparable을 구현하지 않은 객체라도,
    외부 비교자(Comparator) 를 제공하면 정렬 가능.

  • int compare(T o1, T o2)

    • 같으면 0
    • 앞에 오게 하려면 음수
    • 뒤에 오게 하려면 양수
public class Fruit {
    int price;
    public Fruit(int price) { this.price = price; }
}

public class FruitComparator implements Comparator<Fruit> {
    @Override
    public int compare(Fruit o1, Fruit o2) {
        return Integer.compare(o1.price, o2.price);
    }
}

// 사용 예시
TreeSet<Fruit> set = new TreeSet<>(new FruitComparator());
set.add(new Fruit(3000));
set.add(new Fruit(1000));
set.add(new Fruit(2000));

15.6. LIFO, FIFO 컬렉션

자바는 스택(LIFO)큐(FIFO) 자료구조를 제공한다.


1) Stack

  • Stack 클래스는 LIFO(후입선출) 자료구조.
Stack<String> stack = new Stack<>();
stack.push("A");
stack.push("B");
System.out.println(stack.pop());  // B
System.out.println(stack.peek()); // A

주요 메소드

  • E push(E item) : 객체 저장
  • E pop() : 맨 위 객체 꺼내기
  • E peek() : 맨 위 객체 확인 (삭제 안 함)
  • boolean isEmpty() : 비었는지 여부
  • void clear() : 전체 삭제

2) Queue

  • Queue 인터페이스는 FIFO(선입선출) 구조.
  • 주로 LinkedList가 구현체로 사용된다.
Queue<String> queue = new LinkedList<>();
queue.offer("A");
queue.offer("B");
System.out.println(queue.poll()); // A
System.out.println(queue.poll()); // B

주요 메소드

  • boolean offer(E e) : 객체 삽입
  • E poll() : 객체 꺼내기

15.7. 동기화된 컬렉션

  • 대부분의 컬렉션(ArrayList, HashSet, HashMap)은 동기화 미지원 → 멀티스레드 환경에서 안전하지 않음.
  • Vector, Hashtable동기화 지원.
  • 필요 시 Collections.synchronizedXXX() 메소드로 동기화된 컬렉션을 생성 가능.
// 동기화된 List
List<Integer> syncList = Collections.synchronizedList(new ArrayList<>());

// 동기화된 Set
Set<String> syncSet = Collections.synchronizedSet(new HashSet<>());

// 동기화된 Map
Map<String, String> syncMap = Collections.synchronizedMap(new HashMap<>());

15.8. 수정할 수 없는 컬렉션

  • 불변(immutable) 컬렉션 → 요소 추가/삭제 불가.
  • 데이터 변경이 필요 없는 경우 안전하게 사용 가능.

1) of() 메소드

List<String> list = List.of("A", "B", "C");
Set<Integer> set = Set.of(1, 2, 3);
Map<Integer, String> map = Map.of(1, "One", 2, "Two");

2) copyOf() 메소드

  • 기존 컬렉션을 복사하여 불변 컬렉션 생성.
List<String> origin = new ArrayList<>();
origin.add("X");
List<String> immutableList = List.copyOf(origin);

3) 배열로 생성

String[] arr = {"A", "B", "C"};
List<String> immutableList = Arrays.asList(arr);
profile
한 발자국씩

0개의 댓글