//////
Search

Collection(List, Set, Map), 파일 읽기 by 장서현

태그
2022/10/06 11:59
사람
최종 편집 일시
2022/10/06 13:58

Collection

List

순서가 있으며 중복을 허용하는 컬렉션
List의 종류와 특징
1.
LinkedList
양방향 포인터 구조로 데이터의 삽입, 삭제가 빠르다.
ArrayList보다 검색이 느리다.
2.
ArrayList
단방향 포인터 구조로 데이터에 순차적으로 접근한다는 강점을 가진다.
배열을 기반으로 데이터를 저장한다.
데이터의 삽입, 삭제가 느리지만 데이터 검색이 빠르다.
실습1: students 리스트를 생성해서 값을 넣고 출력하기

List와 ArrayList의 차이

//두 코드의 차이점? ArrayList <Object> list = new ArrayList <>(); List <Object> list = new ArrayList <>();
Plain Text
복사
List는 인터페이스이고 ArrayList는 클래스이다.
두 코드는 같은 결과가 나오지만 List를 이용해서 ArrayList를 생성하면 유연성 효과를 볼 수 있다.
데이터의 용도에 따라 빠른 탐색을 위해서 ArrayList를 사용할 때가 있고,
삽입/삭제를 위해 LinkedList를 사용해야 하는 경우도 있기 때문에 List를 이용한다.
예를 들면
List list = new ArrayList();도형 list = new 정사각형();
ArrayList list = new ArrayList();정사각형 list = new 정사각형();
이런 느낌이다.

Set

중복을 허용하지 않는 컬렉션
1.
List와 달리 객체(데이터)를 중복해서 저장할 수 없는 컬렉션이다.
2.
저장된 객체(데이터)를 인덱스로 관리하지 않기 때문에 저장에 순서가 없다.
3.
대표적인 클래스들로 HashSet, TreeSet 등이 있다.
4.
List보다 많이 사용한다.
Set의 종류와 특징
1.
HashSet
인스턴스의 해시값을 기준으로 저장하기 때문에 순서를 보장하지 않는다.
Null값을 허용한다.
TreeSet보다 삽입, 삭제가 빠르다.
2.
LinkedHashSet
입력된 순서를 보장한다.
3.
TreeSet
데이터가 오름차순으로 정렬된다.
데이터의 삽입, 삭제에는 시간이 걸리지만 검색과 정렬은 빠르다.
Set 메서드
실습1: 랜덤한 숫자 50개 생성하기 (중복 가능)
실습2: 랜덤한 숫자 50개를 생성하고 중복 제거하기
실습3: A ~ Z 까지 랜덤한 알파벳을 50개 생성하고 중복 제거하기

Map

Key와 Value의 한 쌍으로 이루어진 컬렉션으로 순서를 보장하지 않는다.
1.
Map은 Collection과는 다른 방식으로, Map 인터페이스를 구현한 클래스들은 Key와 Value를 하나의 쌍으로 저장하는 방식을 사용한다.
2.
값을 구할 때 순차적으로 구하는 방식이 아닌 Key를 통해 Value를 얻는 방식으로 구한다.
3.
Key는 중복을 허용하지 않지만, Value는 중복을 허용한다.
4.
Key와 Value는 모두 객체이다. (primitive 타입이 아니다.)
5.
대표적인 클래스들로 HashMap, TreeMap등이 있고, HashMap이 대부분 빨라서 자주 사용한다.
6.
요소의 삽입 삭제 시간이 매우 빠르다.
Vector나 ArrayList와 달리 다른 요소들의 위치 이동이 필요하지 않기 때문이다.
Key를 활용하여 Key에 매핑된 Value 값을 remove() 메서드로 바로 삭제할 수 있다.
Map<String, Integer> hashMap = new HashMap<>(); hashMap.put("9팀", 1); hashMap.remove("9팀"); //요소 삭제
Java
복사
7.
요소 검색은 더욱 빠르다.
get() 메서드가 호출되면 해시 함수가 Key가 저장된 위치를 단번에 찾아낸다.
이에 반해, Vector나 ArrayList는 모든 요소들을 찾는 요소와 비교하는 과정이 필요하다.
따라서, Map은 Vector나 ArrayList에 비해 검색 속도 또한 더 빠르다.
Map의 종류와 특징
1.
HashMap
hashcode? → Key를 hashcode() 메서드에 매개변수로 전달하면 Value의 index값이 나온다.
Map<K, V> map = new HashMap<K, V>();
Key로 인덱스를 찾고 그 인덱스의 Value를 가져온다.
대량의 데이터를 빠르게 찾을 수 있다.
Key에 대한 중복이 없으며 순서를 보장하지 않는다.
Key와 Value값으로 Null을 허용한다.
동기화가 보장되지 않는다.
검색에 가장 뛰어난 성능을 가진다.
2.
HashTable
동기화가 보장되어 병렬 프로그래밍이 가능하고 HashMap보다 처리속도가 느리다.
Key와 Value값으로 Null을 허용하지 않는다.
3.
LinkedHashMap
입력된 순서를 보장한다.
4.
TreeMap
Key값을 기준으로 오름차순 정렬되고 빠른 검색이 가능하다.
저장 시 정렬을 하기 때문에 시간이 오래 걸린다.
Map 인터페이스의 메서드
실습1: Map 선언하고 값 넣기
실습2: String에서 알파벳 개수를 세는 알고리즘 구현하기

파일 읽기

파일을 읽는 방법으로는 FileReader, BufferedReader, Scanner, Files가 있다.
이 중 BufferedReader가 가장 빠르고 성능이 좋다. Buffer라는 임시 저장 공간에서 모았다가 한번에 보내기 때문이다.
FileReader가 모래를 한 알씩 옮기는 것이라면
BufferedReader는 모래를 모았다가 한번에 삽으로 옮기는 것과 같다.

FileReader

character 파일을 읽을 수 있는 기능을 제공한다.
read() 메서드를 사용하여 char를 한 글자씩 읽어올 수 있다.
더 이상 읽을 글자가 없으면, -1을 리턴한다.

BufferedReader

버퍼를 사용하여 외부 출력을 하기 때문에 효율적이다.
public BufferedReader(Reader in, int sz)
첫번째 파라미터는 reader 객체를 전달한다.
두번째 파라미터는 버퍼의 사이즈를 전달한다.
버퍼의 기본 사이즈는 8KB이다.
실습1: 한 글자씩 읽어오기
실습2: 두 글자씩 읽어오기
실습3: N글자 읽어오기
실습4: 현재 디렉터리 파일 목록 출력하기
실습5: 파일을 한 줄씩 읽기