Java 기본 (6) - Collection(List / Set / Map) / Iterator / 유틸 클래스(Arrays, Collections)

ref : 남궁성님의 자바의 정석 유튜브를 참조합니다
https://www.youtube.com/watch?v=z9GpUGoYCw4&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=118
https://www.youtube.com/watch?v=RscGmop2Bzo&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=119
https://www.youtube.com/watch?v=u0pJGFyvrqc&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=133
https://gangnam-americano.tistory.com/41

컬렉션 프레임워크

[ 설명 ]

컬렉션 프레임워크(Collection Framework)

  • 컬렉션(다수의 객체)을 다루기 위한 표준화된 프로그래밍 방식
  • 컬렉션쉽고 편리하게 다룰 수 있는 다양한 클래스 제공
    (저장 삭제 검색 정렬 등)

컬렉션 클래스

  • 다수의 데이터저장할 수 있는 클래스
  • ex) Vector, ArrayList, HashSet

[ 핵심 인터페이스 ]

[ Collection 인터페이스 메서드 ]

List 인터페이스

[ 정보 ]

설명

  • 순서있으며, 데이터의 중복허용
  • Collection 인터페이스자손
  • ArrayList / LinkedList / Stack / Vector
  • ArrayListLinkedList 가 핵심
  • ex) 대기자 명단

구조


주요 메서드

[ ArrayList ]

설명

  • 기존의 Vector개선한 것으로 구현원리기능적으로 동일
  • Vector동기화 처리 O / ArrayList동기화 처리 X
  • List 인터페이스를 구현 --> 순서 O / 중복 O
  • 데이터 저장공간으로 배열을 사용(배열 기반)
  • 데이터Object만 가능 --> 즉, 객체가능
    • 기본형(primitive type)을 넣어도 되긴함 --> 컴파일러오토박싱을 해주기 때문
  • 정렬을 할때에는 Collections 라는 유틸 클래스를 통해 수행
    • 오름차순 : Collections.sort(list)
    • 내림차순 : Collections.sort(list, Collections.reverseOrder())
  • 모든 객체 삭제시 유의
    • 첫번째 요소부터 삭제 : 배열 복사 발생 O --> 비효율적
    • 마지막 요소부터 삭제 : 배열 복사 발생 X --> 훨씬 효율적

생성자

  • ArrayList() : 기본 생성자
  • ArrayList(Collection c) : 컬렉션으로 초기화
  • ArrayLis(int initialCapacity) : 배열의 길이 지정

추가

  • boolean add(Object o) : 맨 뒤에 삽입
  • void add(int index, Object element) : 특정 위치삽입
  • boolean addAll(Collection c)
  • boolean addAll(int index, Collection c)

삭제

  • boolean remove(Object o) : 해당 객체 삭제
  • Object remove(int index) : 특정 위치에 있는 객체 삭제
  • boolean removeAll(Collection c) : collection에 있는 객체삭제
  • void clear() : 모든 객체 삭제

검색

  • int indexOf(Object o)
  • int lastIndexOf(Object o)
  • boolean contains(Object o)
  • Object get(int index) : index에 있는 객체 읽기

그 외

  • Object set(int index, Object element) : index에 있는 객체 변경
  • List subList(int fromIndex, int toIndex)
  • Object[] toArray() : ArrayList객체 배열반환
  • Object[] toArray(Object a)
  • boolean isEmpty()
  • void trimToSize() : 빈 공간 제거
  • int size()

[ LinkedList ]

[ Stack ]

설명

  • LIFO 구조
  • Java에서 Stack클래스라서 바로 생성해서 사용 가능
Stack s = new Stack();
s.push(1);
s.push(2);
s.pop();

메서드

  • peek() : 맨 위 객체 읽기
  • search() : 특정 객체의 위치반환 / 없으면 -1 반환

[ Queue ]

설명

  • FIFO 구조
  • Java에서 Queue인터페이스라서 직접 생성할 수 없음
    • 직접 구현 --> 실제로는 잘 사용하지 X
    • Queue를 구현한 클래스를 사용
      • LinkedList : 주로 Queue를 사용할 때 LinkedList로 자주 사용
      • PriorityQueue
      • 등 매우 많음
