[JAVA] 17. μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›Œν¬ (Stack&Queue ν™œμš©, Iterator, ListIterator, Enumeration, Arrays)

2022. 5. 10. 21:52ㆍJAVA/μžλ°”μ˜ 정석

728x90

https://hyejin.tistory.com/580

 

[JAVA] 17. μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›Œν¬(List, Set, Map) , ArrayList, LinkedList, Stack&Queue

μ»¬λ ‰μ…˜ : μ—¬λŸ¬ 객체(데이터)λ₯Ό λͺ¨μ•„놓은 것을 μ˜λ―Έν•œλ‹€. ν”„λ ˆμž„μ›Œν¬ : ν‘œμ€€ν™”, μ •ν˜•ν™”λœ 체계적인 ν”„λ‘œκ·Έλž˜λ° 방식 μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›Œν¬ : λ‹€μˆ˜μ˜ 객체(μ»¬λ ‰μ…˜)을 닀루기 μœ„ν•œ ν‘œμ€€ν™”λœ ν”„λ‘œκ·Έλž˜λ°

hyejin.tistory.com

 

 

1️⃣ Stackκ³Ό Queue ν™œμš©

μŠ€νƒμ˜ ν™œμš© 예 : μˆ˜μ‹κ³„μ‚°, μˆ˜μ‹κ΄„ν˜Έκ²€μ‚¬, μ›Œλ“œν”„λ‘œμ„Έμ„œμ˜ undo/redo, μ›ΉλΈŒλΌμš°μ €μ˜ λ’€λ‘œ/μ•žμœΌλ‘œ 
큐의 ν™œμš© 예 : 졜근 μ‚¬μš© λ¬Έμ„œ, μΈμ‡„μž‘μ—… λŒ€κΈ° λͺ©λ‘, 버퍼(buffer) 

 

- Stack ν™œμš© 예

-> μž…λ ₯ν•œ μˆ˜μ‹μ˜ κ΄„ν˜Έκ°€ μ˜¬λ°”λ₯Έμ§€ μ²΄ν¬ν•˜λŠ” 예제둜 '('λ₯Ό λ§Œλ‚˜λ©΄ μŠ€νƒμ— λ„£κ³  ')'λ₯Ό λ§Œλ‚˜λ©΄ μŠ€νƒμ—μ„œ '('λ₯Ό κΊΌλ‚Έλ‹€. 

')'λ₯Ό λ§Œλ‚˜μ„œ '('λ₯Ό κΊΌλ‚΄λ €κ³  ν•  λ•Œ μŠ€νƒμ΄ λΉ„μ–΄μžˆκ±°λ‚˜ μˆ˜μ‹μ„ κ²€μ‚¬ν•˜κ³  λ‚œ 후에도 μŠ€νƒμ΄ λΉ„μ–΄μžˆμ§€ μ•ŠμœΌλ©΄ κ΄„ν˜Έκ°€ 잘λͺ»λ˜μ—ˆλ‹€λŠ” λœ»μ΄λ‹€. 

 

 

- Queue ν™œμš© 예

-> history λͺ…λ Ήμ–΄λ₯Ό queueλ₯Ό μ΄μš©ν•΄μ„œ κ΅¬ν˜„ν•œ μ˜ˆμ œμ΄λ‹€. 

 

 

- PriorityQueue

Queue μΈν„°νŽ˜μ΄μŠ€μ˜ κ΅¬ν˜„μ²΄ μ€‘μ˜ ν•˜λ‚˜λ‘œ, μ €μž₯ν•œ μˆœμ„œμ— 관계없이 μš°μ„ μˆœμœ„ 높은 것뢀터 κΊΌλ‚΄κ²Œ λœλ‹€λŠ” νŠΉμ§•μ΄ μžˆλ‹€. 

그리고 null은 μ €μž₯ν•  수 μ—†λ‹€. null을 μ €μž₯ν•˜λ©΄ NPE λ°œμƒν•œλ‹€. 

 

PriorityQueueλŠ” μ €μž₯κ³΅κ°„μœΌλ‘œ 배열을 μ‚¬μš©ν•˜λ©°, 각 μš”μ†Œλ₯Ό 'νž™(heap)'μ΄λΌλŠ” 자료ꡬ쑰의 ν˜•νƒœλ‘œ μ €μž₯ν•œλ‹€. 

