컬렉션 프레임 워크

윤재열·2022년 1월 22일
0

Java

목록 보기
40/71

컬렉션 프레임 워크

자바는 널리 알려저 있는 자료구조를 사용해서 객체들을 효율적으로 추가, 삭제, 검색할 수있도록 인터페이스와 구현 클래스를 java.util 패키지에서 제공합니다. 이들을 총칭해서 컬렉션 프레임워크라고 부릅니다.

  • 컬렉션은 검색,조회,정렬, 추가, 삭제와 같은 데이터를 관리할 수 있는 객체를 말하고, 프레임워크는 사용 방법을 정해놓은 라이브러리를 말합니다.

  • 컬렉션 프레임워크는 인터페이스와 클래스로 나누어져 있습니다

    인터페이스(interface)
    -Set,List,Queue,Deque
    클래스(class)
    -ArrayList,Vector,LinkedList,Hastset,LinkedHashSet,TreeSet

  • 컬렉션 프레임워크의 주요 인터페이스로는 List, Set, Map 이 있습니다.

List컬렉션

배열과 비슷하게 객체를 인덱스로 관리합니다.
배열과의 차이점은 저장용량이 자동으로 증가하며,객체를 저장할떄 자동 인덱스가 부여된다는 것이다.그리고 추가,삭제,검색을 위한 다양한 메서드들이 제공된다.

  • List컬렉션은 객체 자체를 저장하는 것이 아니라 객체의 번지를 참조한다.
    그렇기 때문에 동일한 객체를 중복 저장할 수 있는데, 이경우 동일한 번지가 참조된다.
    null도 저장이가능하며, 이경우 해당 인덱스는 객체를 참조하지 않는다.

기능 메서드

-객체 추가

  • boolean add(E e) : 주어진 객체를 맨 끝에 추가한다.
  • void add(int index,E element) : 주어진 인덱스에 객체를 추가한다.
  • E set(int index,E element) : 주어진 인덱스에 저장된 객체를 주어진 객체로 바꾼다.

-객체 검색

  • boolean contaions(Object o) : 주어진 객체가 저장되어 있는가? 판별
  • E get(int index) : 주어진 인덱스에 저장된 객체를 리턴한다.
  • boolean isEmpty() : 컬렉션이 비어있는가? 조사
  • int size() : 저장되어 있는 전체 객체 수를 리턴한다.

-객체 삭제

  • void clear() : 저장된 모든 객체를 삭제한다.
  • E remove() : 주어진 인덱스에 저장된 객체를 삭제한다.
  • boolean remove(Object o) : 주어진 객체를 삭제한다.

ArrayList

List인터페이스의 대표적인 구현 클래스이다.

List<E> list = new ArrayList<E>();  

-ArrayList를 생성하기 위해서는 저장할 객체 타입을 E타입 파라미터 자리에 표기하고 기본 생성자를 호출하면 된다. 예를 들어 String을 저장하는 ArrayList는 다음과 같이 생성이 가능하다.

List<String> list = new ArrayList<STring>();
  • 기본 생성자로 ArrayList 객체를 생성하면 내부에 10개의 객체를 저장할 수 있는 초기 용량을 가지게 된다. 저장되는 객체 수가 늘어나면 용량이 자동으로 증가합니다.
  • ArrayList에 객체를 추가하면 0번 인덱스부터 차례대로 저장된다.
  • ArrayList에서 특정 인덱스의 객체를 제거하면 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨진다.
  • 마찬가지로 특정 인덱스에 객체를 삽입하면 해당 인덱스부터 마지막 인덱스까지 모두 1씩 밀려난다.

따라서 빈번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList를 사용하지않는 것이 바람직하지 않습니다.

  • 특정 인덱스에 객체를 추가하거나 제거하는 일이 빈번하다면 ArrayList보다는 조금 후에 배울 LinkedList를 사용하는 것이 좋다.
  • 하지만 인덱스를 이용해서 객체를 찾거나 맨 마지막에 객체를 추가하는 경우에는 ArrayList가 더 좋은 성능을 발휘합니다.
package 컬렉션프레임워크;

import  java.util.*;

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

        //String 객체를 저장
        list.add("Java");
        list.add("JDBC");
        list.add("Servlet/JSP");
        list.add(2, "Database");
        list.add("iBATIS");

        //저장된 총 객체수 얻기
        int size = list.size();
        System.out.println("총 객체수: " + size);
        System.out.println();

        //2번인덱스의 객체 얻기
        String skill = list.get(2);
        System.out.println("2: " + skill);
        System.out.println();

        //저장된 총 객체 수만 큼 루핑
        for (int i = 0; i < list.size(); i++) {
            String str = list.get(i);
            System.out.println(i + ":" + str);
        }
        System.out.println();

        list.remove(2); //2접ㄴ 인덱스 객체 삭제됨
        list.remove(2);
        list.remove("iBATIS");

        for (int i = 0; i < list.size(); i++) {
            String str = list.get(i);
            System.out.println(i + ":" + str);
        }
    }
}