Queue q = new LinkedList();
q.offer(1);
q.offer(2);
q.poll();

메서드

  • 똑같은 추가/삭제 기능이지만 예외 발생 여부나뉜다
  • 보통 예외 없이 poll() / offer()사용

Set 인터페이스

[ 정보 ]

설명

  • 순서없으며, 데이터의 중복허용하지 않음
  • Collection 인터페이스자손
  • ex) 양의 정수 집합
  • 구조
  • HashSet / TreeSet 이 핵심

메서드

  • Collection동일하며 아래 특징을 기억하면 좋음
    : 합집합 / 부분집합 / 차집합 / 교집합

[ HashSet ]

설명

  • Set 인터페이스구현대표적인 컬렉션 클래스
    • 순서 X
      • 순서가 없기 때문정렬 불가능 --> 정렬하려면 List로 옮겨서 정렬 수행
    • 중복 X
      • 중복이 없어야 하기 때문내가 만든 객체를 저장할 때에는
        euqlas() / hashCode()오버라이딩 해야 정상 동작
  • 순서를 유지하려면, LinkedHashSet 클래스 사용하면 됨
  • TreeSet범위 검색정렬유리하지만, 데이터 추가 / 삭제불리

생성자

  • HashSet()
  • HashSet(Collection c)
  • HashSet(int initialCapacity)
  • HashSet(int initialCapacity, float loadFactor)
    : loadFactor 이 0.8이면 80%가 되었을 때 capacity를 늘리도록 설정

추가

  • boolean add(Object o) : 추가
  • boolean addAll(Collection c) : 합집합

삭제

  • boolean remove(Object o)
  • boolean removeAll(Collection c) : 교집합(공통된 것 삭제)
  • boolean retainAll(Collection c) : 차집합(포함되는 것 삭제)
  • void clear() : 모두 삭제

그 외

  • boolean contains(Object o)
  • boolean containsAll(Collection c) : 모두 포함되어있는지 확인
  • Iterator iterator()
  • boolean isEmpty()
  • int size()
  • Object[] toArray() : set에 저장되어 있는 객체객체 배열반환
  • Object[] ToArray(Object[] a)

[ TreeSet / LinkedHashSet ]

TreeSet

  • 이진 검색 트리 자료구조의 형태데이터를 저장하는 컬렉션 클래스
  • 추가와 삭제에는 시간이 더 걸리지만, 정렬, 검색높은 성능을 가짐
  • Red-Black 트리구현되어 있다
  • 필요시 관련 메서드를 찾아보자

LinkedHashSet

  • HashSet동일한 구조
  • 데이터 요소들이 순서를 가짐
  • 필요시 관련 메서드를 찾아보자

Map 인터페이스

[ 정보 ]

설명

  • 키(key)값(value)쌍(pair)으로 이루어진 데이터의 집합
  • 순서없으며, 중복을 허용하지 않고, 중복을 허용
  • HashMap / TreeMap / Hashtable / Properties
  • ex) 아이디-비밀번호
  • 구조
  • HashMap / TreeMap 이 핵심
  • HashtableHashMap매우 유사하며, HashMap개선된 것

메서드

[ HashMap ]

설명

  • Hashtable개선버전
  • 배열링크드 리스트조합된 형태
  • 해싱(hashing) 기법으로 데이터 저장해서 검색이 빠르다
  • keyvalue로 이루어진 하나의 쌍(pair)로 저장 / 하나의 쌍entry 라고 함
  • List 인터페이스를 구현한 대표적인 클래스
    • 순서 X
    • value중복 O
  • 순서유지하려면, LinkedHashMap 클래스를 사용
  • TreeMap범위검색정렬유리 / 데이터 추가, 삭제불리

생성자

  • HashMap()
  • HashMap(int initialCapacity)
  • HashMap(int initialCapacity, float loadFactor)
  • HashMap(Map m)

추가

  • Object put(Object key, Object value)
    : 이미 있는 key값을 넣으면 변경이 수행됨
  • void putAll(Map m)

삭제

  • Object remove(Object key)

변경

  • Object replace(Object key, Object value) : key에 저장value새로운 value수정
  • boolean replace(Object key, Object oldValue, Object newValue)

