Java 컬렉션 프레임워크

김정훈·2024년 4월 29일

Java

목록 보기
29/48
post-thumbnail

컬렉션 프레임워크

컬렉션(Collections) - 데이터 군집, 자료
프레임워크(Framework) : 표준화된 설계
데이터 군을 다루는데 필요한 클래스를 표준화서 설계
java.util

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


2. 컬렉션 프레임워크의 주요 작업

  • C(Create) : 데이터 추가
  • R(Read) : 데이터 조회
  • U(Update) : 데이터 변경
  • D(Delete) : 데이터 삭제

3. collection 인터페이스

Collection은 List와 Set의 상위 인터페이스
Collection 인터페이스는 컬렉션 클래스에 저장된 데이터를 읽고, 추가하고, 삭제하는 등 컬렉션을 다루는데 가장 기본이적인 메서드들을 정의하고 있다.

1) List

  • java.util.list
  • 순차 자료 구조에 대한 설계
  • 순서가 있는 자료, 예) 배열
  • 특정 순서에 추가, 제거, 변경 등의 매개변수가 정의된 메서드가 많이 존재
  • 매개변수가 주로 int index로 이루어져있다.

추가

  • boolean add(E e)
  • boolean add(int index, E e)
  • boolean addAll(Collection<? extends E> ...)
  • boolean addAll(int index, Collection ..)

조회

  • E get(int index)
  • int indexOf(Object e) : 특정 요소의 위치 번호(왼쪽 👉 오른쪽), 없을때는 -1
  • int lastIndexOf(Object e) : 특정 요소의 위치 번호(오른쪽 👉 왼쪽), 없을때는 -1
  • boolean contains(Object e)
  • boolean containsAll(Collection<?> ..)

수정

  • E set(int index, E e): 특정 위치에 있는 요소를 변경

삭제

  • E remove(int index): 특정 순서 위치에 있는 요소 제거(꺼낸다...)
  • boolean remove(Object e)
  • boolean removeAll(Collection ...)

기타

  • int size() : 요소의 갯수
  • void clear() : 요소 비우기
  • retailAll(Collection ..): 매개변수에 있는 값만 유지하고 모두 제거(교집합)

1) ArrayList

  • 배열을 구현한 클래스
  • 스택 구현시 활용 가능
  • 쓰레드 안정성 확보 ❌
  • 배열은 물리적으로 붙어 있는 나열 구조 👉 순차 조회는 매우 빠름
  • List 구현 클래스 중 가장 많이 사용
Clss ArrayList<E>
  java.lang.Object
  java.util.AbstractCollection<E>
  java.util.AbstarctList<E>
  java.util.ArrayList<E>

ArrayList의 기본 배열 갯수의 문제점
기본 생성 배열 갯수 10이다.
공간의 갯수가 부족하면 👉 배열이 2배 크기로 새로 생성되어진다.
해결방안) 데이터의 양을 충분히 예상 할 수 있는 경우는 충분한 크기를 만들어야 성능이 좋다.

위치(순서)가 변경되는 수정, 삭제의 문제점
배열은 위치(순서)를 변경할수 없기 때문에 순서가 변경되는 수정, 삭제는 새로운 배열이 매번 생성 되어 성능저하를 야기시킨다.
👉 제거를 역순으로 하여 위치(순서)변경이 없도록 유도
👉 위치(순서)가 자주 변경되는 자료에서 불리하다.

public class Ex01{
	public static void main(String[] args){
    	ArrayList<String> names = new ArrayList<>();
        names.add("이름1"); //추가
        names.add("이름2");
        names.add("이름3");
        names.add("이름4");
        names.add("이름5");
        System.out.println(names); 
        // names.toString() 담긴 값을 확인할 수 있도록 재정의
        for( int i=0; i<names.size(); i++){
        	String name = names.get(i); // 조회
            System.out.println(name);
        }        
        for( int i=0; i<names.size(); i++){
        	names.remove(i); //제거
            //삭제가되면 위치를 변경할수가 없기 때문에 새로운 객체로 재형성됨
            //제거를 역순으로 하는것이 제일 좋다.
        }
        for(int i = names.size() -1 ; i>=0 ; i--){
            names.remove(i);
            //역순으로 제거함으로써 객체를 재형성하지 않아도된다.
        }
        for(int i = 0 ; i < names.size();i++){ //조회
            System.out.println(names.get(i));
        }
    }
}

