본문 바로가기

TIL(Today I Learned)

TIL-231014(자바의정석 Chapter11 '컬렉션 프레임웍')

📝오늘 공부한 것

  • 실전프로젝트 - '행동대장' 테스트 코드 작성하기
  • 프로그래머스 문제풀기
  • 자바 스터디

 

📌 자바의 정석 스터디

[컬렉션 프레임워크]

각 컬렉션을 다루는데 필요한 기능을 가진 3개의 인터페이스를 정의

인터페이스 List와 Set의 공통된 부분을 다시 뽑아서 새로운 인터페이스인 Collection을 추가로 정의

그림출처 : https://velog.io/@hyun_ha/JAVA-%EC%BB%AC%EB%A0%89%EC%85%98-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%ACCollection-Framework

Vector, Stack, Hashtable, Properties와 같은 기존의 컬렉션 클래스들은 호환을 위해 설계를 변경해서 나겨두었지만, 가능하면 사용하지 말것

대신, 새로 추가된 ArrayList와 HashMap을 사용하자

 

List인터페이스

저장순서 O, 중복 O

구현 클래스 : ArrayList, LinkedList, Stack, Vector

그림출처 : https://velog.io/@oyeon/11-36-Collection-List-Set-Map-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4

 

Set인터페이스

저장순서 X, 중복 X

구현 클래스 : HashSet, TreeSet

그림출처 : https://velog.io/@oyeon/11-36-Collection-List-Set-Map-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4

 

Map인터페이스

저장순서 X, 키 중복 X/ 값 중복 O

구현 클래스 : HashMap, TreeMap, Hashtable, Properties

그림출처 : https://velog.io/@oyeon/11-36-Collection-List-Set-Map-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4

Values()에서는 반환타입이 Collection이고, keySet()에서는 반환타입이 Set

→ Map인터페이스에서 value는 중복을 허용하기 때문에 Collection타입으로 반환하고, key는 중복을 허용하지 않기 때문에 Set타입으로 반환

 

Map.Entry인터페이스

  • Map인터페이스의 내부 인터페이스
  • 내부 클래스와 같이 내부 인터페이스를 정의하는 것이 가능
  • Map에 저장되는 key-value쌍을 다루기 위해 내부적으로 Entry인터페이스를 정의

ArrayList

  • 기존의 Vector를 개선
  • 선언된 배열의 타입이 모든 객체의 최고조상인 Object이기 때문에 모든 종류의 객체를 담을 수 있다.
  • ArrayList나 Vector같이 배열을 이용한 자료구조는 데이터를 읽어오고 저장하는 데는 효율이 좋지만, 용량을 변경해야 할 때는 새로운 배열을 생성한 후 기존의 배열로부터 새로 생성된 배열로 데이터를 복사해야하기 때문에 상당히 효율이 떨어진다는 단점이 있다.
  • 처음 인스턴스를 생성할 때, 저장한 데이터의 개수를 잘 고려하여 충분한 용량의 인스턴스를 생성하는 것이 좋다.

LinkedList

배열의 단점으로는

  1. 크기를 변경할 수 없다.
  2. 비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다.

가 있다.

  • LinkedList는 배열의 단점을 보완하기 위해서 나온 자료구조이다.
  • 배열은 모든 데이터가 연속적으로 존재하지만 LinkedList는 불연속적으로 존재하는 데이터를 서로 연결한 형태로 구성되어 있다.

doubly linked list(이중 연결리스트)

LinkedList의 단점을 보완한 것이다.

LinkedList보다 더 많이 사용된다.

 

doubly circular linked list(이중 원형 연결리스트)

더블 링크드 리스트의 접근성을 보다 향상시킨 것

단순히 더블 링크드 리스트의 첫번째 요소와 마지막 요소를 서로 연결시킨 것이다.

실제로 LinkedList클래스는 링크드 리스트의 단점인 낮은 접근성을 높이기 위해 더블 서큘러 링크드 리스트로 구현

LinkedList는 저장해야 하는 데이터의 개수가 많아질 수록 데이터를 읽어 오는 시간(접근시간)이 길어짐.

 