그 외

  • Set entrySet() : entry들 조회
  • Set keySet() : key들 조회
  • Collection values() : value들 조회
  • Object get(Object key)
  • Object getOrDefault(Object key, Obejct defaultValue)
    : keyvalue조회하는데, 없는 keydefaultValue반환
  • boolean containsKey(Object key)
  • boolean containsValue(Object value)
  • int size()
  • boolean isEmpty()
  • void clear()
  • object clone()

[ TreeMap / LinkedHashMap ]

TreeMap

  • 이진트리기반으로 한 Map 컬렉션 클래스
  • TreeSet과 유사하지만 key뿐만 아니라 value도 저장
  • 정렬된 상태에서 데이터를 조회해야 하는 범위 검색성능이 좋음
  • 역시 Red-Black 트리구현
  • 필요시 관련 메서드를 찾아보자

LinkedHashMap

  • HashMap확장하는 클래스
  • 데이터 요소들 간 순서를 가짐
  • 필요시 관련 메서드를 찾아보자

Iterator & Enumeration & ListIterator

[ 정보 ]

Iterator

  • 컬렉션에 저장된 요소읽어오는 방법표준화 한 것
  • 각 컬렉션마다 읽어오는 방법이 달라서 표준화해서 사용하면 편함

Enumeration & ListIterator

  • EnumerationIterator의 구버전 --> Iterator를 쓰면 됨
  • ListIteratorList에서 사용하는 Iteratorprevious도 있지만 잘 사용하지는 않음
    (양방향)

핵심 메서드

  • 종류
    • boolean hasNext() : 읽어올 요소남아있는지 확인
    • Object next() : 다음 요소읽어옴
  • 사용
    • Collection 인터페이스에 있는 iterator() 메소드를 통해서 받아올 수 있음
    • iter.hashNext()다음 요소가 존재하는지 확인한 뒤 iter.next()값에 접근
  ArrayList<Integer> list = new ArrayList();
  list.add(1);
  list.add(2);
  list.add(3);

  /* iterator는 1회용이라서 다시 순회하려면 다시 iterator를 생성해야 한다 */
  Iterator<Integer> it = list.iterator();
  while(it.hasNext()){
      System.out.println(it.next());
  }

[ Map과 Iterator ]

  • MapCollection 인터페이스자손이 아님
  • Map에는 iterator가 없다
  • keySet() / entySet() / values() 를 통해서 요소에 접근해야 한다
Map<String, String>  cities = new HashMap<>();
cities.put("Tokyo", "Japan");
cities.put("Seoul", "Korea");
cities.put("Beijing", "China");

/* iterator 사용 */
for(Map.Entry<String, String> enty : cities.entySet()){
  System.out.println(entry.getKey() + entry.getValue());
}

/* java 8의 forEach + Lambda 사용 */
cities.forEach((k, v) -> System.out.println(k + v));

유틸 클래스(Util Class)

[ Arrays ]

설명

  • 배열을 다루기 위한 메서드(static) 제공하는 유틸 클래스
  • 배열의 출력 : toString()
  • 배열의 복사 : copyOf() / copyOfRange()
  • 배열 채우기 : fill() / setAll()
  • 배열의 정렬과 검색 : sort() / binarySearch()

다차원 배열

  • 출력 : deepToString()
  • 비교 : deepEquals()
    (2차월 배열기본적인 equals()정상 동작하지 X)

배열 --> List 변환

  • asList()
  • 반환 값읽기 전용이기 때문에 변경을 하려면 새로 할당 필요

사용 예시

/* toString() */
int[] arr = {1, 2, 3, 4, 5};
Arrays.toString(arr); // [1, 2, 3, 4, 5] 로 출력

/* copyOf() copyOfRange() */
int[] arr = {0,1,2,3,4};
int[] arr2 = Arrays.copyOf(arr, arr.length); // arr의 전체를 복사
int[] arr3 = Arrays.copyOfRange(arr, 2, 4) // arr의 2~3인덱스 까지 복사

/* fill() setAll() */
int[] arr = new int[5];
Arrays.fill(arr, 9); // 9로 채우기
Arrays.setAll(arr, (i) -> (int)(Math.random()*5+1)); // 1~5의 랜덤값으로 채우기

