일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 알고리즘 #코딩테스트 #프로그래머스 #자바
- 드래그앤드롭
- 위상정렬
- useLayoutEffect
- 백준 #알고리즘 #자바스크립트
- useContext
- usedebugvalue
- recoil
- 알고리즘
- javascript
- 훅
- 프로그래머스
- 완전탐색
- 타입스크립트
- 프로그래머스 #알고리즘 #자바스크립트
- 리액트
- 자바스크립트
- 다이나믹프로그래밍
- 덕타이핑
- 백준
- 리코일
- Suspense
- react-beautiful-dnd
- 스티커
- useRef
- 알고리즘 #프로그래머스 #코딩테스트 #자바스크립트
- React
- Today
- Total
몽환화
230127 컬렉션 본문
컬렉션
Collection Framework
자료 구조 관련된 인터페이스, 클래스
자료를 저장하기 위한 구조?! 데이터!
객체들을 한 곳에 모아놓고 편리하게 사용할 수 있는 환경을 제공
객체 : 데이터와 알고리즘이 캡슐화되어 있는 것
정적 자료구조 (Static data structure)
고정된 크기의 자료구조
왜 우리 배열 크기가 고정돼있었잖아
동적 자료구조 (Dynamic data structure)
얘는 그럴 필요가 없는거지
요소의 개수에 따라 자료구조의 크기가 동적으로 증가하거나 감소
ex) 리스트, 스택, 큐 etc
자료 구조의 종류 : 어떤 구조에서 얼마나 빨리 원하는 데이터를 찾고, 추가하고, 삭제하고, 수정할 수 있는가
- 순서를 유지할 것인가?
- 중복을 허용할 것인가?
- 다른 자료구조들에 비해서 어떤 단점과 장점을 가지고 있는가?
Collection : 인터페이스
List, Set, Queue는 Collection을 상속받는 인터페이스들
그 밑에는 클래스들! 저 인터페이스를 구현하는 애들(implements)
LinkedList 는 List도 구현하고 Queue도 구현해
Queue의 단짝인 Stack 클래스
Map도 인터페이스인데 Collection을 상속받지는 않구
java.util 패키지
- 다수의 데이터를 쉽게 처리하는 방법 제공
List : 순서가 있는 데이터의 집합. 배열같은데 크기가 변해! ArrayList '... etc\
Set
Map : key랑 value쌍인데 key는 중복 안되구 value는 중복 돼
Queue : 들어온 순서대로 나가는 자료구조
List
순서가 있고(index)가 있고., 중복을 허용한다. 같은 값이 여러번 들어갈 수 있당
구현 클래스 : ArrayList, LInkedList, Vector
내부적으로 배열을 갖고 있는게 저 어레이랑 벡터
링크드는 배열같은 방식은 아니고 뭐 아무튼
벡터 : 레거시클래스 옛날꺼래
vector vs ArrayList
배열 100퍼증가 50퍼 증가
싱글스레드 멀티스레드
걍 어레이가 더 우수하대
List 인터페이스
내부적으로 배열을 이용해서 데이터를 관리함
크기가 유동적으로 변하는 동적 자료구조. 배열을 다루는 것과 유사하게 사용할 수 있음





// 리스트 출력
// 리스트 중 빈 곳 출력
// 리스크 크기는?
// 리스트의 원소를 대체하기
for(String name : names) {
System.out.println(name);
}
System.out.println();
Iterator<String> e = names.iterator();
while(e.hasNext()) {
System.out.println(e.next());
}
/*
이순신
안중근
세종대왕
이순신 */
저 위에 for each 문이랑 Iterator 둘 다 똑같이 나와

// 리스트에서 특정 원소 지우기
봐바 원소 지우면 배열 크기 자체가 줄어든당
리스트에서 원소들을 검색해서 지운 다음 리스트를 출력하고 싶을 때?
for(int i = 0; i < names.size(); i++) {
if(names.get(i).equals("홍승길")) {
names.remove(i);
}
}
System.out.println(names);
이렇게하면안돼ㅐㅐㅐㅐㅐ
for(int i=names.size()-1; i >=0; i--) {
if(names.get(i).equals("홍승길")) {
names.remove(i);
}
}
System.out.println(names);
왜냐면 얘는 동적 배열이라서 저 names.size가 계속 바뀌거든
거꾸로 세어 오는 방식으루 해야돼
ArrayList : 배열을 그대로 사용하기 때문에 배열의 장단점을 그대로 가짐
LinkedList :
Node들로 이루어짐!!!
Node : 값과 참조값
각각의 원소는 그 다음 원소의 주소값을 알고있어
주소값이랑 세트!
데이터 삭제랑 추가도 비슷한 방식으로 됨요
Set
집 합
순서가 없음 중복도 안됨
장점 : 빠른 속도, 효율적인 중복 데이터 제거 수단
구현 클래스 : HashSet, TreeSet
HashSet : 우리 해시코드 했었잔아
TreeSet : (red-black) tree
Set
- 집합을 나타내는 자료구조
- 중복을 허용하지 않음
- 순서도 없음
Set 도 인터페이스니까 이거 자체로 만들지는 못하고 클래스를 통해서 구현함