Vector

Vector은 ArrayList와 동일한 내부 구조를 가지고 있습니다.Vector를 생성하기 위해서는 저장할 객체 타입을 타입 파라미터로 표기하고 기본 생성자를 호출하면 된다.

  • ArrayList와 다른 점은 Vector는 동기화된 메서드로 구성되어 있기 때문에 멀티 스레드가 동시에 Vector의 메서드를 실행할 수 없고, 하나의 스레드가 메서드를 실행을 완료해야만 다른 스레드가 메서드를 실행할 수 있다는 것이다.그래서 멀티 스레드 환경에서 안전하게 객체를 추가,삭제할수 있다.
    이것을 스레드에 안전하다고 표현한다.
package 컬렉션프레임워크;

public class Board {
    public String subject;
    public String content;
    public String writer;

    public Board(String subject, String content, String writer) {
        this.subject = subject;
        this.content = content;
        this.writer = writer;
    }
}
package 컬렉션프레임워크;

import  java.util.*;

public class VectorExample {
    public static void main(String[] args) {
        List<Board>list = new Vector<>();
        
        list.add(new Board("제목1","제목1","글쓴이1"));
        list.add(new Board("제목2","제목2","글쓴이2"));
        list.add(new Board("제목3","제목3","글쓴이3"));
        list.add(new Board("제목4","제목4","글쓴이4"));
        list.add(new Board("제목5","제목5","글쓴이5"));
        
        list.remove(2);// 2번 인덱스 객체(제목3)삭제(뒤의 인덱스는 1씩 앞으로 당겨짐)
        list.remove(3);// 3번 인덱스 객체(제목5)삭제
        
        for(int i=0; i<list.size(); i++){
            Board board =list.get(i);
            System.out.println(board.subject +"\t"+board.content+"\t"+board.writer);
        }
    }
}

만약 ArrayList의 remove였다고한다면
list.remove(2)에서 제목3 이 삭제되고
list.remove(3)에서 제목4가 삭제 되었다.

LinkedList

LInkedList는 List구현 클래스이므로 ArrayList와 사용 방법은 똑같지만, 내부구조는 완전히 다릅니다. ArrayList는 내부 배열에 객체를 저장해서 관리하지만, LinkedList는 인접 참조를 링크해서 체인처럼 관리합니다.

  • LinkedList에서 특정 인덱스의 객체를 제거하면 앞뒤 링만 변경되고 나머지 링크는 변경되지 않습니다.특정 인덱스에 객체를 삽입할 때에도 마찬가지이다.

다음 예제는 ArrayList와 LinkedList에 10,000개의 객체를 삽입하는데 걸린 시간을 측정한 것입니다.
0번 인덱스에 String객체를 10,000번 추가하기 위해 List 인터페이스의 add(int index,E element) 메서드를 사용했습니다.

package 컬렉션프레임워크;

import java.util.ArrayList;
import java.util.*;

public class LinkedListExample {
    public static void main(String[] args) {
        List<String> list1 = new ArrayList<>();
        List<String> list2 = new LinkedList<>();

        long startTime;
        long endTime;

        startTime=System.nanoTime();
        for(int i=0; i<10000; i++){
            list1.add(0,String.valueOf(i));
        }
        endTime=System.nanoTime();
        System.out.println("ArrayList 걸린시간: "+(endTime-startTime)+" ns");

        startTime = System.nanoTime();
        for(int i=0; i<10000; i++){
            list2.add(0,String.valueOf(i));
        }
        endTime=System.nanoTime();
        System.out.println("LinkedList 걸린시간: "+(endTime-startTime)+" ns");
        }
}

  • 실행결과를 보면 LinkedList가 훨씬 빠른 성능을 발휘합니다.

  • 끝에서부터(순차적으로) 추가 또는 삭제하는 경우에는 ArrayList가 빠르지만, 중간에 추가, 삭제하는 경우에는 앞뒤 링크 정보만 변경하므로 LinkedList가 더 빠릅니다.
    ArrayList는 뒤쪾 인덱스들을 모두 1씩 증가 또는 감소시키는 시간이 필요하므로 처리 속도가 느립니다.

구분순차적으로 추가/삭제중간에 추가/삭제검색
ArrayList빠르다느리다빠르다
LinkedList느리다빠르다느리다
profile
블로그 이전합니다! https://jyyoun1022.tistory.com/

0개의 댓글