컬렉션 프레임워크

  • 자바에서 제공하는 자료구조 구현 클래스를 말한다

  • 자료구조를 미리 구현해놓은 JDK 라이브러리

  • 개발 시간을 절약하며 최적의 알고리즘을 사용할 수 있다

  • 여러 구현 클래스와 인터페이스의 활용에 대한 이해가 필요하다

  • Collection, Map 인터페이스로 나눠짐

  • Collection 부분은 하나의 요소를 관리

  • Map 부분은 key-value 쌍을 관리

  • 순회하고 싶은 경우 iterator 사용

컬렉션 프레임워크의 핵심 인터페이스

List

  • 순서 있다
  • 중복 가능
  • 구현 클래스 : ArrayList, LinkedList, Stack, Vector

Set

  • 순서 없다
  • 중복 불가능
  • 구현 클래스 : HashSet, TreeSet

Map

  • key와 쌍으로 Value로 이루어져 있다
  • 순서 없다
  • key는 중복 불가능
  • 구현 클래스 : HashMap, TreeMap, HashTable, Properties

컬렉션 인터페이스의 메서드


List

List 인터페이스를 구현한 클래스

  • 순차적으로 자료를 관리하고 싶을 때 사용하는 인터페이스
  • Vector = ArrayList
  • LinkedList

List 인터페이스의 메서드

ArrayList

  • 저장 순서가 유지되고 중복을 허용한다
  • 데이터의 저장공간으로 배열 [ ] 을 사용한다
  • ArrayList 에는 객체만 저장 가능한데, 컴파일러가 오토 박싱을 해주기 때문에 기본형으로 저장해도 참조형으로 자동 변환된다

ArrayList의 메서드

  • 생성
    ArrayList()
    ArrayList(Collection c)
    ArrayList(int initialCapacity)
  • 추가
    boolean add(Object o)
    void add(int index, Object o)
    boolean addAll(Collection c)
    boolean addAll(int index, Collection c)
  • 삭제
    boolean remove(Object o)
    Object remove(int index)
    boolean removeAll(Collection c)
    void clear()
    list1.remove(1); //인덱스 1 삭제
    list1.ramove(new Integer(1)); // 1을 삭제
  • 검색
    int indexOf(Object o)
    int lastIndexOf(Object o) - 반대로 찾음
    boolean contains(Object o)
    Object get(int index)
    Object set(int index, Object o) - 변경
  • 그 외
    List subList(int from, int to)
    Object[] toArray()
    Object[] to Array(Object[] a)
    boolean isEmpty()
    void trimToSize() - 빈공간 제거
    int size()

ArrayList로 멤버쉽 관리하기 실습

  • Member 클래스를 만들고, 아이디와 이름을 멤버 변수로 선언
  • Member 클래스로 생성된 인스턴스들을 관리하는 클래스를 컬렉션 프레임워크 클래스들을 활용하여 구현한다.
  1. 생성자 만들기
  • size를 미리 지정할 수도, 안 할 수도 있다
    안 하면 10이 디폴트
private ArrayList<Member> arrayList;

public MemberArrayList(){
    arrayList = new ArrayList<>();
}

public MemberArrayList(int size){
    arrayList = new ArrayList<>(size);
}
  1. 멤버 추가
  • add 메서드 사용
    public void addMember(Member member) {
       arrayList.add(member);
    }
  1. 멤버 삭제
  • remove 메서드
  • 입력 받은 멤버 Id를 찾는 for문, 돌다가 찾으면 삭제 후 반환, 못 찾으면 false
public boolean removeMember(int memberId){
    for (int i=0; i< arrayList.size();i++){
        Member member = arrayList.get(i);

        int tempId = member.getMemberId();
        if (tempId==memberId){
            arrayList.remove(i);
            return true;
        }
    }
    System.out.println(memberId + "가 존재하지 않습니다.");
    return false;
}
  1. 모든 멤버 출력
  • for문으로 array 요소 출력
public void showAllMember(){
    for (Member member : arrayList){
        System.out.println(member);
    }
    System.out.println();
}

LinkedList