중복을 허용하지 않기 때문에
같은 이름이 두개 들어가면 하나로 인식함!

아무튼 저런 방식으로 코드값을 인식하고 문자열 자체도 equals가 true로 나오면 같은걸로 인식
Iterator<String> e = set.iterator();
while(e.hasNext()) {
//만약에 그 다음 원소가 있다면 출력해라
System.out.println(e.next());
}
/*
홍승길
이승재
정민우
*/
Set<String> set = new HashSet<>();
=> 입력 순서대로
Set<String> set = new TreeSet<>();
=>
HashSet
- 해시 테이블에 원소를 저장하고
- 성능면에서 우수하다고 알려져있음
- 다만 원소들의 순서가 일정하지는 않음
TreeSet
- red-black tree에 원소 저장
- 값에 따라 순서 결정(가나다)
- 값을 순서에 따라 정렬할 필요가 있다면 고려

자 봐바 Set은 중복을 인정 안한다구했어
근데 지금 보면 이렇게 돼있잖아 둘 다 뜨잖아
왜그러게
HashSet은 hashCode랑 equals 둘 다 같아야돼 근데 저거 보면 다를걸

봐방
p1이랑 p2의 hashCode를 조회하고 equals를 봤을때
해시코드도 다르고 equals도 false잖어
그럼 어떻게해야대
오버라이드해야지 Person 클래스 가야지


여기서 필요한거 선택해서 제너레이트 하면 딱 어
근데 손을 조금 볼꺼야
id만 같아도 같다고 하게 하고 싶어

웅냐

구러면 이제 Set에도 한명만 뜨고 해시코드도 같고 구냥 다 같다고 나오는거징
Map
Key와 Value를 하나의 Entry로 묶어서 데이터 관리
키는 중복 안되구 밸류는 중복 ㄱㅊ
구현 클래스 : HashMap, TreeMap
Iterable 순차적으로 굴릴 수 있눈거
// Map
// - 사전과 같은 자료구조
// - 키와 값의 쌍으로 저장
// - 키로 구별
// - 키는 중복되면 안되고 값은 중복될 수 있음
Map<K. V> 라서 각각 지정해주면 됨
Map<String, String> map = new HashMap<>();
// map은 put으로 저장
map.put("Hong", "010-0000-0000");
map.put("Yang", "010-1111-1111");
map.put("Lee", "010-2222-2222");
// 중복된 키로 값을 넣을 경우 새로운 값으로 대체가 됨
map.put("Lee", "010-3333-3333");
/* {Hong=010-0000-0000, Yang=010-1111-1111, Lee=010-3333-3333} */
여기서 HashMap이랑 TreeMap이랑 차이 알구가

얘도 그거지 가나다 같은거지 근데 영어니까 ABC인거겠지

.get() : 검색하깅, 없는 값이라면 null
.containsKey(), .containsValue() : 포함하고 있는지 여부 확인하기 TorF
// 반복문 돌리기 쪼꼼 복잡함
for(Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}
Entry<K, V> 각각의 항목을 의미함. 엔트리에서 가져오게 하는고지
Iterator<String> e = map.keySet().iterator();
while(e.hasNext()) {
String key = e.next();
System.out.printf("키 : %s, 값: %s \n", key, map.get(key));
}
for(String key : map.keySet()) {
System.out.printf("키 : %s, 값: %s \n", key, map.get(key));
}
/*
키 : Hong, 값: 010-0000-0000
키 : Yang, 값: 010-1111-1111
키 : Lee, 값: 010-3333-3333
키 : Hong, 값: 010-0000-0000
키 : Yang, 값: 010-1111-1111
키 : Lee, 값: 010-3333-3333
*/
.size() 얘는 뭐 그냥 크기
Queue
인터페이스.
fist in first out - 가장 먼저 들어온 값이 가장 먼저 빠져나감
구현 클래스 : LinkedList
// 큐
// - FIFO
// - 큐 인터페이스
// - 구현체(클래스)는 LinkedList 씀