Stack

  • E pop() : 끝 요소 꺼내기
  • E push(E e): 끝에 추가
public class Ex02 {
    public static void main(String[] args) {
        Stack<String> names = new Stack<>();
        names.push("이름1"); //추가
        names.push("이름2");
        names.push("이름3");

        System.out.println(names.pop()); //꺼내기
        System.out.println(names.pop());
        System.out.println(names.pop());
        //> 이름3, 이름2, 이름1
    }
}

Vector

  • ArrayList 동일 / 배열을 구현한 클래스
  • 쓰레드 안정성 확보
  • 과거 기능의 호환성 유지를 위해 남겨둠.
  • capacity() : 백터의 크기를 확인할수있음.
 package exam04;

import java.util.Vector;

public class Ex03 {
    public static void main(String[] args) {
        Vector<String> names = new Vector<String>(3); //공간을 3으로 설정
        System.out.println(names.capacity()); //기본값은 10
        names.add("이름1");
        names.add("이름2");
        names.add("이름3");
        names.add("이름3");
        System.out.println(names.capacity()); //공간이 넘쳤기 때문에 크기가 두배로 증가.
    }
}

2) LinkedList

  • 다음 요소, 이전 요소를 주소를 가지고 서로 연결 관계(물리적 순서 ❌, 논리적 순서⭕️)
  • 수정 삭제 등 순서 위치가 자주 변경되는 자료에서 유리 주소를 모두 가지고 있는 형태
  • 다음 요소 위치 주소만 변경하면 되므로, 성능 저하 ❌
  • 논리적 순서이므로 위치를 계산하는 일을 더 수행하므로 ArrayList 보다는 조회에서 불리
  • 자바는 DoublyLinkedList 형태로 구현, 다음요소, 이전요소의 주소를 모두 가지고 있는 형태
Clss LinkedList<E>
  java.lang.Object
  java.util.AbstractCollection<E>
  java.util.AbstarctList<E>
  java.util.AbstractSequentialList<E>
  java.util.LinkedList<E>


설계가 동일하기 때문에 ArrayList와 LinkedList는 서로 호환이 가능.
LinkedList상위에는 List가 있기 때문에 다형성을 통해 변경이 가능하다.(업캐스팅) ArrayList도 동일

public class Ex01{
	public static void main(String[] args){
    	List<String> names = new LinkedList<>();
        names.add("이름1"); //추가
        names.add("이름2");
        names.add("이름3");
        names.add("이름4");
        names.add("이름5");
 		...
    }
}

Queue

  • boolean offer(E e) : 끝에 요소 추가
  • E poll() : 앞에서 요소 꺼내기

Deque

  • boolean offerFirst(E e) : 요소 앞에추가
  • boolean offerLast(E e) : 요소 뒤에추가
  • E poolFirst() : 가장 앞에 요소 꺼내기
  • E poolLast() : 가장 뒤에 요소 꺼내기
public class Ex04 {
    public static void main(String[] args) {
        Queue<Integer> items = new LinkedList<>(); //다형성으로 가능
        items.offer(1);
        items.offer(2);
        items.offer(3);

        System.out.println(items.poll()); //1
        System.out.println(items.poll()); //2
        System.out.println(items.poll()); //3
    }
}

2) Set

집합 자료 구조에 대한 설계

  • java.util.set
  • 중복이 없는 자료
  • 중복 제거 기준 : 동등성 비교 - equals() and hashCode()
  • 순서 유지는 중요 ❌
  • 조회 수정 불가

추가

  • boolean add(E e)
  • boolean addAll(Collection..)

삭제

  • boolean remove(Object e)
  • boolean removeAll(Collection ...)

기타

  • int size() : 요소의 갯수
  • void clear() : 전체 비우기
  • boolean contains(Object e)
  • boolean containsAll(Collection<?> ..)
  • boolean retainAll(Collection<?>..)

HashSet

HashSet으로 객체를 생성할경우 순서는 지켜지지 않는다.
정렬을 원하면 TreeSet으로 객체를 생성하고 java.lang.Comparable에 있는 추상메서드 Int compareTo(T o)를 정의해야한다.

