컬렉션 프레임워크란?· 자바에서 다수의 데이터를 효과적으로 처리하는 표준화된 방법을 제공하는 클래스 및 인터페이스 집합 Collection: 다수의 데이터 / Framework: 표준화된 프로그래밍 방식 · 컬렉션 프레임워크의 핵심 인터페이스 0. 다수의 데이터를 처리할 때 공통적으로 사용되는 메소드 정의: Collection 1. 순서가 있는 목록형: List 2. 순서가 중요하지 않은 셋형: Set 3. 먼저 들어온 것이 먼저 나가는 큐형: Queue 4. 키-값으로 저장되는 맵형: Map 컬렉션 인터페이스와 구현 클래스Collection
· List, Set, Queue의 조상 인터페이스 · Iterable<E> 인터페이스를 상속 - Iterable 인터페이스에 선언되어 있는 메소드는 Iterator() 메소드 하나, 이 메소드는 Iterator 인터페이스를 리턴 - Iterator 인터페이스에는 추가 데이터가 있는지 확인하는 hasNext(), 현재 위치를 다음 요소로 넘기고 그 값을 리턴하는 next(), 데이터를 삭제하는 remove() 메소드 존재 · Iterable 인터페이스 확장의 의미: Iterator 인터페이스를 사용하여 데이터를 순차적으로 가져올 수 있음 · 정의되어 있는 메서드 정보: https://docs.oracle.com/javase/9/docs/api/java/util/Collection.html · 해당 인터페이스를 구현한 클래스는 향상된 for문(Enhanced For Loop) 사용 가능 - for(타입이름 임시변수명 : 반복대상객체) Collection 인터페이스에 선언된 메소드
List· 중복을 허용하면서 저장순서가 유지되는 컬렉션을 구현하는데 사용 정의되어 있는 메서드 정보 -> https://docs.oracle.com/javase/9/docs/api/java/util/List.html · 구현체: ArrayList, LinkedList, Stack, Vector 등 ArrayList· 확장 가능한 배열 · Vector와 사용법과 기능이 거의 동일. 단, Vector는 Thread safe, ArrayList는 Thread safe x · ArrayList는 동시에 여러 개의 스레드가 접근 가능하고, Vector는 한 개의 스레드만 접근 가능 · ArrayList의 상속 구조 (Object - AbstractCollection - AbstractList 순으로 확장) ArrayList가 구현한 인터페이스
ArrayList의 생성자
· 데이터의 크기가 예측 가능하다면 예측 가능한 초기 크기를 지정하자. 매개 변수를 넣지 않으면 초기 크기는 10이다. 10개 이상의 데이터가 들어가면 크기를 늘리는 작업이 자동으로 수행되고, 이는 애플리케이션 성능에 영향을 준다. · ArrayList는 Thread safe하지 않으므로 여러 쓰레드에서 덤벼도 안전하게 만들려면 다음과 같이 객체를 생성
ArrayList에 선언된 메소드 - 데이터 추가
· Collection을 매개 변수로 제공하는 메서드, 생성자가 존재하는 이유: ArrayList, Set, Queue 등 다양한 클래스를 사용하여 데이터를 담을 수 있기 때문이다. 참고지식 - Deep copy, Shallow copy
· Deep copy: 원본 객체의 모든 값을 복사하여 다른 객체에 할당, 복제된 객체에 있는 값을 변경해도 원본에 영향 x · Shallow copy: 원본 객체의 주소 값만을 다른 객체에 할당, 복제된 객체에 있는 값을 변경하면 원본에 영향 ㅇ ArrayList에 선언된 메소드 - 데이터 가져오기
· 주의! : 배열.length는 배열의 저장 공간 개수를 의미, size() 메소드의 결과는 ArrayList에 들어가 있는 데이터 개수를 의미 ArrayList에 선언된 메소드 - 배열로 변환
예시
ArrayList에 선언된 메소드 - 데이터 삭제
ArrayList에 선언된 메소드 - 데이터 수정
기타메소드
· 객체를 원격으로 전송하거나 파일로 저장할 때 호출하면, 데이터의 크기를 줄일 수 있음 List와 ArrayList 선언의 차이
위의 list1 변수처럼 ArrayList가 아닌 List로 선언된 변수는 다음과 같이 필요에 따라 다른 리스트 클래스를 쓸 수 있는 구현상의 유연성을 제공한다. (즉, 대체할 수 있다)
타입의 생략JDK 1.7 이상부터는 인스턴스 생성시 타입을 추정할 수 있는 경우 타입을 생략할 수 있다.
Stack· Stack 클래스는 Vector 클래스를 확장 · 후입선출(LIFO, Last In First Out)을 지원하기 위해 필요 · Stack보다 성능이 좋은 ArrayDeque라는 클래스도 존재 · Stack은 Thread safe, ArrayDeque는 x · 사용예시 - 프로그래밍 언어에서 메소드가 호출된 순서를 기억하는 장소 · Stack의 상속 구조 · 구현한 인터페이스는 ArrayList와 동일 (Serializable, Cloneable, Iiterable<E>, Collection<E>, List<E>, RandomAccess) Stack의 생성자
Stack에 선언된 메소드
Set· 중복을 허용하지 않고, 저장순서가 유지되지 않는 컬렉션 클래스를 구현 · 주된 용도: 중복되는 것을 방지하고, 원하는 값이 포함되어 있는지 확인 · 정의되어 있는 메서드 정보: https://docs.oracle.com/javase/9/docs/api/java/util/Set.html · Set 구현체 - HashSet: 순서가 전혀 필요 없는 데이터를 해시 테이블에 저장. 정렬 작업 x. Set 중에 가장 좋은 성능. - TreeSet: 저장된 데이터의 값에 따라 정렬되는 셋. red-black 트리 타입으로 값 저장. HashSet보다 느린 성능. - LinkedHashSet: 연결된 목록 타입으로 구현된 해시 테이블에 데이터 저장. 저장된 순서에 따라 값이 정렬. 셋 중 성능이 가장 느림. HashSet· HashSet의 상속 구조 · AbstractSet 클래스에 구현되어 있는 메소드: equals, hashcode, removeAll HashSet이 구현한 인터페이스
· Set은 순서가 없으므로 List 처럼 순서가 매개 변수로 넘어가는 메소드(get)나 수행 결과가 데이터의 위치와 관련된 메소드(indexOf)가 존재하지 않는다. HashSet의 생성자
· 로드팩터: 데이터 개수 / 저장 공간 · 데이터의 개수가 증가하여 로드 팩터보다 커지면, 저장 공간의 크기는 증가되고 해시 재정리 작업이 필요 - 내부에 갖고 있는 자료 구조를 다시 생성하는 단계를 거치므로 성능에 영향 · 로그 팩터가 클수록 공간은 넉넉해지지만, 데이터를 찾는 시간은 증가 HashSet에 선언된 메소드
· HashSet에 저장되어 있는 값을 꺼래는 방법: for문, Iterator 객체 얻기 Queue· 먼저 들어온 데이터를 먼저 처리해주는FIFO(First In First Out) 기능을 지원하기 위해 필요한 인터페이스 · 여러 쓰레드에서 들어오는 작업을 순차적으로 처리할 때 많이 사용 ex) 웹서버에서 사용자들의 요청을 들어온 순서대로 처리 LinkedList· 리스트 구조의 데이터가 지속적으로 삭제되고, 추가될 경우 메모리 공간 측면에서 유리함 - ArrayList, Vector는 각 위치가 정해져 있어서 값을 삭제하면, 그 뒤에 있는 값들을 하나씩 앞으로 위치를 이동해야 제대로 된 위치의 값을 갖는다. - 반면에 LinkedList는 중간에 있는 데이터를 삭제하면, 지운 데이터의 앞에 있는 데이터와 뒤에 데이터를 연결하면 그만이다. 즉, 위치를 맞추기 위해 값을 이동하는 단계가 필요 없다. · List, Queue, Deque 인터페이스를 구현 · LinkedList의 상속 구조 LinkedList가 구현한 인터페이스
LinkedList의 생성자
· 일반적인 배열 타입의 클래스와 다르게 생성자로 객체를 생성할 때 크기를 지정하지 않음 - 각 데이터들이 앞 뒤로 연결되는 구조이므로, 미리 공간을 만들어 놓을 필요가 없음 LinkedList에 선언된 메소드 - 데이터 추가
· 중복된 기능을 수행하는 메소드가 많다. 메소드를 혼용하면 가독성이 떨어지므로 한가지만 선정하여 사용하는 것으 권장하며, add가 붙은 메소드를 사용하는 것이 오해의 소지가 가장 적다. LinkedList에 선언된 메소드 - 데이터 꺼내기
LinkeList에 선언된 메소드 - 포함된 객체 확인
LinkedList에 선언된 메소드 - 데이터 삭제 (대부분 데이터 삭제 후 리턴)
· 맨 앞에 있는 데이터를 삭제하는 메소드들은 removeFirst(), 맨 뒤에 있는 데이터를 삭제하는 메소드들은 removeLast() 메소드를 내부적으로 호출한다. 혼동을 피하려면 remove가 붙은 메소드를 사용할 것을 권장한다. LinkedList에 선언된 메소드 - iterator 객체를 반환 (LinkedList 객체를 하나씩 검색하기 위한)
· ListIterator는 Iterator 인터페이스가 다음 데이터만 검색할 수 있다는 단점을 보완하여, 이전 데이터도 검색할 수 있다. Map· 키(key)와 값(value)을 하나의 쌍으로 묶어서 저장하는 자료구조 · 키는 중복되지 않고, 해당 맵에서 고유함 · 값 없이 키만 저장 가능 ·Map에 저장된 모든 value객체를 반환하는 values()는 반환타입이 Collection (값은 중복을 허용하므로) ·Map에 저장된 모든 key객체를 반환하는 keySet()는 반환타입이 Set (키는 중복을 허용하지 않으므로) · 구현체: HahMap, TreeMap, LinkedHashMap, Hashtable, Properties Map 인터페이스에 선언된 메소드
· 존재하지 않는 키로 get()을 할 경우 null을 리턴 Hashtable· JDK 1.0부터 만들어져 사용된 클래스로 JDK 1.2에 추가된 Map 인터페이스에 맞추어 보완됨 · 따라서, Map 인터페이스를 구현했지만 일반적인 Map 인터페이스를 구현한 클래스들과 다름 - Enumeration 객체를 통해서 데이터 처리. Map은 컬렉션 뷰를 사용. - 키-값 쌍으로 데이터 순환 처리 불가능(키, 값은 가능). Map은 키, 값, 키-값 쌍으로 데이터 순환처리 가능. - 이터레이션을 처리하는 도중에 데이터를 삭제하는 안전한 방법 제공 x. Map은 제공. · HashMap과 Hashtable 클래스의 차이
HashMap· HashMap의 상속 구조 HashMap 클래스가 구현한 인터페이스
HashMap의 생성자
· 담을 데이터의 개수가 많은 경우 초기 크기 지정을 권장 · HashMap의 키는 기본 자료형, 참조 자료형 모두 가능 · 주의사항: 직접 어떤 클래스를 만들어 그 클래스를 키로 사용할 경우 Object 클래스의 hashCode(), equals() 메소드를 잘 구현해야함 - HashMap에 객체가 들어가면 hashCode() 메소드의 결과 값에 따른 버켓이라는 목록 형태의 바구니가 생성 - 서로 다른 키가 저장되었을 때 hashCode 메소드의 결과가 동일하다면, 이 버켓에 여러 개의 값이 들어갈 수 있음 - get() 메소드가 호출되면 hashCode()의 결과를 확인하고, 버켓에 들어간 목록에 데이터가 여러 개일 경우 equals() 메소드를 호출하여 동일한 값을 찾음 - 따라서 키가 되는 객체를 직접 작성할 경우 개발툴에서 제공하는 hashcode(), equals() 자동 생성 기능을 사용할 것 - 세부사항:https://d2.naver.com/helloworld/831311 HashMap 객체의 값을 확인하는 방법 · HashMap의 어떤 키가 있는지 확인하려면, 리턴타입이 Set인 keySet 메소드를 사용한다. 이때, Set의 제네릭 타입의 키의 제네릭 타입과 동일하게 지정한다.
· HashMap 객체에 담겨있는 값만 필요할 경우, 리턴타입이 Collection인 values() 메소드를 사용한다.
· 키와 값이 모두 필요할 때 entrySet() 메소드로 Map에 선언된 Entry 타입 객체를 리턴할 수 있다. Entry는 단 하나의 키와 값만이 저장된다.
TreeMap · SortedMap이라는 인터페이스를 구현하여 저장되는 키를 정렬함 · 문자열 기준으로 정렬되는 기본 순서는 "숫자 > 알파벳 대문자 > 알파벳 소문자 > 한글"
· 키가 정렬되기 때문에 매우 많은 데이터를 TreeMap을 이용하여 처리하면 HashMap보다 느리다. Properties· Hashtable을 확장한 클래스 · 자바에서 시스템 속성을 제공할 때 사용 예시 - 시스템 속성 출력
Properties 클래스에 선언된 메소드 · Properties 클래스는 시스템 속성을 다루기 위한 다양한 메소드 제공
Iterator, ListIterator, EnumerationIterator, ListIterator, Enumeration은 모두 컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스이다. Enumeration은 Iteration의 구버젼이며, ListIterator는 Iterator의 기능을 향상시킨 것이다. Iterator 컬렉션 프레임워크에서는 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화하였다. 컬렉션에 저장된 각 요소에 접근하는 기능을 가진 Iterator인터페이스를 정의하고, Collection 인터페이스에는 'Iterator(Iterator를 구현한 클래스의 인스턴스)'를 반환하는 iterator()를 정의하고 있다. Iterator()는 Collection인터페이스에 정의된 메서드이므로 Collection인터페이스의 자손인 List와 Set에도 포함되어 있다. 그래서 List나 Set인터페이스를 구현하는 컬렉션은 iterator()가 컬렉션의 특징에 알맞게 작성되어 있다.
Iterator 인터페이스를 실제로 ArrayList에서 구현한 코드를 통해 Iterator가 어떻게 컬렉션의 각 요소에 접근하는 지 확인할 수 있다. ArrayList대신 List인터페이스를 구현한 다른 컬렉션 클래스에 대해서도 동일한 메서드를 사용할 수 있다. Iterator를 이용해서 컬렉션의 요소를 읽어오는 방법을 표준화했기 때문에 이처럼 코드의 재사용성을 높이는 것이 가능하다. Map 인터페이스를 구현한 컬렉션 클래스는 키와 값을 쌍으로 저장하고 있기 때문에 iterator()를 직접 호출할 수 없고, 그 대신 keySet()이나 entrySet()과 같은 메서드를 통해서 키와 값을 각각 따로 Set의 형태로 얻어 온 후에 다시 iterator()를 호출해야 Iterator를 얻을 수 있다. ListIterator와 Enumeration Enumeration은 컬렉션 프레임워크가 만들어지기 이전에 사용하던 것으로 Iterator의 구버전으로 생각하면 된다. 각 인터페이스에 메서드이름만 다를 뿐 기능을 같다. 이전 버전으로 작성된 소스와의 호환을 위해서 남겨 두고 있을 뿐이므로 가능하면 Enumeration대신 Iterator를 사용하자. ListIterator는 Iterator를 상속받아서 기능을 추가한 것으로, 컬렉션의 요소에 접근할때 Iterator는 단방향으로만 이동할 수 있는 데 반해 ListIterator는 양방향으로의 이동이 가능하다. 다만 ArrayList나 LinkedList와 같이 List인터페이스를 구현한 컬렉션에서만 사용할 수 있다. Comparator와 ComparableComparator와 Comparable은 모두 인터페이스로 컬렉션을 정렬하는데 필요한 메서드를 정의하고 있다. Comparable을 구현하는 클래스들은 같은 타입의 인스턴스끼리 서로 비교할 수 있는 클래스들, 주로 Integer와 같은 Wrapper클래스와 String, Date, File과 같은 것들이며 기본적으로 오름차순으로 정렬되도록 구현되어 있다. 실제 소스는 다음과 같다.
compare()와 compareTo()는 선언형태와 이름이 다를 뿐 두 객체를 비교한다는 같은 기능을 목적으로 고안된 것이다. compareTo()의 반환값은 int이지만 실제로는 비교하는 두 객체가 같으면 0, 비교하는 값보다 작으면 음수, 크면 양수를 반환하도록 구현해야 한다. 이와 마찬가지로 compare()도 객체를 비교해서 음수, 0, 양수 중의 하나를 반환하도록 구현해야한다. Comparable을 구현한 클래스들이 기본적으로 오름차순으로 정렬되어 있지만, 내림차순으로 정렬한다던가 아니면 다른 기준에 의해서 정렬되도록 하고 싶을 때 Comparator를 구현해야 정렬 기준을 제공할 수 있다. #Arrays.sort() 메소드를 통해보는 Comprable, Comparator 예시 sort() 메소드는 기본적으로 Comparable 구현에 의해 오름 차순으로 정렬된다. Comparator를 지정하면 다른 방식으로 정렬할 수 있다. 컬렉션 클래스ArrayListp584 ArrayList의 정의와 원리 P588 저장 꿀팁 P588 벡터의 원리 https://smujihoon.tistory.com/158 p599 arraylist,vector의 장단점 LinkedListP596 배열과 링크드리스트 장단점 비교 p597 링크드리스트, 더블 링크드 리스트(자바링크드리스트 실제구현), 더블 써뮬러 링크드리스트 P600 링크드리스트와 ARRAYlIST 성능차이 비교 Stack과 Queue스택은 마지막에 저장한 데이터를 가장 먼저 꺼내게 되는 LIFO(Last in First Out)구조로 되어 있다. 동적통과 같은 구조로 양 옆과 바닥이 막혀 있어서 한 방향으로 뺄 수 있는 구조다. 큐는 처음에 저장한 데이터를 가장 먼저 꺼내게 되는 FIFO(First In First Out)구조로 되어있다. 파이프와 같은 구조롤 양 옆만 막혀 있고 위아래로 뚤려 있어서 한 방향으로는 넣고 한 방향으로는 뺄 수 있는 구조다. Arrayssort() 메서드 -> comparable 구현한거임 출처자바의 정석 자바의 신 http://tcpschool.com/java/java_collectionFramework_conceptObject |