얘는 넣을 때 .offer() 써
while(!queue.isEmpty()) {
System.out.print(queue.poll()+" ");
}
0 1 2 3 4 5 6 7 8 9
=> 이제 저 위의 queue에는 아무것도 남아있지 않아
.peek() : 얘는 맨 처음 값만 무조건 보여주는거고
.poll() : 애는 FIFO 순서대로 아예 빼버리는거야
Stack
얘는 클래스야 인터페이스 아니얌
Last in first out
가장 나중에 들어온 값이 가장 먼저 나감
// Stack
// - LIFO
// 그냥 스택 클래스 써

얘는 넣을 때 .push() 써
while(!stack.isEmpty()) { // 비어있지 않다면
System.out.print(stack.pop()+" ");
}
9 8 7 6 5 4 3 2 1 0
=> 얘두 마찬가지로 저 stack에 더 이상 남아있지 않아
.peek() 맨 위의 데이터 보는거
.pop() 맨 위의 데이터부터 뽑아내는거 그니까 마지막으로 들어간 데이터부터 뽑아내는거
정렬
여러가지 값이 들어있으니까 순서대로 정렬할 필요가 있징
요소를 특정 기준에 대한 내림차순 또는 오름차순으로 배치하는 것
순서를 가지는 Collection들만 정렬 가능
List같은애들
Set 중에 순서 갖는 애 있긴 해
Map 도 순서 갖는 애 있긴 해
Collections의 sort()라는 메소드를 이용해서 정렬함
정렬을 해보쟈!!

Collectrions.sort(); 하면 가나다순으로 배열돼
Comparable을 갖고 있으면 그렇다는데 그럼 그게 무야
Comparable 도 인터페이스야! 이 인터페이스를 구현하고 있으면 collection.sort()를 사용할 수 있어

두개를 비교하는데 비교 결과 인트값이 양수면 자리를 바꾸고 음수면 유지하고 뭔소린지 모르겠따

자 한 패키지에 Person2라는 클래스를 만들었고
Person2라는 변수로 arrayList를 만든 다음에
Collections.sort()를 쓰려고 헀는데 안돼
왜?
저 위에서 말한 comparable 인터페이스를 Person2가 구현하고 있어야 한대

자 Person2 클래스로 가서 구현을 해주자
implements를 해주고 Comparable을 하는데 얘가 제네릭이라서 <Person2> 해주셈
그리고 구현했으면 오버라이드도 해야징!

그럼 이렇게 오버라이드 생기는데

구렇대 왜이런건지는 나도 모르겠어...

뭔가 이해가 되는 것 같기도?
CompareTo 메소드
return값이 있는데
양수면 자리를 바꿈
음수면 그대로
0이면 그대로
Comparator
객체가 Comparable을 구현하고 있지 않아도 사용가능하게 하는 방법?
Comparator라는 인터페이스를 구현하는 클래스인데 이걸 집어넣어주면 정렬이 된대
자 아까처럼 Test 클래스와 NewPerson 클래스를 만들어보쟝

자 그럼 역시 sort에 에러가 떠 !
아까랑 다른 방식으로 comparator를 이용할구야

Comparatro 오타니까 봐줘
아무튼 이렇게 클래스 새로 만들고 Comparator라는 인터페이스를 구현할건데 대신 제네릭이 있어서 우리가 이용할 클래스 이름을 넣어
오버라이드도 해줘

나이순으로 배열하려구 하는데
애초에 우리가 NewPerson에서 다 private으로 처리했잖아?
저거 받아오려면 우쨰야겠어
NewPerson가서 getter setter 접근자 설정자 하는데 지금은 getter만 있어두 대

그렇게 저거 해결하고 Test 클래스 돌아오면 짠
실행된다눙~~~~
'JAVA 때려잡기' 카테고리의 다른 글
230126 인터페이스, 제네릭 (0) | 2023.01.27 |
---|---|
230125 추상클래스 (0) | 2023.01.25 |
#가위바위보 게임(5판3선승, 3판2선승, 단판승) (0) | 2023.01.24 |
230119 객체배열관리 (0) | 2023.01.21 |