컬렉션 읽기(접근시간) 추가/삭제 비고
ArrayList 빠르다 느리다 순차적인 추가삭제는 더 빠름. 비효율적인 메모리사용
LinkedList 느리다 빠르다 데이터가 많을 수록 접근성이 떨어짐.

 

Stack과 Queue

Stack :

Stack클래스로 구현

활용 예 - 수식계산, 수식괄호검사, 워드프로세서의 undo/redo, 웹브라우저의 뒤로/앞으로

Queue :

Queue인터페이스로만 정의해 놓았을 뿐 별도의 클래스를 제공하고 있지 않음. 대신 Queue인터페이스를 구현한 클래스들을 선택해서 사용해야 함.

→ Queue는 ArrayList보다 LinkedList로 구현하는 것이 더 적합하다.

활용 예 - 최근사용문서, 인쇄작업 대기목록, buffer

PriorityQueue

  • Queue인터페이스의 구현체중 하나로, 저장한 순서에 관계없이 우선순위가 높은 것부터 꺼낸다. null 저장불가.
  • 저장공간으로 배열을 사용하며, 각 요소를 heap형태로 저장

Deque(Double-Ended Queue)

  • Queue의 변형으로, 양쪽 끝에 추가/삭제가 가능
  • 구현체로는 ArrayDeque과 LinkedList가 있다.

Iterator, Listiterator, Enumeration

Iterator

  • 컬렉션 프레임워크에서는 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화하였다. 컬렉션에 저장된 각 요소에 접근하는 기능을 가진 Iterator인터페이스를 정의하고, Collection인터페이스에는 Iterator를 반환하는 iterator()를 정의하고 있다.
  • Map인터페이스는 iterator()를 직접 호출할 수 없고, 그 대신 keySet()이나 entrySet()과 같은 메서드를 통해서 키와 값을 각각 따로 Set의 형태로 얻어 온 후에 다시 iterator()를 호출해야 한다.

ListIterator와 Enumeration

Enumeration : Iterator의 구버전

ListIterator : Iterator에 양뱡향 조회기능추가(List를 구현한 경우만 사용가능)

 

Arrays

배열의 복사 - copyOf(), copyOfRange()

배열 채우기 - fill(), setAll()

배열의 정렬과 검색 - sort(), binarySearch()

문자열의 비교와 출력 - equals(), toString()

배열을 List로 변환 - asList(Object… a)

 

Comparator와 Comparable

Comparable을 구현한 클래스는 정렬이 가능(기본적으로 오름차순)

Comparator는 기본 정렬기준 외에 다른 기준으로 정렬하고자 할 때 사용

*문자열의 오름차순 정렬은 공백, 숫자, 대문자, 소문자의 순으로 정렬(유니코드의 순서가 작은 값에서 큰 값으로)

 

HashSet

컬렉션 내의 중복된 요소들을 쉽게 제거할 수 있다.

저장순서를 유지하고 싶을 때는 LinkedHashSet사용

 

TreeSet

이진검색트리의 형태로 데이터를 저장하는 컬렉션 클래스

정렬된 상태를 유지하기 때문에 단일 값 검색과 범위검색이 매우 빠르다.

 

이진 검색 트리(binary search tree)

  • 노드의 추가삭제에 시간이 걸린다(순차적으로 저장하지 않으므로)
  • 검색과 정렬에 유리하다.

HashMap과 Hashtable

Hashtable은 key나 value으로 null 허용X

HashMap은 허용

 

해싱과 해시함수

해싱 : 해시함수를 이용해서 데이터를 hash table에 저장하고 검색하는 기법

해시함수는 데이터가 저장되어 있는 곳을 알려주기 때문에 다량의 데이터 중에서도 원하는 데이터를 빠르게 찾을 수 있다.

 

Properties

  • Hashtable은 키와 value를 (Object, Object)의 형태로 저장
  • Properties는 key와 value를 (String, String)의 형태로 저장하는 단순화된 컬렉션 클래스
  • 주로, 애플리케이션의 환경설정과 관련된 속성을 저장하는데 사용되며 데이터를 파일로부터 읽고 쓰는 편리한 기능을 제공
  • 간단한 입출력은 Properties를 활용하면 몇 줄의 코드로 쉽게 해결 가능