public class Ex04 {
    public static void main(String[] args) {
        HashSet<String> names = new HashSet<>();
        names.add("이름1");
        names.add("이름2");
        names.add("이름3");
        names.add("이름4");
        names.add("이름5");
        System.out.println(names); //names.toString()
    }
}

TreeSet

HashSet + 정렬
SortedSet 인터페이스


기준

  • 집합 : HashSet, TreeSet - 중복 제거 기준
    • equlas() and hashCode()
  • 정렬 : TreeSet - 기본정렬기준(Natural Order)
    • java.lang.Comparable
      있는 추상메서드 Int compareTo(T o)를 정의해야한다.

3) Map


사전 자료 구조에 대한 설계

  • 키, 값의 쌍
  • 키 : 값을 찾기 위한 값
    • 중복금지 (집합자료)
  • 값 : 중복허용

추가

  • V put(K key, V vlaue)
    key가 없을 땐 추가, 있을 땐 value값 수정
  • void putAll(Map...)
    MAP 객체로 전체 추가시
  • V putlfAbsent(K key, V value)
    Key가 없을때만 value값 추가

조회

  • V get(Object key)
    key를 가지고 값 조회, 없을땐 null
  • V getOrDefault(Object key, V defaultValue)
    key를 가지고 조회, 없을 땐 defaultaValue로 대체
  • Set<Map.Entry<K,V>> entrySet() : 전체 키를

수정

  • V put(Object key, V value): key를 가지고 제거
  • V repalce(K key, V value)
  • boolean replace(K key, V oldValue, V newValue): 기존 값이 oldValue로 일치하는 경우메만 newValue로 변경

삭제

  • V remove(Object key) : key를 가지고 제거
  • boolean remove(Object key, Object value) : key와 value가 일치하는 요소만 제거.

기타

  • int size() : 요소의 갯수
  • Set<K>KeySet() : Map에 포함되어 있는 키값만 추출
  • Collection<V> values() : Map에 포함되어 있는 값만 추출
  • boolean containsKey(Object key) : Map key가 포함되어 있는지 여부
  • boolean containsValue(Object value) : Map에 value가 포함되어 있는지 여부

Hashmap

TreeMap

키 값의 정렬
기본 정렬 기준 : java.lang.Comparable/int compareTo(...)
대안 정렬 기준 : java.util.Comparator /int compare(...)

4. Iterator, ListIterator, Enumeration

Iterator : 반복자 패턴 인터페이스

  • 참고) Enumeration : 동일한 반복자 패턴 구현 인터페이스, Iterator보다 먼저 등장
Collection
 Iterator <E> iterator()
  • boolean hasNext(): 다음 요소가 있는지 체크
  • E next() : 다음 커서로 이동 요소를 조회
public class Ex01 {
    public static void main(String[] args) {
        ArrayList<Book> books = new ArrayList<>();
        books.add(new Book(1000,"책1","저자1"));
        books.add(new Book(1001,"책2","저자2"));
        books.add(new Book(1002,"책3","저자3"));
        books.add(new Book(1003,"책4","저자4"));
        books.add(new Book(1004,"책5","저자5"));

        Iterator<Book> iter = books.iterator();

        while(iter.hasNext()){
            Book book = iter.next();
            System.out.println(book);
        }
        iter = books.iterator(); //커서가 뒤에 있기때문에 다시 값을 초기화해주어야 커서가 맨앞으로간다.
        while(iter.hasNext()){ 
            Book book = iter.next();
            System.out.println(book);
        }
    }
}

ListIterator

  • List에 특화되어 있는 Iteraor, List 인터페이스에 정의
  • 순서에 대한 메서드가 정의
  • hasNext(), next() : 순방향조회
  • hasPrevious(), previous(), previousIndex(): 역방향 조회
  • nextIndex() : 현재 인덱스 번호
    👉 반복은 처읍부터 끝까지 조회가 가장 많다
    👉 향상된 for문