νž™μ€ 이진 트리의 ν•œ μ’…λ₯˜λ‘œ κ°€μž₯ 큰 κ°’μ΄λ‚˜ κ°€μž₯ μž‘μ€ 값을 λΉ λ₯΄κ²Œ 찾을 수 μžˆλ‹€λŠ” νŠΉμ§•μ΄ μžˆλ‹€. 

 

-> μ €μž₯μˆœμ„œκ°€ 3,5,1,2,4 μž„μ—λ„ λΆˆκ΅¬ν•˜κ³  좜λ ₯κ²°κ³ΌλŠ” 1,2,3,4,5이닀. μš°μ„ μˆœμœ„λŠ” μˆ«μžκ°€ μž‘μ„ 수둝 λ†’μ€κ²ƒμ΄λ―€λ‘œ 1이 κ°€μž₯ λ¨Όμ € 좜λ ₯된 것이닀.  λ¬Όλ‘  숫자 λΏλ§Œμ•„λ‹ˆλΌ 객체λ₯Ό μ €μž₯ν•  수 μžˆλŠ”λ° 그럴 κ²½μš°μ—λŠ” 각 객체의 크기λ₯Ό 비ꡐ할 수 μžˆλŠ” 방법을 μ œκ³΅ν•΄μ•Ό ν•œλ‹€. 

 

μ°Έμ‘°λ³€μˆ˜ pqλ₯Ό 좜λ ₯ν•˜λ©΄ PriorityQueueκ°€ λ‚΄λΆ€μ μœΌλ‘œ 가지고 μžˆλŠ” λ°°μ—΄μ˜ λ‚΄μš©μ΄ 좜λ ₯λ˜λŠ”λ°, μ €μž₯ν•œ μˆœμ„œμ™€ λ‹€λ₯΄κ²Œ μ €μž₯λ˜μ—ˆλ‹€. 

κ·Έ μ΄μœ λŠ” νž™μ΄λΌλŠ” 자료ꡬ쑰의 ν˜•νƒœλ‘œ μ €μž₯된 것이기 λ•Œλ¬Έμ΄λ‹€! 

 

- Deque(Double-Ended Queue)

Queue의 λ³€ν˜•μœΌλ‘œ ν•œ μͺ½ 끝으둜만 μΆ”κ°€/μ‚­μ œν•  수 μžˆλŠ” Queue와 달리, DequeλŠ” μ–‘μͺ½ 끝에 μΆ”κ°€/μ‚­μ œκ°€ κ°€λŠ₯ν•˜λ‹€. 

 

 

 

2️⃣ Iterator, ListIterator, Enumeration 

Iterator, ListIterator, Enumeration 은 λͺ¨λ‘ μ»¬λ ‰μ…˜μ— μ €μž₯된 μš”μ†Œλ₯Ό μ ‘κ·Όν•˜λŠ”λ° μ‚¬μš©λ˜λŠ” μΈν„°νŽ˜μ΄μŠ€μ΄λ‹€. 

Enumeration은 Iteratior의 ꡬ 버전이며, ListIteratorλŠ” Iterator의 κΈ°λŠ₯을 ν–₯상 μ‹œν‚¨ 것이닀. 

 

- Iterator

: μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›Œν¬μ—μ„œλŠ” μ»¬λ ‰μ…˜μ— μ €μž₯된 μš”μ†Œλ“€μ„ μ½μ–΄μ˜€λŠ” 방법을 ν‘œμ€€ν™”ν•˜μ˜€λ‹€.

μ»¬λ ‰μ…˜μ— μ €μž₯된 각 μš”μ†Œμ— μ ‘κ·Όν•˜λŠ” κΈ°λŠ₯을 가진 Iterator μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•˜κ³ , CollectionμΈν„°νŽ˜μ΄μŠ€μ—λŠ” Iterator()λ₯Ό μ •μ˜ν•˜κ³  μžˆλ‹€. 

iterator()λŠ” CollectionμΈν„°νŽ˜μ΄μŠ€μ— μ •μ˜λœ λ©”μ„œλ“œμ΄λ―€λ‘œ Collection μΈν„°νŽ˜μ΄μŠ€μ˜ μžμ†μΈ List, Set 에도 ν¬ν•¨λ˜μ–΄ μžˆλ‹€.

