자바에서 제공되는 자료구조 구현 클래스들 -
여기서는 이 클래스를 가져다 쓸 때 어떤 부분을 생각해야 하는지 정확하게 이해하는 것을 목표로 하기
1. 추가로 구현해야 되는 부분이 있는지.
2. 이 클래스 특성상 어떻게 출력이 될 수 있는지
3. 이 클래스는 무슨 기능을 제공하는지, 무엇을 위해서 존재하는 클래스인지
4. 내가 어떤 기능을 구현하기 위해서 가져다 쓰는 건지
컬렉션 프레임워크
- 프로그램 구현에 필요한 자료구조(Data Structure)를 구현해 놓은 JDK 라이브러리
- java.util 패키지에 구현되어 있음
- 개발에 소요되는 시간을 절약하면서 최적화된 알고리즘을 사용할 수 있음
- 여러 구현 클래스와 인터페이스의 활용에 대한 이해가 필요함
Collection 인터페이스
- 하나의 객체를 관리하기 위한 메서드가 선언된 인터페이스의
- 하위에 List와 Set 인터페이스가 있음
List 인터페이스
- 객체를 순서에 따라 저장하고 관리하는데 필요한 메서드가 선언된 인터페이스
- 자료구조 리스트 (배열, 연결 리스트)의 구현을 위한 인터페이스
- 중복을 허용함
- ArrayList, Vector, LinkedList, Stack, Queue 등...
Set 인터페이스
- 순서와 관계없이 중복을 허용하지 않고 유일한 값을 관리하는데 필요한 메서드가 선언됨
- 아이디, 주민번호, 사번 등을 관리하는데 유용
- 저장된 순서와 출력되는 순서는 다를 수 있음
- HashSet, TreeSet 등...
collection / list / set / map 인터페이스다
Collection 부분 애들은 하나의 요소를 관리 ( 이름이면 이름 , 학번이면 학번, 이런 식으로 )
List는 - 순서. 배열에 기반한 - 몇 번째 엘리먼트 이런 게 있다. ( 대표적으로 ArrayList )
순서에 기반해서 관리할 때 사용하면 좋음
Set 은 - 집합 - 중복을 허용하지 않는다. - 엘리먼트들은 유일한 값을 가진다. -
유일한 값 관리할 때 사용하면 좋음 ( 학번,사번등 ) - hash key값 - 순서 상관없음 - 검색을 위한 목적이므로
+ Tree 붙어있는 애들 -> 트리 발란스 유지해주는 바이너리 서치 트리로 적용 -> 정렬의 의미 -> 굉장히 잘 만들어진 알고리즘으로 만들어진 클래스다 -> 비교하는데 필요한 요소 관리
Map 인터페이스
- 쌍(pair)으로 이루어진 객체를 관리하는 데 사용하는 메서드들이 선언된 인터페이스
- 객체는 key-value의 쌍으로 이루어짐
- key는 중복을 허용하지 않음
- HashTable, HashMap, Properties, TreeMap 등이 Map 인터페이스를 구현함
Map 부분은 - 사전(dictionary) - 키, 밸류를 쌍으로 - 키 값은 유일, 밸류는 여러 개 가능
Map 부분 - 대표적으로 HashMap
리트리뷰
- 순회한다 - 엘리먼트들 하나하나 다 돌아본다라는 것으로 이것을 하기 위해서
ArrayList는 get 메서드로 i번째 꺼내오는 for문 사용
set이나 다른 애들은 없다..-> Iterator (이터레이터) 함수 사용
밑에서 살펴보도록 하자.
List 인터페이스를 구현한 클래스와 그 활용
순차적으로 자료를 관리하는 List 인터페이스 - 대표적인 ArrayList로 실습
예제 ) 멤버십 관리하기
- Member 클래스를 만들고, 아이디와 이름을 멤버 변수로 선언
- Member 클래스로 생성된 인스턴스들을 관리하는 클래스를 컬렉션 프레임워크 클래스들을 활용하여 구현한다.
멤버 클래스 생성
멤버 리스트 클래스 생성 - ArrayList로
리스트에 멤버 추가 / 삭제 메서드 와 출력 메서드 생성
출력 테스트 ---
리스트에 멤버가 순서대로 들어갔음을 확인 GOOD :)
삭제를 해도 순서대로 유지된다는 것을 확인 GOOD :)
ArrayList 활용하기
- 리스트의 요소를 순차적으로 관리하는 데 사용
- add 할 때 ensureCapacity 항상 체크 - 배열 다 쓰고 있나 / Capacity과 Size는 다름
Collection 요소를 순회하는 Iterator
요소의 순회란?
- 컬렉션 프레임워크에 저장된 요소들을 하나씩 차례로 참조하는 것 - 이터레이션해라 라고 씀
- 순서가 있는 List인터페이스의 경우는 Iterator를 사용하지 않고 get(i) 메서드를 활용할 수 있음
- Set 인터페이스의 경우 get(i) 메서드가 제공되지 않으므로 Iterator를 활용하여 객체를 순회함
Iterator 사용하기
이터레이터에서 주로 사용하는 메서드 2가지
- boolean hasNext() : 이후에 요소가 더 있는지를 체크하는 메서드, 요소가 있다면 true를 반환
- E next() : 다음에 있는 요소를 반환
반환 - remove 개념이 아닌 꺼내서 보는 개념
Iterator <>에서 <member> 안 쓰면 objcet // 쓰면 member 반환되는 것
이터레이터 사용하여 순회 - 삭제하기
arrayList.iterator() 불러오고 import
iterator 메서드인 hasNext()와 next() 사용하여 순회!
밑에 id 넣어주고 삭제해주고 하는 부분은 동일
get(i) 함수 사용했던 것과 비교
이터레이터 와 get(i) 함수 사용 비교
이터레이터는
arrayList.iterator() 불러오고 import
iterator 메서드인 hasNext()와 next() 사용하여 순회!
get(i) 함수는
get(i) 함수로 i 번째부터 list.size()까지 순회!
밑에 id 넣어주고 삭제해주고 하는 부분은 동일
Set 인터페이스를 구현한 클래스와 그 활용 - 1
중복되지 않게 자료를 관리하는 Set 인터페이스 - HashSet 사용해보기
HashSet 클래스
- Set 인터페이스를 구현한 클래스와
- 멤버의 중복 여부를 체크하기 위해 인스턴스의 동일성을 확인해야 함
- 동일성 구현을 위해 필요에 따라 equals()와 hashCode() 메서드를 재정의함
기본 세팅 - arraylist 사용했던 거 복붙 - hashset으로 변경
동일한 Id 번호로 멤버 추가할 때 추가되는지 확인 - 추가된다.
멤버의 중복 여부를 체크하기 위해 인스턴스의 동일성을 확인
- 동일성 구현을 위해 Member 클래스! 에 equal와 hashcode 재정의
재정의 후 - 동일한 번호로 멤버 추가할 때 추가되는지 확인 - 중복 추가 안됨
Hash Set
아이디가 동일한 경우 같은 멤버이므로 중복되지 않도록 Member 클래스의 equals()와 hashCode() 메서드를 재정의함
스트링과 인티저 같은 애들은 이미 equals와 hashCode가 재정의되어있음
Set 인터페이스를 구현한 클래스와 그 활용 - 2
정렬을 위한 Set 인터페이스 - TreeSet - Comparable과 Comparator
TreeSet 클래스 활용하기
- 객체의 정렬에 사용하는 클래스 -
- Set 인터페이스를 구현하여 중복을 허용하지 않고, 오름차순이나 내림차순으로 객체를 정렬할 수 있음
- 내부적으로 이진 검색 트리(binary search tree)로 구현됨
- 이진 검색 트리에 저장하기 위해 각 객체를 비교해야 함
- 이진 검색 트리(binary search tree) -> 중복 허용 X -> 나를 중심으로 왼쪽으로 작은 값 오른쪽을 큰 값 -> 엘리먼트가 추가될 때마다 기존에 비교할 대상 필요 ( 그전에는 추가할 때마다 동일한지 중복되는지 확인이 중점이었지만 그 조건은 기본으로 충족시킨다 하고) 비교를 중점
- 비교 대상이 되는 객체에 Comparable이나 Comparator 인터페이스를 구현해야 TreeSet에 추가될 수 있음
- String, Integer 등 JDK의 많은 클래스들이 이미 Comparable을 구현했음
기본 세팅 -
멤버 클래스는 그대로 가져다 사용하고
hashSet 사용하던 거 복붙 - TreeSet으로 변경
트리셋 기본 출력 확인 -
추가해준 순서대로가 아닌 ㄱ-ㄴ-ㄷ 오름차순으로 정렬되어 출력되었다.
String 클래스는 이미 Comprable 인터페이스가 구현되어 있으므로 오름차순으로 정렬되어 출력됨을 확인!
출력 테스트 - 트리셋에 멤버 추가해주고 출력 확인
오류남 : 멤버를 트리 셋에 추가하려고 보니, 비교하는 애를 구현해 놓지 않아서 추가해 줄 수 없다.
출력 안됨
오류 발생 : 멤버를 트리 셋에 추가하려고 보니, 비교하는 애를 구현해 놓지 않아서 추가해 줄 수 없다.
Comparable이나 Comparator로 비교 대상과 정렬 기준 구현하여야 한다.
Comparable 구현 - 비교 대상 만들어 주기 - 정렬 - compareTo 함수
Comparator 구현 - 비교하는 방식 다시 구현 - 재정렬 - compare 함수
주의할 점 - TreeSet 클래스에서 compare에서 사용한 타입과 생성자 지정 필요
Comparator의 활용
이미 Comparable이 구현된 경우 Comparator로 비교하는 방식을 다시 구현할 수 있음
String 은 이미 Comparable 이 구현되어있어서 오름차순으로 정렬되어 출력된다.
Comparator로 비교 방식 재정의
Comparator 구현 Mycompare 클래스 만들어주고 비교 정렬 compare 재정의
test 클래스에서 재정의한 방식으로 비교 정렬할 것이다 표시 new Mycompare()
원래 비교 정렬 기준으로 오름차순으로 출력되던 Kim, Lee, Park에서
다시 정의해준 기준으로 내림차순으로 출력됨을 확인 Park, Lee, Kim
GOOD :)
TreeSet
Comparable이나 Comparator로 비교대상 지정 필요
비교 대상이 되는 객체에 Comparable이나 Comparator 인터페이스를 구현해야 TreeSet에 추가될 수 있음
여기서부터는 Map --
Map 인터페이스를 구현한 클래스와 그 활용
검색을 위한 Map 인터페이스 - 대표적으로 HashMap 구현 실습
HashMap 클래스 활용하기
- Map 인터페이스를 구현한 클래스 - 가장 많이 사용되는 Map 인터페이스 기반 클래스
- key - value를 쌍(pair)으로 관리하는 메서드를 구현함
- 검색을 위한 자료구조
- key를 이용하여 값을 지정하고 key를 이용하여 값을 꺼내오는 방식 - hash 알고리즘으로 구현됨
- key가 되는 객체는 중복될 수 없고, 객체의 유일성 비교를 위한 equals()와 hashCode() 메서드를 구현해야 함
HashMap 클래스 생성
equals()와 hashCode() 메서드 구현되어있는 Member클래스는 그대로 사용
멤버를 HashMap 사용하여 관리할 클래스 - MemberHashMap 클래스 생성
출력 테스트 --
key 값으로 value 꺼내와서 출력하게 하였는데 잘 됨을 확인
hashMap 은 key - value를 쌍(pair)으로 관리하는 것을 확인
GOOD :)
+ HashMap 메서드 - jajvadoc 참고하기!
검색을 위한 Map 인터페이스 - TreeMap
TreeMap 클래스
- Map 인터페이스를 구현한 클래스이고 key에 대한 정렬을 구현할 수 있음
- key가 되는 클래스에 Comparable이나 Comparator인터페이스를 구현함으로써 key-value 쌍의 자료를 key값 기준으로 정렬하여 관리할 수 있음
treeSet 하고 hashMap 하고 더한 개념
key에 의해서 정렬이 됨 - key에 해당되는 클래스 쪽에다가 Comparable이나 Comparator 구현 필요
Integer 나 String 같은 애들은 이미 구현되어있어서 안 해줘도 괜찮지만 다른 애들은 필요
key-value 쌍의 자료를 key값 기준으로 정렬하여 관리할 수 있음
review
저번에 쭉 살펴보았던 자바에서 제공되는 자료구조 구현 클래스들을 직접 구현해보면서
어떤 원리로 구현되었으며, 사용할 때 각 클래스에 맞춰 추가해주어야 할 부분과 주의점들을 학습했다.
큰 방향을 정하고
자료를 관리하기 위한 건지 - Collection / 자료 검색을 위한 건지 - Map
자료관리 Collection 부분에서는
자료를 순서에 따라 저장하고 관리할 것인지 - List
순서와 관계없이 유일한 값을 저장하고 관리하는 데 사용할 것인지 - Set 선택
자료검색 Map 부분에서는 Key - Value를 쌍(pair)으로 관리하는데
key 값으로 검색하고 꺼내오고 하는 - HashMap ( Map 대표적 클래스)
key 값을 기준으로 검색뿐 아니라 정렬까지 해서 관리하는 - TreeMap
각 인터페이스를 구현하는 클래스들 중에
대표적으로 많이 사용하는 클래스만 뽑아서 실습해본 거라고 하는데. 어우...
코드 구성을 짜는 것은 비슷비슷해서 각 클래스별로 불러서 사용하는 방법은 쉽게 이해했는데
클래스에 맞춰 메서드를 재정의해주는 부분, 조건식의 방법 차이, 사용하는 함수의 차이 등
디테일적인 부분들은 체크해놓고 숙지하고 있어야 사용할 수 있겠구나 느꼈다.
그래야만
내가 어떤 기능을 구현하기 위해서 가져다 쓰는 건지
이 클래스는 무슨 기능을 제공하는지, 무엇을 위해서 존재하는 클래스인지 알 수 있고
필요한 상황에 맞춰 가장 효율적인 클래스를 가져다 사용할 수 있을 것이다.
자바에서 제공되는 자료구조 구현 클래스들 -
ArrayList 활용하기
리스트의 요소를 순차적으로 관리하는 데 사용
add 할 때 ensureCapacity 항상 체크 - 배열 다 쓰고 있나 / Capacity과 Size는 다름
--
이터레이터는
arrayList.iterator() 불러오고 import
iterator 메서드인 hasNext()와 next() 사용하여 순회!
--
get(i) 함수는
get(i) 함수로 i 번째부터 list.size()까지 순회!
--
Hash Set
아이디가 동일한 경우 같은 멤버이므로 중복되지 않도록 Member 클래스의 equals()와 hashCode() 메서드를 재정의함
스트링과 인티저 같은 애들은 이미 equals와 hashCode가 재정의되어있음
--
TreeSet
Comparable이나 Comparator로 비교대상 지정 필요
비교 대상이 되는 객체에 Comparable이나 Comparator 인터페이스를 구현해야 TreeSet에 추가될 수 있음
--
HashMap
key가 되는 객체는 중복될 수 없고, 객체의 유일성 비교를 위한 equals()와 hashCode() 메서드를 구현해야 함
Collection 쪽 애들과 사용하는 메서드가 달라서 사용법 체크 필요
'JAVA 웹 개발 패키지 - 패스트캠퍼스 > Chapter5' 카테고리의 다른 글
제네릭(Generic) 프로그래밍 (0) | 2022.01.13 |
---|---|
ArrayList / LinkedList / Stack / Queue --- 구현하기 (0) | 2022.01.13 |
여러가지 자료구조 (Data Structure) (0) | 2022.01.12 |