public class Ex02 {
    public static void main(String[] args) {
        ArrayList<Book> books = new ArrayList<>();
        books.add(new Book(1000,"책1","저자1"));
        books.add(new Book(1001,"책2","저자2"));
        books.add(new Book(1002,"책3","저자3"));
        books.add(new Book(1003,"책4","저자4"));
        books.add(new Book(1004,"책5","저자5"));

        ListIterator<Book> iter = books.listIterator();
        System.out.println("-----순방향-----");
        while(iter.hasNext()){
            Book book = iter.next();
            int index = iter.nextIndex();
            System.out.println(book);
            System.out.println("index : " + index);
        }
        System.out.println("-----역방향-----");
        while(iter.hasPrevious()){
            Book book = iter.previous();
            int index = iter.previousIndex();
            System.out.println(book);
            System.out.println("index : " + index);
        }
    }
}
public class Ex02 {
    public static void main(String[] args) {
        ArrayList<Book> books = new ArrayList<>();
        books.add(new Book(1000,"책1","저자1"));
        books.add(new Book(1001,"책2","저자2"));
        books.add(new Book(1002,"책3","저자3"));
        books.add(new Book(1003,"책4","저자4"));
        books.add(new Book(1004,"책5","저자5"));

        for(Book book : books) { //향상된 for문
        	system.out.println(book);
        }
        books.forEach(System.out::println);
        
    }
}

5. Comparator와 Comparable

1) Comparable

기본 정렬 기준 인터페이스
java.lang.Comparable
기본 정렬 기준 : Natural Ordering

int compareTo(T o2)

  • 반환값이 양수 : 현재 객체 뒤로 배치, T o를 앞에 배치
  • 반환값이 0 : 배치 X
  • 반환값이 음수 : 현재 객체를 앞으로 배치, T o는 뒤에 배치
  • 현재 객체의 정수 - 비교객체의 정수 : 오름차순
  • 비교 객체의 정수 - 현재객체의 정수 : 내림차순
public class Book implemnets Comparable<book> {//comapreTo 추상메서드를 정의하지 않으면 오류가 발생한다.
	private int isbn;
    private String title;
    private String author;
    
    public Book(int isbn, String title, String author)
    {
    	this.isbn = isbn;
        this.title = title;
        this.author = author;
    }
    
    //comapreTo 추상메서드를 구현해야한다.
    public int comapreTo(Book o){
    	return isbn - o.isbn; //오름차순
        return o.isbn - isbn; //내림차순
    }
}

2) Comparator

대안적인 정렬 기준 인터페이스

  • java.util.Comparator
  • int compare(T o1, T o2)
    • o1 정수 - o2 정수 : 오름차순
    • o2 정수 - o1 정수 : 내림차순
  • naturalOrder() : 기분 정렬 기준 사용한 정렬(java.lang.Comparable, int compareTo(..))
  • reversedOrder() : 기본 정렬 기준의 반대
public class Ex04 {
    public static void main(String[] args) {
        //HashSet<String> names = new HashSet<>();

        Comparator<String> comp = new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {

                return o1.compareTo(o2); //오름차순
                //return o2.compareTo(o1); //내림차순
                // return o1.compareTo(o2) * -1; //내림차순
            }
        };
        Set<String> names = new TreeSet<>(comp); //매개변수에 위에서 오버라이딩한 Comparator를 넣게 되면 해당 기준으로 정렬된다.
        //String에서는 내부에 Comparable이 정의 되어있기때문에 정렬기준으로 정렬이된다.
        //또한 내부에서 final로 정의되어있기때문에 외부에서 재정의가 불가능하기 때문에,
        //항상 오름차순으로만 정렬된다.
        names.add("이름1");
        names.add("이름2");
        names.add("이름4");
        names.add("이름3");
        names.add("이름5");
        System.out.println(names); //names.toString()

    }
}

Comparator.reverseOrder())

package exam01;

public class Ex04 {
    public static void main(String[] args) {
        
        Set<String> names = new TreeSet<>(Comparator.reverseOrder());
        names.add("이름1");
        names.add("이름2");
        names.add("이름4");
        names.add("이름3");
        names.add("이름5");
        System.out.println(names); //names.toString()
    }
}

6. Arrays

  • java.util.Arrays
  • 배열의 편의 기능 모음

7. Collections

  • `java.util.Collections``
  • 컬렉션의 편의 기능 모음

참고)

  • Unsigned : 양수
  • byte = -128~127
  • Unsigned Byte = 0~ 255

8. 기준

  • 집합 : HashSet, TreeSet - 중복 제거기준
    • equals() and hashCode()
  • 정렬 : TreeSet - 기본 정렬 기준 (Natural Order)
    • java.lang.Comparable
      • int comapareTo(T o)
profile
안녕하세요!

0개의 댓글