자바 컬렉션 프레임워크(1) - List, Set

Gaeng·2024년 11월 1일
0

Java 알고리즘

목록 보기
1/6

컬렉션 프레임워크란?

자료구조의 형태들을 바탕으로 객체들을 효율적으로 추가, 삭제, 검색하도로 Java.util 패키지에 담아둔 것을 이것을 Collction Framework라고 한다.
데이터 구조를 표준하여 유연하고 성능 최적화된 데이터 관리 방법을 제공하는 장점있지만, 단점으로는 복잡한 사용법과 성능 저하 가능성이 있다.

컬렉션 프레임워크에는 Collection과 Map으로 으로 나누어서 볼 수 있다.

각각의 인터페이스에 포함되어 각각의 구현 클래스가 무엇인지 알고 있어야한다.

출처: 이것이자바다

각 구현체의 특징

인터페이스 분류특징구현 클래스
List- 순서를 유지하고 저장ArrayList, Vector, LinkedList
- 중복 저장 가능
Set- 순서를 유지하지 않고 저장HashSet, TreeSet
- 중복 저장 안됨
Map- 키와 값으로 구성된 엔트리 저장HashMap, Hashtable, TreeMap, Properties
- 키는 중복 저장 안됨

Collection ?

List컬렉션

  • List컬렉션은 객체를 인덱스로 관리하기 때문에 객체를 저장하면 인덱스가 부여되고 인덱스로 객체를 검색, 삭제할 수 있는 기능을 제공.
  • List 컬렉션은 ArrayList,Vector, LinkedList 등 이 있음.
  • 세 개의 사용법은 같다.

각각의 사용 예시

  • ArrayList: 빠른 검색과 순차적 데이터 저장에 적합.
  • LinkedList: 빈번한 삽입/삭제 작업이 필요한 경우에 적합.
  • Vector: 멀티스레드 환경에서 동기화가 필요한 경우 사용.

- ArrayList

  • ArrayList는 컬렉션에서 가장 많이 사용되는 컬렉션.

  • ArrayList는 중간 삽입/삭제 시 물리적 메모리 위치를 이동하며, 배열 확장이 발생하면 전체 데이터가 새로운 메모리 위치로 복사됩니다.

    //ArrayList 생성
    List<E> list = new ArrayList<E>(); 
    List list = new ArrayList();

-Vector

  • Vector는 동기화된 메소드로 구성되어 있기 때문에 멀티 스레드가 동시에 Vector() 메소드를 실행할 수 없음.
  • 멀티 스레드 환경에서는 안전하게 객체를 추가 또는 삭제할 수 있음.

- LinkedList

  • LinkedList는 이중 연결 리스트로 구현되어 있어, 각 요소가 이전 요소와 다음 요소에 대한 참조(포인터)를 가지고 있습니다.

  • LinkedList는 삽입과 삭제 시 물리적 이동 없이 포인터(주소값)만 변경됩니다.

  • 빈번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList보다는 LinkedList를 사용하는 것이 좋다.

  • 사용방법은 List 사용법과 같다.

    출처: 이것이자바다

Set

  • Set컬렉션은 인덱스로 관리하지 않고,객체 중복 저장을 할 수 없다.
  • Set은 집합과 같고, 순서와 상관없고 중복 허용 되지 않음.
  • Set 컬렉션은 이처럼 중복 없는 데이터 집합을 만들고 관리할 때 유용
기능메소드설명
객체 추가boolean add(E e)주어진 객체를 성공적으로 저장하면 true를 리턴하고, 중복 객체면 false를 리턴
객체 검색boolean contains(Object o)주어진 객체가 저장되어 있는지 여부
isEmpty()컬렉션이 비어 있는지 조사
Iterator<E> iterator()저장된 객체를 한 번씩 가리키는 반복자 리턴
int size()저장되어 있는 전체 객체 수 리턴
객체 삭제void clear()저장된 모든 객체를 삭제
boolean remove(Object o)주어진 객체를 삭제

HashSet

  • Set 컬렉션 중에 가장 많이 사용하는 것이 HashSet이다.
Set<E> set = new HashSet<E>();
Set set = new new HashSet(); //잘사용하지 않음
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class HashSetExample {
    public static void main(String[] args) {
        // HashSet 생성
        Set<String> set = new HashSet<>();

        // 요소 추가
        set.add("Apple");
        set.add("Banana");
        set.add("Cherry");
        set.add("Apple"); // 중복된 요소는 추가되지 않음

        // HashSet 출력
        System.out.println("HashSet 내용: " + set);

        // 요소 존재 여부 확인
        System.out.println("HashSet에 Apple이 있는가? " + set.contains("Apple"));
        System.out.println("HashSet에 Mango가 있는가? " + set.contains("Mango"));

        // 요소 제거
        set.remove("Banana");
        System.out.println("Banana 삭제 후 HashSet 내용: " + set);

        // Set의 크기
        System.out.println("HashSet 크기: " + set.size());

        // HashSet 반복 (Iterator 사용)
        System.out.println("HashSet 요소:");
        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }

        // 모든 요소 삭제
        set.clear();
        System.out.println("HashSet이 비어 있는가? " + set.isEmpty());
    }
}

결과값
HashSet 내용: [Apple, Banana, Cherry]
HashSet에 Apple이 있는가? true
HashSet에 Mango가 있는가? false
Banana 삭제 후 HashSet 내용: [Apple, Cherry]
HashSet 크기: 2
HashSet 요소:
Apple
Cherry
HashSet이 비어 있는가? true

profile
문제를 해결하면서 나온 문제를 기록하는 노트

0개의 댓글