본문 바로가기

멋쟁이사자처럼_부트캠프/Java

[멋쟁이사자처럼 부트캠프 TIL 회고] 백엔드 부트캠프 13기: Java 16일차 컬렉션 프레임워크, Iterator

컬렉션 프레임워크(클래스+인터페이스)

컬렉션 프레임워크는 데이터를 효율적으로 저장하고 조작하기 위해 자바에서 제공하는 클래스인터페이스집합입니다. 데이터를 저장할 자료구조와 이를 처리하는 알고리즘을 제공하여 코드의 재사용성유지보수성을 높이는 것이 목적입니다.

 

컬렉션 프레임워크의 계층 구조

java.util.Collection
  ├── List
  │    ├── ArrayList
  │    ├── LinkedList
  │    └── Vector
  ├── Set
  │    ├── HashSet
  │    ├── LinkedHashSet
  │    └── TreeSet
java.util.Map
  ├── HashMap
  ├── LinkedHashMap
  └── TreeMap

 

컬렉션 프레임워크의 구성 요소

  1. 인터페이스(Interface)
    • 컬렉션의 동작을 정의.
    • 주요 인터페이스:
      • Collection: 컬렉션의 기본 인터페이스.
      • List: 순서가 있는 데이터의 집합.
      • Set: 중복이 없는 데이터의 집합.
      • Map: 키-값 쌍의 데이터 집합.
  2. 클래스(Class)
    • 인터페이스를 구현한 클래스.
    • 주요 클래스:
      • ArrayList: 동적으로 크기가 변하는 배열.
      • LinkedList: 노드 기반의 데이터 구조.
      • HashSet: 해시 기반의 Set 구현체.
      • HashMap: 해시 기반의 Map 구현체.
      • TreeMap: 키를 기준으로 정렬된 Map.
  3. 알고리즘(Algorithm)
    • 컬렉션 데이터를 조작하는 데 사용되는 메서드의 모음.
    • 주요 알고리즘:
      • 정렬(Sorting)
      • 검색(Search)
      • 셔플(Shuffle)
      • 비교(Comparison)

 

주요 인터페이스 및 구현 클래스

0. Collection (인터페이스로써, java.util.Collection)

  • 특징: Java에서 제공하는 데이터 저장 객체의 상위 인터페이스. 데이터를 그룹으로 관리하기 위한 상위 인터페이스.
  • 모든 컬렉션 프레임워크(List, Set, Queue)는 이 Collection 인터페이스를 확장하여 구현됨
  • 주요 메서드 :
    • boolean add(E e) : 요소를 추가.
    • boolean remove(Object o) : 특정 요소를 제거.
    • boolean contains(Object o) : 특정 요소가 있는지 확인.
    • Iterator<E> iterator() : 컬렉션에 저장된 요소를 순차적으로 접근할 수 있는 Iterator를 반환.

1. List

  • 특징: 순서가 있으며, 중복 요소를 허용.
  • 구현 클래스:
    • ArrayList: 배열 기반, 빠른 검색.
    • LinkedList: 노드 기반, 빠른 삽입/삭제.
    • Vector: 동기화 지원, ArrayList와 유사.

2. Set

  • 특징: 순서가 없으며, 중복 요소를 허용하지 않음.
  • 구현 클래스:
    • HashSet: 해시 기반, 순서 보장 안 함.
    • LinkedHashSet: 삽입 순서 유지.
    • TreeSet: 정렬된 순서 유지.

3. Map

  • 특징: 키-값 쌍으로 데이터 저장, 키는 중복 허용하지 않음.
  • 구현 클래스:
    • HashMap: 해시 기반, 순서 보장 안 함.
    • LinkedHashMap: 삽입 순서 유지.
    • TreeMap: 키의 정렬된 순서 유지.

컬렉션 프레임워크의 장점

  1. 코드 간소화
    • 재사용 가능한 자료구조 및 알고리즘 제공.
  2. 일관성
    • 인터페이스를 통해 일관된 프로그래밍 가능.
  3. 유연성
    • 다양한 데이터 구조를 쉽게 교체 가능.
  4. 성능 최적화
    • 고성능 알고리즘과 자료구조 제공.

Collection과 배열의 차이점

특징 Collection 배열
크기 동적으로 크기 변경 가능 고정 크기
데이터 타입 서로 다른 타입의 객체 저장 가능 같은 타입의 데이터만 저장
편리성 메서드 제공(삽입, 삭제, 검색 등) 직접 구현 필요
성능 크기 조절 및 복잡한 연산에 약간의 오버헤드 상대적으로 빠름

컬렉션 프레임워크의 예시

 

1. ArrayList 사용

import java.util.ArrayList;

public class Example {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Cherry");

        for (String item : list) {
            System.out.println(item);
        }
    }
}

 

2. HashMap 사용

import java.util.HashMap;

public class Example {
    public static void main(String[] args) {
        HashMap<Integer, String> map = new HashMap<>();
        map.put(1, "One");
        map.put(2, "Two");
        map.put(3, "Three");

        System.out.println(map.get(1)); // Output: One
    }
}

 

웹 프로그래밍에서의 컬렉션 사용

  1. 데이터 저장 및 처리
    • 사용자 입력 데이터를 리스트나 맵에 저장.
  2. 검색 및 정렬
    • 정렬된 데이터를 제공하거나, 키를 기반으로 검색.
  3. JSON 데이터 매핑
    • JSON 객체를 맵이나 리스트로 변환하여 처리.

 

List를 사용한 예제

 


Iterator (인터페이스)

java.util 패키지에 포함된 별도의 인터페이스로, 특정 컬렉션(Collection) 내의 요소를 순차적으로 접근하는 데 사용.

 

java.util
  ├── Collection
  │    ├── List
  │    │    ├── ArrayList
  │    │    ├── LinkedList
  │    │    └── Vector
  │    ├── Set
  │    │    ├── HashSet
  │    │    ├── LinkedHashSet
  │    │    └── TreeSet
  ├── Map
  │    ├── HashMap
  │    ├── LinkedHashMap
  │    └── TreeMap
  └── Iterator (독립적인 인터페이스)

Iterator의 역할

  • 컬렉션 내부 구조를 숨기면서 요소를 순회.
  • for-each 루프가 없는 Java 1.4 이전에는 기본적인 컬렉션 순회 방법.
  • 컬렉션의 요소를 추가, 제거, 읽는 작업을 지원.

Iterator vs. For-each

  • For-each 루프는 내부적으로 Iterator를 사용하지만, 코드가 간결.
  • Iterator는 요소를 제거하거나 복잡한 제어를 할 때 유리.

정리

  • Iterator는 독립적인 인터페이스로, 컬렉션을 순회하는 데 사용.
  • Collection과 그 하위 구현체(List, Set)는 iterator() 메서드로 Iterator를 제공.
  • Map은 직접적으로 제공하지 않지만, entrySet(), keySet(), values()를 통해 Iterator 사용 가능.

 

예제 코드)

- Collection 인터페이스와 Iterator 인터페이스를 사용하여 컬렉션의 요소를 순회하는 코드

- HashSet을 사용하여 중복을 허용하지 않는 집합(Set) 형태로 데이터를 저장.(HashSet : 저장 순서가 보장되지 않음.)