컬렉션 (Collection)

조상원·2025년 8월 2일

JAVA

목록 보기
23/34
  • 자료구조 : 데이터를 효율적으로 이용하는 방법으로 데이터에 편리하게 접근하고, 효율적으로 사용하기 위해서 데이터를 저장하거나 조직하는 방법
  • 컬렉션 (컬렉션 프레임워크) : 자바에서 제공하는 자료구조를 담당하는 프레임위크. java.util 패키지에 컬렉션과 관련된 인터페이스와 클래스들이 포함되어 있다.
  • 컬렉션을 사용하면 데이터의 추가,삭제,정렬 등의 처리가 간단하게 해결되어 자료구조적 알고리즘을 구현할 필요가 없다

주요 인터페이스

인터페이스 분류구현 클래스특징
CollectionListArrayList, Vector, LinkedList순서가 있는 데이터의 집합으로 데이터의 중복을 허용한다.
CollectionSetHashSet, LinkedHashSet, TreeSet순서를 유지하지 않는 데이터의 집합으로 데이터의 중복을 허용하지 않는다.
MapHashMap, HashTable, TreeMap, Properties키(Key), 값(Value)의 쌍으로 이루어진 데이터의 집합으로 키(Key)의 중복을 허용하지 않으나 값(Value)의 중복은 허용한다.

List

  • 자료들을 순차적으로 늘어놓은 구조
  • 저장되는 객체를 인덱스로 관리하기 때문에 인덱스로 객체를 검색, 삭제할 수 있는 기능을 제공
  • 중복되는 객체를 저장 가능하고 null 값도 저장 가능
  • 특정 인덱스의 객체를 제거하면 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨진다.
public void method1(){
        List list = new ArrayList();

        //객체를 저장할 때는 add() 메소드를 사용한다
        list.add("안녕하세요.");
        list.add(LocalDateTime.now());
        //Auto Boxing이 적용된다
        list.add(3.14);
        list.add(false);
        list.add('a');

        System.out.println(list);   //[안녕하세요., 2025-07-21T17:21:51.054557600, 3.14, false, a]
        System.out.println(list.size());    //5
    }
//객체를 가져올 때는 get() 메소드 사용
//형변환 필요
//다운캐스팅
String str = (String) list.get(0);
LocalDateTime now = (LocalDateTime) list.get(1);
Double number = (Double) list.get(2);
for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
}
for(Object obj : list){
    System.out.println(obj);
}
  • .add
  • 2번 인덱스에 100000이라는 값을 추가, 하나씩 밀어내는 것. 기존 객체들은 하나씩 밀리게됨.
list.add(2,10000);
System.out.println(list);
  • .set
  • 해당 위치의 인덱스의 객체를 변경하는 것. 기존 인덱스 위치의 객체는 사라짐
list.set(2,true);
System.out.println(list);
  • .addFirst, .addLast
  • 처음과 끝에 객체를 추가함
  • 기존 객체들은 안사라짐
//JDK21 버전에 추가된 메소드
list.addFirst("1st");
list.addLast("last");
System.out.println(list);
  • .remove
  • 해당 위치(인덱스)의 요소 삭제 or
  • 주어진 객체를 삭제. 여러개 있다면 제일 앞에것만
list.remove(2);
list.remove("1st");
System.out.println(list);
list.removeFirst();
list.removeLast();
  • 오토박싱이 안됨. integer를 인덱스로 인식해서. Boxing 작업 필요
list.remove(Integer.valueOf(100000));
  • .isEmpty() : 리스트가 비어있는지 확인
  • .clear() : 리스트에 저장된 객체들을 모두 삭제
System.out.println(list.isEmpty());    //false
list.clear();                          
System.out.println(list);              //[]
System.out.println(list.isEmpty());    //truw
  • 컬렉션에서 제네릭스를 사용하는 이유
    - 명시된 타입의 객체만 저장하도록 제한을 두기 위해서 사용한다
    - 컬렉션에 저장된 객체를 꺼내서 사용할 때 매번 형 변환을 하지 않아도 된다
List<String> fruits = new ArrayList<>();
List<Integer> numbers = new ArrayList<>();
  • 정렬
//오름차순으로 정렬
Collections.sort(fruits);
Collections.sort(numbers);

//내림차순 정렬
Collections.reverse(fruits);
Collections.reverse(numbers);
Collections.sort(fruits, Collections.reverseOrder());
fruits.sort(Collections.reverseOrder());

List 인터페이스의 주요 메소드

리턴 타입메소드설명
booleanadd(E e)주어진 객체를 맨 끝에 추가한다.
voidadd(int index, E element)주어진 인덱스에 객체를 추가한다.
booleanaddAll(Collection<? extends E> c)주어진 Collection 타입 객체를 리스트에 추가한다.
Eset(int index, E element)주어진 인덱스에 저장된 객체를 주어진 객체로 바꾼다.
booleancontains(Object o)주어진 객체가 저장되어 있는지를 확인한다.
Eget(int index)주어진 인덱스에 저장된 객체를 리턴한다.
Iteratoriterator()저장된 객체를 한 번씩 가져오는 반복자 리턴한다.
booleanisEmpty()컬렉션이 비어 있는지 조사한다.
intsize()저장되어 있는 전체 객체수를 리턴한다.
voidclear()저장된 모든 객체를 삭제한다.
Eremove(int index)주어진 인덱스에 저장된 객체를 삭제한다.
booleanremove(Object o)주어진 객체를 삭제한다.

ArrayList

  • List 인터페이스의 구현 클래스
  • 배열과의 차이점은 저장 용량(capacity)을 초과한 객체들이 들어오면 자동적으로 저장 용량이 늘어난다
  • 배열을 내부에 가지고 있음
  • 동기화(Synchronized)를 제공하지 않는다.
    • 동기화 : 하나의 자원(데이터)에 대해 여러 개의 스레드가 접근하려 할 때 한 시점에서 하나의 스레드만 사용할 수 있도록 하는 것

Vector

  • List 인터페이스의 구현 클래스
  • ArrayList와의 차이점은 동기화(Synchronized)를 제공
  • 멀티 스레드 환경에서 안전하게 객체를 추가, 삭제할 수 있는 것을 스레드가 안전(Thread Safe)

LinkedList

  • List 인터페이스의 구현 클래스
  • ArrayList와 사용 방법은 동일하지만 내부 구조는 완전히 다름
  • 데이터를 담고 있는 요소들이 앞/뒤로 연결된 노드들을 링크(인접 링크)해서 관리

0개의 댓글