배열은

  • 구조가 간단하고 데이터를 읽는데 걸리는 시간이 짧다
  • 데이터의 주소를 계산하는 시간이 짧다
  • 크기를 변경할 수 없다
    변경하려면 새로운 배열을 만든 후 복사해야함
  • 비순차적인 데이터의 추가, 삭제에 시간이 많이 걸린다
    순차적인 데이터의 추가, 삭제는 빠르다(끝부터)

배열의 단점을 보완한 LinkedList

  • 배열과 달리 LinkedList는 불연속적으로 존재하는 데이터를 연결
  • 요소 하나하나를 Node라고 한다
class Node{
Node next; //다음 노드의 주소
Object obj;
  • 단점: 접근성이 나쁘다 - 한 번에 뒤에 요소에 접근할 수 없고 차례로 하나씩 지나서 가야한다

LinkedList의 단점을 보완한 이중 연결 리스트

  • 앞 노드의 주소와 다음 요소의 주소를 저장
  • 단점 : 여전히 멀리 있는 데이터에 접근하기는 어렵다

이중 연결 리스트의 단점을 보완한 이중 원형 연결리스트

  • 마지막 요소의 다음 요소를 제일 첫번째 요소로 연결
  • 멀리 있는 요소에 접근할 경우 첫번째의 이전(마지막 요소)으로 접근하여 빠르게 갈 수 있다

성능 비교

  1. 순차적으로 데이터를 추가/삭제 - ArrayList가 빠름
  2. 비순차적으로 데이터를 추가/삭제 - LinkedList가 빠름
  3. 접근 시간 - ArrayList가 빠름
  • 인덱스가 n인 데이터의 주소 = 배열의 주소 + n * 데이터 타입의 크기

Set 인터페이스를 구현한 클래스

  • HashSet, TreeSet
  • Set 인터페이스의 메서드는 컬렉션 인터페이스와 동일
class Node{
Node next; //다음 노드의 주소
Node previous;
Object obj;

집합과 관련된 메서드


Collection 의 인터페이스

Collection 요소를 순회하는 Iterator

  • 컬렉션 프레임워크에 저장된 요소를 하나씩 차례로 순회하는 것
  • 순서가 없는 인터페이스의 경우에 사용함
  • 다양한 컬렉션에서 저장된 요소를 읽어오는 방법을 표준화한 것

Iterator의 메서드

  • boolean hasNext(): 이후에 요소가 더 있는지 체크하는 메서드, 있으면 true를 반환한다
  • E Next(): 다음에 있는 요소를 반환
  • 확인하고 -> 읽어오기 방식

Enumeration

  • Iterator의 옛날 방식, 거의 같다
  • hasMoreElements()
  • nextElement()

ListIterator

  • Iterator의 접근성을 향상시킨 것, 단방향 접근에서 양방향 접근으로.
  • next만 가져올 수 있는 Iterator에서 이전 값, previous() 를 가져올 수 있는 것
  • list인터페이스를 구현한 컬렉션에서만 사용 가능하다

Iterator 사용하기

  1. Iterator를 하나 생성
 Iterator<Member> ir = arrayList.iterator(); // arrayList의 iterator를 ir로 생성
  1. remove 메서드에 적용
  • ir은 hasNext() 메서드로 다음에 값이 있는지 확인,
  • next() 메서드로 다음 값으로 이동
while (ir.hasNext()){ //계속 다음으로 가면서
    Member member = ir.next();
    int tempId = member.getMemberId();
    if (tempId==memberId){ // 입력한 id가 있는지 확인, 있으면
        arrayList.remove(member); //삭제한다
        return true;
    }
}
System.out.println(memberId + "가 존재하지 않습니다.");
return false;
  • Iterator는 일화용이기 때문에 다 쓰고 다시 사용하기 위해서는 다시 얻어와야 한다(새로운 Iterator 객체 생성)

Map에서의 Iterator

  • Map은 Iterator가 없다(Collection의 자손이 아니다)
  • keySet(), entrySet(), values()를 호출하면 각각은 Iterator를 사용할 수 있다(Collection의 자손)
Iterator it = map.entrySet().iterator();
//entrySet은 (key, value) 쌍
profile
안녕하세요. Chat JooPT입니다.

0개의 댓글