/* sort() binarySearch() */
int[] arr = {3, 2, 0, 1, 4};
Arrays.sort(arr); // 오름차순 정렬
Arrays.binarySearch(arr, 2); // 이진탐색은 정렬 후에 정상 동작함 --> idx=2 결과

/* deepToString() deepEquals() */
String[][] str2D = new String[][]{{"abc", "def"}, {"ABC", "DEF"}};
String[][] str2D2 = new String[][]{{"abc", "def"}, {"ABC", "DEF"}};
Arrays.deepToString(arr2D); // [["abc", "def"], ["ABC", "DEF"]]
Arrays.deepEquals(std2D, str2D2); // true

/* asList() */
List list = Array.asList(new Integer[]{1,2,3,4,5});
list.add(6); // 예외 발생 --> 읽기전용이기 때문
// 아래처럼 값을 가진 새로운 List를 할당해야 변경 가능
List list = new ArrayList(Arrays.asList(new Integer[]{1,2,3,4,5}));

[ Collections ]

설명

  • 컬렉션을 다루기 위한 메서드(static) 제공하는 유틸 클래스
  • 내림차순 정렬Collections.reverseOrder() 를 통해 Comparator을 사용
  • 컬렉션 채우기 : fill()
  • 컬렉션 복사 : copy()
  • 컬렉션 정렬 : sort()
  • 컬렉션 탐색 : binarySearch()

컬렉션 동기화 - synchronizedXXX()

  • 기존에는 항상 동기화를 수행했으나, 이제는 default로 동기화를 수행하지 않고, 필요할 때 사용하는 방식
    --> Vector 대신 ArrayList 처럼
  • synchronizedList(List list)
  • synchronizedSet(Set s)
  • synchronizedMap(Map m)

변경 불가 컬렉션 만들기 - unmodifiableXXX()

  • 반환값으로 읽기 전용 객체가 만들어짐
  • unmodifiableList(List list)
  • unmodifiableSet(Set s)
  • unmodifiableMap(Map m)

싱글톤 컬렉션 만들기 - singletonXXX()

  • 1개의 인스턴스만들어짐
  • singletonList(List list)
  • singletonSet(Set s)
  • singletonMap(Map m)

한 종류의 객체만 저장하는 컬렉션 만들기 - checkedXXX()

  • 사실 Java 8 부터는 제네릭스(Generics)가 있어서 사용할 일은 없음
  • 존재 여부만 확인

기타

  • rotate()
  • swap()
  • shffle()
  • 등등

컬렉션 클래스 정리 & 요약

[ 전체 흐름 ]

  • Collection Framework주요 인터페이스List / Set / Map이 존재
  • 그 중 List / Set 인터페이스Collection 인터페이스상속받음

[ List ]

  • ArrayList
    • 배열 기반리스트
    • Vector와 다르게 동기화를 자동으로 하지 X --> 효율적
  • Vector
    • 표준화 되기 전 사용되던 것 --> 지금은 ArrayList 사용
    • 자동으로 동기화 기능이 존재 --> 비효율적
  • Stack
    • LIFO 구조stack을 구현한 클래스
    • Vector를 이용해 구현됨
  • LinkedList
    • ArrayList단점을 극복
    • 삽입 / 삭제유용하지만, 탐색ArrayList에 비해 불리
  • Queue
    • queue 자료구조를 의미하는 인터페이스
    • LinkedList를 구현체로 자주 사용

[ Set ]

  • HashSet
    • HashMap을 가지고 만들었으며, key만 있는 HashMap이라고 볼 수 있음
  • TreeSet
    • TreeMap을 가지고 만들었으며, key만 있는 TreeMap이라고 볼 수 있음
  • LinkedHashSet
    • 순서가 필요HashSet

[ Map ]

  • HashMap
    • 배열 + 링크드 리스트구조
    • (key, value)로 이루어진 entry를 가짐
  • Hashtable
    • HashMap과거 버전
  • TreeMap
    • 이진트리 구조를 가짐
    • 범위검색 / 정렬 기능 측면에서 용이
    • 데이터 삽입/삭제HashMap더 용이
  • Properties
    • (String, String) 만 가지는 HashMap
    • 파일 읽기 / 쓰기용이
  • LinkedHashMap
    • 순서가 필요HashMap

좋은 웹페이지 즐겨찾기