컬렉션 프레임워크와 Stream API - JCF 주요 인터페이스 활용

urur-27·2025년 2월 19일

StreamAPI

목록 보기
2/6

자바 컬렉션 프레임워크(JCF)는 데이터를 효율적으로 관리할 수 있도록 다양한 자료구조를 제공한다.
이번 글에서는 JCF의 주요 인터페이스인 List, Set, Map을 중심으로,
대표적인 구현체(ArrayList, HashSet, HashMap)의 특징과 주요 메서드를 살펴보자.


1. List 인터페이스: 순서가 있는 컬렉션

1.1 List 인터페이스의 특징

  • 순서(인덱스)를 유지하며 요소를 저장한다.
  • 중복된 요소를 허용한다.
  • 배열과 유사하지만, 동적 크기 조절이 가능하다.
  • 대표적인 구현체: ArrayList, LinkedList

1.2 ArrayList

1.2.1 특징

  • 내부적으로 동적 배열(Dynamic Array) 을 사용하여 크기를 자동으로 조정한다.
  • 인덱스를 통한 랜덤 액세스가 빠르다(O(1))
  • 하지만 중간 요소 삽입/삭제 시에는 느리다(O(n)) → LinkedList보다 비효율적

1.2.2 주요 메서드

  • add(E e): 리스트에 요소를 추가한다.
  • get(int index): 특정 인덱스의 요소를 가져온다.
  • remove(int index) / remove(Object o): 인덱스 또는 객체를 기준으로 요소를 제거한다.
  • size(): 리스트 길이를 반환한다.
  • clear(): 모든 요소를 제거한다.
import java.util.ArrayList;
import java.util.List;

public class ArrayListExample {
    public static void main(String[] args) {
        List<String> fruits = new ArrayList<>();

        // 요소 추가
        fruits.add("Apple");
        fruits.add("Banana");
        fruits.add("Cherry");

        // 인덱스로 접근
        System.out.println("첫 번째 과일: " + fruits.get(0));  // Apple

        // 요소 삭제
        fruits.remove("Banana");

        // 리스트 크기 확인
        System.out.println("리스트 크기: " + fruits.size());  // 2
    }
}
  • 사용 예시: 데이터가 많고 조회(get())가 빈번한 경우 → ArrayList 추천

2. Set 인터페이스: 중복 없는 컬렉션

2.1 Set 인터페이스의 특징

  • 중복 요소를 허용하지 않는다.
  • 순서가 보장되지 않거나 특정 정렬이 적용될 수 있다(구현체에 따라 다름).
  • 대표적인 구현체: HashSet, LinkedHashSet, TreeSet

2.2 HashSet

2.2.1 특징

  • 내부적으로 해시 테이블(Hash Table) 을 사용하여 중복을 방지하고 요소를 저장한다.
  • 검색(contains) 및 추가(add) 속도가 빠름 (O(1))
  • 요소의 순서를 보장하지 않음

2.2.2 주요 메서드

  • add(E e): 요소를 추가한다(이미 존재하면 추가되지 않는다).
  • remove(Object o): 지정된 객체를 제거한다.
  • contains(Object o): 특정 요소가 존재하는지 확인한다.
  • size(): 집합에 저장된 요소 수를 반환한다.
  • clear(): 모든 요소를 제거한다.
import java.util.HashSet;
import java.util.Set;

public class HashSetExample {
    public static void main(String[] args) {
        Set<Integer> numbers = new HashSet<>();

        // 요소 추가
        numbers.add(1);
        numbers.add(2);
        numbers.add(3);
        numbers.add(2); // 중복 추가 (무시됨)

        // 포함 여부 확인
        System.out.println("2 포함 여부: " + numbers.contains(2));  // true

        // 요소 제거
        numbers.remove(1);

        // 전체 출력
        System.out.println("저장된 값들: " + numbers); // 순서 보장 X
    }
}
  • 사용 예시: 중복 제거가 필요한 경우 → HashSet 추천
    단점: 입력 순서를 유지하지 않음 → 입력 순서가 중요한 경우 LinkedHashSet 사용

3. Map 인터페이스 : Key-Value 데이터 관리

3.1 Map 인터페이스의 특징

  • 키(key)와 값(value)의 쌍으로 데이터를 저장한다.
  • 키는 중복을 허용하지 않는다(이미 존재하는 키로 다시 put()을 호출하면 값을 덮어씀).
  • Map 계열은 Collection을 상속하지 않으나, JCF의 일부로 함께 취급한다.
  • 대표적인 구현체: HashMap, LinkedHashMap, TreeMap

3.2 HashMap: 빠른 검색이 가능한 Key-Value 자료구조

3.2.1 특징

  • 해시 테이블 기반으로 구현되며, 키를 이용해 값을 효율적으로 조회할 수 있다.
  • 키에 대해 hashCode()equals()를 사용하여 동일성 판단을 수행한다.
  • 검색(get) 및 추가(put) 속도가 빠름 (O(1))
  • 키(Key)는 중복될 수 없으며, 같은 키로 값을 추가하면 덮어씀

3.2.2 주요 메서드

  • put(K key, V value): 키-값 쌍을 추가하거나, 해당 키가 이미 존재하면 값을 덮어쓴다.
  • get(Object key): 키에 해당하는 값을 반환한다(없으면 null).
  • remove(Object key): 해당 키의 엔트리를 제거한다.(키와 밸류 쌍을 엔트리라고 함)
  • containsKey(Object key): 특정 키 존재 여부를 반환한다.
  • keySet(): 저장된 키 전체를 Set으로 반환한다.
import java.util.HashMap;
import java.util.Map;

public class HashMapExample {
    public static void main(String[] args) {
        Map<String, Integer> scores = new HashMap<>();

        // 데이터 추가
        scores.put("Alice", 85);
        scores.put("Bob", 90);
        scores.put("Charlie", 88);

        // 값 조회
        System.out.println("Alice의 점수: " + scores.get("Alice")); // 85

        // 키 존재 여부 확인
        System.out.println("Bob이 존재하는가? " + scores.containsKey("Bob")); // true

        // 요소 삭제
        scores.remove("Charlie");

        // 전체 출력
        System.out.println("전체 데이터: " + scores);
    }
}
  • 사용 예시: 데이터를 키 기반으로 빠르게 검색해야 하는 경우 → HashMap 추천
    단점: 입력 순서 유지 X → 순서 유지가 필요한 경우 LinkedHashMap 사용

4. 정리

List → 순서 유지 + 중복 허용 (ArrayList)
Set → 중복 제거, 빠른 검색 (HashSet)
Map → Key-Value 저장, 빠른 검색 (HashMap)

profile
끄아악

0개의 댓글