주둜 while 문을 μ‚¬μš©ν•΄μ„œ μ»¬λ ‰μ…˜ 클래슀의 μš”μ†Œλ“€μ„ μ½μ–΄μ˜¬ 수 μžˆλ‹€.

 

Collection c = new ArrayList();

Iterator it = c.iterator();

 

while(it.hasNext()) { 

   System.out.println(it.next());

 

-> ArrayList λŒ€μ‹  Collection μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ λ‹€λ₯Έ μ»¬λ ‰μ…˜ ν΄λž˜μŠ€μ— λŒ€ν•΄μ„œλ„ 이와 같이 λ™μΌν•œ μ½”λ“œλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€. 

μ €κΈ°μ„œ ArrayList λŒ€μ‹  Collection μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ λ‹€λ₯Έ μ»¬λ ‰μ…˜ 클래슀의 객체λ₯Ό μƒμ„±ν•˜λ„λ‘ λ³€κ²½ν•˜κΈ°λ§Œ ν•˜λ©΄ λœλ‹€. 

 

iteratorλ₯Ό μ΄μš©ν•΄μ„œ μ»¬λ ‰μ…˜μ˜ μš”μ†Œλ₯Ό μ½μ–΄μ˜€λŠ” 방법을 ν‘œμ€€ν™”ν–ˆκΈ° λ•Œλ¬Έμ— 이처럼 μ½”λ“œμ˜ μž¬μ‚¬μš©μ„ λ†’μ΄λŠ” 것이 κ°€λŠ₯ν•˜λ‹€.

 

Map μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ μ»¬λ ‰μ…˜ ν΄λž˜μŠ€λŠ” ν‚€(key) 와 κ°’(value)을 쌍으둜 μ €μž₯ν•˜κ³  있기 λ•Œλ¬Έμ— iterator()λ₯Ό 직접 ν˜ΈμΆœν•  수 μ—†κ³ , κ·Έ λŒ€μ‹  keySet() μ΄λ‚˜ entrySet() κ³Ό 같은 λ©”μ„œλ“œλ₯Ό ν†΅ν•΄μ„œ 킀와 값을 각각 λ”°λ‘œ Set 의 ν˜•νƒœλ‘œ μ–»μ–΄μ˜¨ 후에 λ‹€μ‹œ iterator()λ₯Ό ν˜ΈμΆœν•΄μ•Ό Iteratorλ₯Ό 얻을 수 μžˆλ‹€. 

 

 

 

- ListIterator 와 Enumeration 

Enumeration은 μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›Œν¬κ°€ λ§Œλ“€μ–΄μ§€κΈ° 전에 μ‚¬μš©ν–ˆλ˜ κ²ƒμœΌλ‘œ Iterator의 κ΅¬λ²„μ „μœΌλ‘œ μƒκ°ν•˜λ©΄ λœλ‹€.

이전 λ²„μ „μ„μ˜€ μž‘μ„±λœ μ†ŒμŠ€μ™€μ˜ ν˜Έν™˜μ„ μœ„ν•΄μ„œ 남겨두고 μžˆλŠ” 것뿐이기 λ•Œλ¬Έμ— κ°€λŠ₯ν•˜λ©΄ Iteratorλ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€.

 

ListIteratorλŠ” Iteratorλ₯Ό μƒμ†λ°›μ•„μ„œ κΈ°λŠ₯을 μΆ”κ°€ν•œ κ²ƒμœΌλ‘œ, μ»¬λ ‰μ…˜μ˜ μš”μ†Œμ— μ ‘κ·Όν•  λ•Œ IteratorλŠ” 단방ν–₯으둜만 이동할 수 μžˆλŠ”λ° ListIteratorλŠ” μ–‘λ°©ν–₯으둜 이동이 κ°€λŠ₯ν•˜λ‹€.

λ‹€λ§Œ ArrayListλ‚˜ LinkedList 와 같이 List μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ μ»¬λ ‰μ…˜μ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆλ‹€. 

 

-> IteratorλŠ” 단방ν–₯으둜만 μ΄λ™ν•˜κΈ° λ•Œλ¬Έμ— μ»¬λ ‰μ…˜μ˜ λ§ˆμ§€λ§‰ μš”μ†Œμ— λ‹€λ‹€λ₯΄λ©΄ 더 이상 μ‚¬μš©ν•  수 μ—†μ§€λ§Œ, ListIteratorλŠ” μ–‘λ°©ν–₯으둜 μ΄λ™ν•˜κΈ° λ•Œλ¬Έμ— 각 μš”μ†Œκ°„μ˜ 이동이 μžμœ λ‘­λ‹€. 

λ‹€λ§Œ μ΄λ™ν•˜κΈ° 전에 λ°˜λ“œμ‹œ hasNext()λ‚˜ hasPrevious()λ₯Ό ν˜ΈμΆœν•΄μ„œ 이동할 수 μžˆλŠ”μ§€ 확인해야 ν•œλ‹€. 

 

-> Iterator의 remove()λŠ” λ‹¨λ…μœΌλ‘œ 쓰일 수 μ—†κ³ , next()와 같이 μ¨μ•Όν•œλ‹€. 

νŠΉμ •μœ„μΉ˜μ˜ μš”μ†Œλ₯Ό μ‚­μ œν•˜λŠ” 것이 μ•„λ‹ˆλΌ 읽어 온 것을 μ‚­μ œν•œλ‹€. next() ν˜ΈμΆœμ—†μ΄ remove()λ₯Ό ν˜ΈμΆœν•˜λ©΄ IllegalStateException이 λ°œμƒν•œλ‹€. 

 

 

 

3️⃣ Arrays

Arrays ν΄λž˜μŠ€μ—λŠ” 배열을 λ‹€λ£¨λŠ”λ° μœ μš©ν•œ λ©”μ„œλ“œ(static)κ°€ μ •μ˜λ˜μ–΄ μžˆλ‹€. 

 

- λ°°μ—΄μ˜ 볡사 copyOf(), copyOfRange()

copyOf()λŠ” λ°°μ—΄ 전체λ₯Ό, copyOfRange()λŠ” λ°°μ—΄μ˜ 일뢀λ₯Ό λ³΅μ‚¬ν•΄μ„œ μƒˆλ‘œμš΄ 배열을 λ§Œλ“€μ–΄μ„œ λ°˜ν™˜ν•œλ‹€. 

 

- λ°°μ—΄ μ±„μš°κΈ° fill(), setAll()

fill()은 λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό μ§€μ •λœ κ°’μœΌλ‘œ μ±„μš΄λ‹€. 

setAll()은 배열을 μ±„μš°λŠ”λ° μ‚¬μš©ν•  ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ λ°›λŠ”λ‹€. 

 

- λ°°μ—΄μ˜ μ •λ ¬κ³Ό 검색 sort(), binarySearch()

sort()λŠ” 배열을 μ •λ ¬ν•  λ•Œ, 그리고 배열에 μ €μž₯된 μš”μ†Œλ₯Ό 검색할 λ•ŒλŠ” binarySearch()λ₯Ό μ‚¬μš©ν•œλ‹€.

binarySearch()λŠ” λ°°μ—΄μ—μ„œ μ§€μ •λœ 값이 μ €μž₯된 μœ„μΉ˜λ₯Ό μ°Ύμ•„μ„œ λ°˜ν™˜ν•˜λŠ”λ° λ°˜λ“œμ‹œ 배열이 μ •λ ¬λœ μƒνƒœμ΄μ–΄μ•Ό μ˜¬λ°”λ₯Έ κ²°κ³Όλ₯Ό μ–»λŠ”λ‹€. 

λ°°μ—΄μ˜ 첫번째 μš”μ†ŒλΆ€ν„° μˆœμ„œλŒ€λ‘œ ν•˜λ‚˜μ”© κ²€μƒ‰ν•˜λŠ” 것을 '순차 검색(linear search)' 라고 ν•˜λŠ”λ°, 이 검색 방법은 배열이 μ •λ ¬λ˜μ–΄ μžˆμ„ ν•„μš”λŠ” μ—†μ§€λ§Œ λ°°μ—΄μ˜ μš”μ†Œλ₯Ό ν•˜λ‚˜ν•˜λ‚˜ λΉ„κ΅ν•˜κΈ° λ•Œλ¬Έμ— μ‹œκ°„μ΄ 많이 κ±Έλ¦°λ‹€. 

 

이진탐색(binarysearch)λŠ” λ°°μ—΄μ˜ 검색할 λ²”μœ„λ₯Ό 반볡적으둜 μ ˆλ°˜μ”© μ€„μ—¬κ°€λ©΄μ„œ κ²€μƒ‰ν•˜κΈ° λ•Œλ¬Έμ— 검색 속도가 μƒλ‹Ήνžˆ λΉ λ₯΄λ‹€. 

λ°°μ—΄μ˜ 길이가 10λ°° λŠ˜μ–΄λ‚˜λ„ 검색 νšŸμˆ˜λŠ” 3~4νšŒλ°–μ— λŠ˜μ–΄λ‚˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 큰 λ°°μ—΄μ˜ 검색에 μœ λ¦¬ν•˜λ‹€.

단, 배열이 μ •λ ¬λ˜μ–΄ μžˆλŠ” κ²½μš°μ—λ§Œ μ‚¬μš©ν•  수 μžˆλ‹€λŠ” 단점이 μžˆλ‹€. 

 

 

- λ°°μ—΄μ˜ 비ꡐ와 좜λ ₯ equals(), toString()

toString()λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό λ¬Έμžμ—΄λ‘œ νŽΈν•˜κ²Œ 좜λ ₯ν•  수 μžˆλ‹€. 

toString()은 일차원 λ°°μ—΄μ—λ§Œ μ‚¬μš©ν•  수 μžˆμœΌλ―€λ‘œ, 닀차원 λ°°μ—΄μ—λŠ” deepToString()을 μ‚¬μš©ν•΄μ•Όν•œλ‹€. 

 

equals()λŠ” 두 배열에 μ €μž₯된 λͺ¨λ“  μš”μ†Œλ₯Ό λΉ„κ΅ν•΄μ„œ κ°™μœΌλ©΄ true, λ‹€λ₯΄λ©΄ falseλ₯Ό λ°˜ν™˜ν•œλ‹€. 

equals()도 일차원 λ°°μ—΄μ—λ§Œ μ‚¬μš©κ°€μš©ν•˜λ―€λ‘œ 닀차원 λ°°μ—΄μ˜ λΉ„κ΅μ—λŠ” deepToEquals()λ₯Ό μ‚¬μš©ν•΄μ•Όν•œλ‹€.

 

- 배열을 List둜 λ³€ν™˜ asList(Object ..a)

asList()λŠ” 배열을 List에 λ‹΄μ•„μ„œ λ°˜ν™˜ν•œλ‹€. λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ΄ κ°€λ³€μΈμˆ˜λΌμ„œ λ°°μ—΄ 생성없이 μ €μž₯ν•  μš”μ†Œλ“€λ§Œ λ‚˜μ—΄ν•˜λŠ” 것도 κ°€λŠ₯ν•˜λ‹€. 

-> asList()λŠ” λ°˜ν™˜ν•œ List 크기λ₯Ό λ³€κ²½ν•  수 μ—†λ‹€λŠ” 것이닀. 즉 μΆ”κ°€ λ˜λŠ” μ‚­μ œκ°€ λΆˆκ°€λŠ₯ν•˜λ‹€. 

 

- paralleXXX, splitIterator(), stream()

parallel둜 μ‹œμž‘ν•˜λŠ” λ©”μ„œλ“œλ“€μ΄ μžˆλŠ”λ° 이 λ©”μ„œλ“œλ“€μ€ 보닀 λΉ λ₯Έ κ²°κ³Όλ₯Ό μ–»κΈ° μœ„ν•΄μ„œ μ—¬λŸ¬ μ“°λ ˆλ“œκ°€ ν•˜λ‚˜μ˜ μž‘μ—…μ„ λ‚˜λˆ„μ–΄ μ²˜λ¦¬ν•˜λ„λ‘ ν•œλ‹€. 

splitIterator()λŠ” μ—¬λŸ¬ μ“°λ ˆλ“œκ°€ μ²˜λ¦¬ν•  수 있게 ν•˜λ‚˜μ˜ μž‘μ—…μ„ μ—¬λŸ¬ μž‘μ—…μœΌλ‘œ λ‚˜λˆ„λŠ” SplitIteratorλ₯Ό λ°˜ν™˜ν•˜κ³ , 

Stream()은 μ»¬λ ‰μ…˜μ„ 슀트림으둜 λ³€ν™˜ν•œλ‹€. 

 

 

 

 

 

 

 

 

728x90