์๋ฐ์ ์ ์ 11์ฅ: ์ปฌ๋ ์ ํ๋ ์์(collections framework)
[ ์ถ์ฒ ]
์๋ฐ์ ์ ์:
https://product.kyobobook.co.kr/detail/S000001550352
์๋ฐ์ ์ ์ ์ ํ๋ธ:
https://www.youtube.com/playlist?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp
11-1 ์ปฌ๋ ์ ํ๋ ์์ํฌ(collections framework)
์ปฌ๋ ์ (collection)
์ฌ๋ฌ ๊ฐ์ฒด(๋ฐ์ดํฐ)๋ฅผ ๋ชจ์ ๋์ ๊ฒ์ ์๋ฏธ
ํ๋ ์์ํฌ(framework)
ํ์คํ, ์ ํํ๋ ์ฒด๊ณ์ ์ธ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์
์ปฌ๋ ์ ํ๋ ์์ํฌ(collections framework)
- ์ปฌ๋ ์ (๋ค์์ ๊ฐ์ฒด)์ ๋ค๋ฃจ๊ธฐ ์ํ ํ์คํ๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์
- ์ปฌ๋ ์
์ ์ฝ๊ณ ํธ๋ฆฌํ๊ฒ ๋ค๋ฃฐ ์ ์๋ ๋ค์ํ ํด๋์ค๋ฅผ ์ ๊ณต
โ ๊ฐ์ฒด(๋ค์์ ๋ฐ์ดํฐ)๋ฅผ ๋ค๋ฃฌ๋ค? : ์ ์ฅ, ์ญ์ , ๊ฒ์, ์ ๋ ฌ
- java.util ํจํค์ง์ ํฌํจ. JDK1.2๋ถํฐ ์ ๊ณต
์ปฌ๋ ์ ํด๋์ค(collection class)
๋ค์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋ ํด๋์ค(์, Vector, ArrayList, HashSet)
11-2 ์ปฌ๋ ์ ํ๋ ์์ํฌ์ ํต์ฌ ์ธํฐํ์ด์ค
์ธํฐํ์ด์ค | ํน์ง |
---|---|
List | ์์๊ฐ ์๋ ๋ฐ์ดํฐ์ ์งํฉ, ๋ฐ์ดํฐ์ ์ค๋ณต์ ํ์ฉํ๋ค. ์) ๋๊ธฐ์ ๋ช ๋จ ๊ตฌํํด๋์ค : ArrayList, LinkedList, Stack, Vector |
Set | ์์๋ฅผ ์ ์งํ์ง ์๋ ๋ฐ์ดํฐ์ ์งํฉ, ๋ฐ์ดํฐ์ ์ค๋ณต์ ํ์ฉํ์ง ์๋๋ค. ์) ์์ ์ ์์งํฉ, ์์์ ์งํฉ ๊ตฌํํด๋์ค : HashSet, TreeSet |
Map | ํค(key)์ ๊ฐ(value)์ ์(pair)์ผ๋ก ์ด๋ฃจ์ด์ง ๋ฐ์ดํฐ์ ์งํฉ ์์๋ ์ ์ง๋์ง ์์ผ๋ฉฐ, ํค๋ ์ค๋ณต์ ํ์ฉํ์ง ์๊ณ , ๊ฐ์ ์ค๋ณต์ ํ์ฉํ๋ค. ์) ์ฐํธ๋ฒํธ, ์ง์ญ๋ฒํธ(์ ํ๋ฒํธ), id์ pw ๊ตฌํํด๋์ค : HashMap, TreeMap, Hashtable, Properties |
List : ์์ O, ์ค๋ณต O
Set : ์์ X, ์ค๋ณต X
Map : ์์ X, ์ค๋ณต : ํค๋ X, ๊ฐ์ O
11-3 Collection ์ธํฐํ์ด์ค์ ๋ฉ์๋
๋ฉ์๋ | ์ค๋ช |
---|---|
boolean add(Object o) boolean add(Collection c) | ์ง์ ๋ ๊ฐ์ฒด(o) ๋๋ Collection(c)์ ๊ฐ์ฒด๋ค์ Collection์ ์ถ๊ฐํ๋ค. |
void clear() | Collection์ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์ญ์ ํ๋ค. |
boolean contains(Object o) boolean containsAll(Collection o) | ์ง์ ๋ ๊ฐ์ฒด(o) ๋๋ Collection์ ๊ฐ์ฒด๋ค์ด Collection์ ํฌํจ๋์ด ์๋์ง ํ์ธํ๋ค. |
boolean equals(Object o) | ๋์ผํ Collection์ธ์ง ๋น๊ตํ๋ค. |
int hashCode() | Collection์ hash code๋ฅผ ๋ฐํํ๋ค. |
boolean isEmpty() | Collection์ด ๋น์ด์๋์ง ํ์ธํ๋ค. |
Iterator iterator() | Collection์ Iterator๋ฅผ ์ป์ด์ ๋ฐํํ๋ค. |
boolean remove(Object o) | ์ง์ ๋ ๊ฐ์ฒด๋ฅผ ์ญ์ ํ๋ค. |
boolean removeAll(Collection c) | ์ง์ ๋ Collection์ ํฌํจ๋ ๊ฐ์ฒด๋ค์ ์ญ์ ํ๋ค. |
boolean retainAll(Collection c) | ์ง์ ๋ Collection์ ํฌํจ๋ ๊ฐ์ฒด๋ง์ ๋จ๊ธฐ๊ณ ๋ค๋ฅธ ๊ฐ์ฒด๋ค์ Collection์์ ์ญ์ ํ๋ค. ์ด ์์ ์ผ๋ก ์ธํด Collection์ ๋ฒํ๊ฐ ์์ผ๋ฉด true๋ฅผ ๊ทธ๋ ์ง ์์ผ๋ฉด false๋ฅผ ๋ฐํํ๋ค. |
int size() | Collection์ ์ ์ฅ๋ ๊ฐ์ฒด์ ๊ฐ์๋ฅผ ๋ฐํํ๋ค. |
Object[] toArray() | Collection์ ์ ์ฅ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ฒด๋ฐฐ์ด(Object[])๋ก ๋ฐํํ๋ค. |
Object[] toArray(Object[] a) | ์ง์ ๋ ๋ฐฐ์ด์ Collection์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํด์ ๋ฐํํ๋ค. |
11-4 List ์ธํฐํ์ด์ค - ์์ O, ์ค๋ณต O

Collection ์ธํฐํ์ด์ค๋ก๋ถํฐ ์์๋ฐ์ ๊ฒ๋ค์ ์ ์ธ
๋ฉ์๋ | ์ค๋ช |
---|---|
void add(int index, Object element) boolean addAll(int index, Collection c) | ์ง์ ๋ ์์น(index)์ ๊ฐ์ฒด(element) ๋๋ ์ปฌ๋ ์
์ ํฌํจ๋ ๊ฐ์ฒด๋ค์ ์ถ๊ฐํ๋ค. |
Object get(int index) | ์ง์ ๋ ์์น(index)์ ์๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. |
int indexOf(Object o) | ์ง์ ๋ ๊ฐ์ฒด์ ์์น(index)๋ฅผ ๋ฐํํ๋ค. |
int lastIndexOf(Object o) | ์ง์ ๋ ๊ฐ์ฒด์ ์์น(index)๋ฅผ ๋ฐํํ๋ค. (List์ ๋ง์ง๋ง ์์๋ถํฐ ์ญ๋ฐฉํฅ์ผ๋ก ์ฐพ๋๋ค.) |
ListIterator listIterator() ListIterator listIterator(int index) | List์ ๊ฐ์ฒด์ ์ ๊ทผํ ์ ์๋ ListIterator๋ฅผ ๋ฐํํ๋ค. |
Object remove(int index) | ์ง์ ๋ ์์น(index)์ ์๋ ๊ฐ์ฒด๋ฅผ ์ญ์ ํ๊ณ ์ญ์ ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. |
Object set(int index, Object element) | ์ง์ ๋ ์์น(index)์ ์๋ ๊ฐ์ฒด๋ฅผ ์ญ์ ํ๊ณ ์ญ์ ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. |
void sort(Comparator c) | ์ง์ ๋ ๋น๊ต์(comparator)๋ก List๋ฅผ ์ ๋ ฌํ๋ค. |
List subList(int fromIndex, int toIndex) | ์ง์ ๋ ๋ฒ์(fromIndex๋ถํฐ toIndex)์ ์๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. |
11-5 Set ์ธํฐํ์ด์ค - ์์ X, ์ค๋ณต X

๋ชจ๋ Collection ์ธํฐํ์ด์ค๋ก๋ถํฐ ์์๋ฐ์ ๊ฒ๋ค์ด๋ค.
๋ฉ์๋ | ์ค๋ช |
---|---|
boolean add(Object o) | ์ง์ ๋ ๊ฐ์ฒด(o) ๋๋ Collection(c)์ ๊ฐ์ฒด๋ค์ Collection์ ์ถ๊ฐํ๋ค. |
void clear() | Collection์ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์ญ์ ํ๋ค. |
boolean contains(Object o) boolean containsAll(Collection c) | ์ง์ ๋ ๊ฐ์ฒด(o) ๋๋ Collection์ ๊ฐ์ฒด๋ค์ด Collection์ ํฌํจ๋์ด ์๋์ง ํ์ธํ๋ค. |
boolean equals(Object o) | ๋์ผํ Collection์ธ์ง ๋น๊ตํ๋ค. |
int hashCode() | Collection์ hash code๋ฅผ ๋ฐํํ๋ค. |
boolean isEmpty() | Collection์ด ๋น์ด์๋์ง ํ์ธํ๋ค. |
Iterator iterator() | Collection์ Iterator๋ฅผ ์ป์ด์ ๋ฐํํ๋ค. |
boolean remove(Object o) | ์ง์ ๋ ๊ฐ์ฒด๋ฅผ ์ญ์ ํ๋ค. |
boolean removeAll(Collection c) | ์ง์ ๋ Collection์ ํฌํจ๋ ๊ฐ์ฒด๋ค์ ์ญ์ ํ๋ค. |
boolean retainAll(Collection c) | ์ง์ ๋ Collection์ ํฌํจ๋ ๊ฐ์ฒด๋ง์ ๋จ๊ธฐ๊ณ ๋ค๋ฅธ ๊ฐ์ฒด๋ค์ Collection์์ ์ญ์ ํ๋ค. ์ด ์์ ์ผ๋ก ์ธํด Collection์ ๋ณํ๊ฐ ์์ผ๋ฉด true๋ฅผ ๊ทธ๋ ์ง ์์ผ๋ฉด false๋ฅผ ๋ฐํํ๋ค. |
int size() | Collection์ ์ ์ฅ๋ ๊ฐ์ฒด์ ๊ฐ์๋ฅผ ๋ฐํํ๋ค. |
Object[] toArray() | Collection์ ์ ์ฅ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ฒด๋ฐฐ์ด(Object[])๋ก ๋ฐํํ๋ค. |
Object[] toArray(Object[] a) | ์ง์ ๋ ๋ฐฐ์ด์ Collection์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํด์ ๋ฐํํ๋ค. |
11-5 Map ์ธํฐํ์ด์ค - ์์ X, ์ค๋ณต(ํค X, ๊ฐ O)

+) Map์ด๋ผ๋ ๊ฐ๋ ์ ์ด๋ค ๋ ๊ฐ์ ์ฐ๊ฒฐํ๋ค๋ ์๋ฏธ์์ ๋ถ์ฌ์ง ์ด๋ฆ์ด๋ค.
๋ฉ์๋ | ์ค๋ช |
---|---|
void clear() | Map์ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์ญ์ ํ๋ค. |
boolean containsKey(Object key) | ์ง์ ๋ key ๊ฐ์ฒด์ ์ผ์นํ๋ Map์ key ๊ฐ์ฒด๊ฐ ์๋์ง ํ์ธํ๋ค. |
boolean contatinsValue(Object value) | ์ง์ ๋ value ๊ฐ์ฒด์ ์ผ์นํ๋ Map์ value ๊ฐ์ฒด๊ฐ ์๋์ง ํ์ธํ๋ค. |
Set entrySet() | Map์ ์ ์ฅ๋์ด ์๋ key-value ์์ Map.Entry ํ์ ์ ๊ฐ์ฒด๋ก ์ ์ฅํ Set์ผ๋ก ๋ฐํํ๋ค. |
boolean equals(Object o) | ๋์ผํ Map์ธ์ง ๋น๊ตํ๋ค. |
Object get(Object key) | ์ง์ ํ key ๊ฐ์ฒด์ ๋์ํ๋ value ๊ฐ์ฒด๋ฅผ ์ฐพ์์ ๋ฐํํ๋ค. |
int hashCode() | ํด์์ฝ๋๋ฅผ ๋ฐํํ๋ค. |
boolean isEmpty() | Map์ด ๋น์ด์๋์ง ํ์ธํ๋ค. |
Set keySet() | Map์ ์ ์ฅ๋ ๋ชจ๋ key ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. |
Object put(Object key, Object value) | Map์ value ๊ฐ์ฒด๋ฅผ key ๊ฐ์ฒด์ ์ฐ๊ฒฐ(mapping)ํ์ฌ ์ ์ฅํ๋ค. |
void putAll(Map t) | ์ง์ ๋ Map์ ๋ชจ๋ key-value์์ ์ถ๊ฐํ๋ค. |
Object remove(Object key) | ์ง์ ํ key ๊ฐ์ฒด์ ์ผ์นํ๋ key-value ๊ฐ์ฒด๋ฅผ ์ญ์ ํ๋ค. |
int size() | Map์ ์ ์ฅ๋ key-value์์ ๊ฐ์๋ฅผ ๋ฐํํ๋ค. |
Collection values() | Map์ ์ ์ฅ๋ ๋ชจ๋ value ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. |
values()์์๋ ๋ฐํํ์ ์ด Collection์ด๊ณ , keySet()์์๋ ๋ฐํํ์ ์ด Set์ธ ๊ฒ์ ์ฃผ๋ชฉํ์. Map ์ธํฐํ์ด์ค์์ ๊ฐ(value)์ ์ค๋ณต์ ํ์ฉํ๊ธฐ ๋๋ฌธ์ Collection ํ์ ์ผ๋ก ๋ฐํํ๊ณ , ํค(key)๋ ์ค๋ณต์ ํ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ Set ํ์ ์ผ๋ก ๋ฐํํ๋ค.
11-7 ArrayList
- ArrayList๋ ๊ธฐ์กด์ Vector๋ฅผ ๊ฐ์ ํ ๊ฒ์ผ๋ก ๊ตฌํ์๋ฆฌ์ ๊ธฐ๋ฅ์ ์ผ๋ก ๋์ผ
ArrayList์ ๋ฌ๋ฆฌ Vector๋ ์์ฒด์ ์ผ๋ก ๋๊ธฐํ ์ฒ๋ฆฌ๊ฐ ๋์ด์๋ค.
- List ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ฏ๋ก, ์ ์ฅ์์๊ฐ ์ ์ง๋๊ณ ์ค๋ณต์ ํ์ฉํ๋ค. (์์ O, ์ค๋ณต O)
public class ArrayList extends AbstractList
implements List, RandomAccess, Cloneable, java.io.Serializable {
...
transient Obejct[] elementData; // Obejct ๋ฐฐ์ด, ๋ชจ๋ ์ข
๋ฅ์ ๊ฐ์ฒด๋ฅผ ๋ด์ ์ ์๋ค.
...
}
11-8 ArrayList์ ๋ฉ์๋
๋ฉ์๋ | ์ค๋ช |
---|---|
ArrayList() | ํฌ๊ธฐ๊ฐ 0์ธ ArrayList๋ฅผ ์์ฑ |
ArrayList(Collection c) | ์ฃผ์ด์ง ์ปฌ๋ ์ ์ด ์ ์ฅ๋ ArrayList๋ฅผ ์์ฑ |
ArrayList(int initCapacity) | ์ง์ ๋ ์ด๊ธฐ์ฉ๋์ ๊ฐ๋ ArrayList๋ฅผ ์์ฑ |
boolean add(int index) | ArrayList์ ๋ง์ง๋ง์ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐ, ์ฑ๊ณตํ๋ฉด true |
void add(int index, Object element) | ์ง์ ๋ ์์น(index)์ ๊ฐ์ฒด๋ฅผ ์ ์ฅ |
boolean addAll(Collection c) | ์ฃผ์ด์ง ์ปฌ๋ ์ ์ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ค. |
boolean addAll(int index, Collection c) | ์ง์ ๋ ์์น๋ถํฐ ์ฃผ์ด์ง ์ปฌ๋ ์ ์ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ค. |
void clear() | ArrayList๋ฅผ ์์ ํ ๋น์ด๋ค. |
Obejct clone() | ArrayLlist๋ฅผ ๋ณต์ ํ๋ค. |
boolean contains(Obejct o) | ์ง์ ๋ ๊ฐ์ฒด(o)๊ฐ ArrayList์ ํฌํจ๋์ด ์๋์ง ํ์ธ |
void ensureCapacity(int minCapacity) | ArrayList์ ์ฉ๋์ด ์ต์ํ minCapacity๊ฐ ๋๋๋ก ํ๋ค. |
Obejct get(int index) | ์ง์ ๋ ์์น(index)์ ์ ์ฅ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. |
int indexOf(Obejct o) | ์ง์ ๋ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋ ์์น๋ฅผ ์ฐพ์ ๋ฐํํ๋ค. |
boolean isEmpty() | ArrayList๊ฐ ๋น์ด์๋์ง ํ์ธํ๋ค. |
Iterator iterator() | ArrayList์ Iterator ๊ฐ์ฒด๋ฅผ ๋ฐํ |
int lastIndexOf(Object o) | ๊ฐ์ฒด(o)๊ฐ ์ ์ฅ๋ ์์น๋ฅผ ๋๋ถํฐ ์ญ๋ฐฉํฅ์ผ๋ก ๊ฒ์ํด์ ๋ฒํ |
ListIterator listIterator(int index) | ArrayList์ ์ง์ ๋ ์์น๋ถํฐ ์์ํ๋ ListIterator๋ฅผ ๋ฐํ. |
Object remove(int index) | ์ง์ ๋ ์์น(index)์ ์๋ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ๋ค. |
boolean remove(Object o) | ์ง์ ๋ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ๋ค.(์ฑ๊ณตํ๋ฉด true, ์คํจํ๋ฉด false) |
boolean removeAll(Collection c) | ์ง์ ๋ ์ปฌ๋ ์ ์ ์ ์ฅ๋ ๊ฒ๊ณผ ๋์ผํ ๊ฐ์ฒด๋ค์ ArrayList์์ ์ ๊ฑฐํ๋ค. |
boolean retainAll(Collection c) | ArrayList์ ์ ์ฅ๋ ๊ฐ์ฒด ์ค์ ์ฃผ์ด์ง ์ปฌ๋ ์ ๊ณผ ๊ณตํต๋ ๊ฒ๋ค๋ง์ ๋จ๊ธฐ๊ณ ๋๋จธ์ง๋ ์ญ์ ํ๋ค. |
Object set(int index, Object element) | ์ฃผ์ด์ง ๊ฐ์ฒด(element)๋ฅผ ์ง์ ๋ ์์น(index)์ ๋ฐํํ๋ค. |
int size() | ArrayList์ ์ ์ฅ๋ ๊ฐ์ฒด์ ๊ฐ์๋ฅผ ๋ฐํํ๋ค. (๊ฐ ๋ณ๊ฒฝ) |
void sort(Comparator c) | ์ง์ ๋ ์ ๋ ฌ๊ธฐ์ค(c)์ผ๋ก ArrayList๋ฅผ ์ ๋ ฌ |
List subList(int fromIndex, int toIndex) | fromIndex๋ถํฐ toIndex์ฌ์ด์ ์ ์ฅ๋ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. |
Object[] toArray() | ArrayList์ ์ ์ฅ๋ ๋ชจ๋ ๊ฐ์ฒด๋ค์ ๊ฐ์ฒด๋ฐฐ์ด๋ก ๋ฐํํ๋ค. |
Obejct[] toArray(Object[] a) | ArrayList์ ์ ์ฅ๋ ๋ชจ๋ ๊ฐ์ฒด๋ค์ ํ๊บผ๋ฒ์ a์ ๋ด์ ๋ฐํํ๋ค. |
void trimToSize() | ์ฉ๋์ ํฌ๊ธฐ์ ๋ง๊ฒ ์ค์ธ๋ค.(๋น ๊ณต๊ฐ์ ์์ค๋ค.) |
ArrayList์ ๊ณต๊ฐ์ด ๋ถ์กฑํ ๊ฒฝ์ฐ ์๋ก์ด ๋ฐฐ์ด์ ๋ง๋ค์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ด ๋จ์ด์ง ์ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ ์ ํ ๊ธฐ๋ณธ ๊ธธ์ด(capacity)๋ฅผ ์ ์ธํด์ฃผ๋ ๊ฒ์ด ์ข๋ค.
์์ 11-1
import java.util.*; class Ex11_1 { @SuppressWarnings({ "unchecked", "rawtypes" }) public static void main(String[] args) { ArrayList list1 = new ArrayList(10); // ArrayList์๋ ๊ฐ์ฒด๋ง ์ ์ฅ ๊ฐ๋ฅ // autoboxing์ ์ํด ๊ธฐ๋ณธํ์ด ์ฐธ์กฐํ์ผ๋ก ์๋ ๋ณํ list1.add(new Integer(5)); list1.add(new Integer(4)); list1.add(new Integer(2)); list1.add(new Integer(0)); list1.add(new Integer(1)); list1.add(new Integer(3)); ArrayList list2 = new ArrayList(list1.subList(1,4)); print(list1, list2); // Collections : ํด๋์ค / Collection : ์ธํฐํ์ด์ค Collections.sort(list1); Collections.sort(list2); print(list1, list2); System.out.println("list1.contatins(list2) : " + list1.containsAll(list2)); list2.add("B"); list2.add("C"); list2.add(3, "A"); print(list1, list2); list2.set(3, "AA"); // ๋ณ๊ฒฝ print(list1, list2); list1.add(0, "1"); print(list1, list2); // indexOf()๋ ์ง์ ๋ ๊ฐ์ฒด์ ์์น(์ธ๋ฑ์ค)๋ฅผ ์๋ ค์ค๋ค. System.out.println("index = " + list1.indexOf(1)); // list1.remove(1); // ์ธ๋ฑ์ค๊ฐ 1์ธ ๊ฐ์ฒด๋ฅผ ์ญ์ list1.remove(new Integer(1)); // 1์ ์ญ์ print(list1, list2); print(list1, list2); // list1์์ list2์ ์ผ์นํ๋ ๋ถ๋ถ๋ง ๋จ๊ธฐ๊ณ ๋๋จธ์ง๋ ์ญ์ ํ๋ค. System.out.println("list1.retainAll(list2) : " + list1.retainAll(list2)); print(list1, list2); // list2์์ list1์ ํฌํจ๋ ๊ฐ์ฒด๋ค์ ์ญ์ ํ๋ค. for (int i = list2.size()-1; i >= 0; i--) { // list1์ list2.get(index)๊ฐ ํฌํจ๋์ด์๋์ง ์ฒดํฌ if (list1.contains(list2.get(i))) { list2.remove(i); } } print(list1, list2); // for(int i = list2.size(); ) } // main์ ๋ @SuppressWarnings("rawtypes") static void print(ArrayList list1, ArrayList list2) { System.out.println("list1:"+list1); System.out.println("list2:"+list2); System.out.println(); } } // class
์ง๋ฌธ
11-8 : ์ง์ ๋ ์ด๊ธฐ์ฉ๋ ํ์ธํ๋ ๋ฒ? StringBuffer ๋ฐฐ์ธ ๋ ๋์๋ ๋ฒํผ์ ํฌ๊ธฐ? ๋ญ ๊ทธ๋ฐ๊ฑด๊ฐ
list.contains, list.containsAll์ ์ฐจ์ด์ ..
11-10 ArrayList์ ์ ์ฅ๋ ๊ฐ์ฒด์ ์ญ์ ๊ณผ์
ArrayList์ ์ ์ฅ๋ ์ธ ๋ฒ์งธ ๋ฐ์ดํฐ(data[2]๋ฅผ ์ญ์ ํ๋ ๊ณผ์ . list.remove(2);๋ฅผ ํธ์ถ

โ ์ญ์ ํ ๋ฐ์ดํฐ ์๋์ ๋ฐ์ดํฐ๋ฅผ ํ ์นธ์ฉ ์๋ก ๋ณต์ฌ์์ ์ญ์ ํ ๋ฐ์ดํฐ๋ฅผ ๋ฎ์ด์ด๋ค.
System.arraycopy(data, 3, data, 2, 2)
// data[3]์์ data[2]๋ก 2๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๋ผ๋ ์๋ฏธ์ด๋ค.
โก ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ํ ์นธ์ฉ ์ด๋ํ์ผ๋ฏ๋ก ๋ง์ง๋ง ๋ฐ์ดํฐ๋ null๋ก ๋ณ๊ฒฝํ๋ค.
data[size-1] = null;
โข ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋์ด ๋ฐ์ดํฐ์ ๊ฐ์๊ฐ ์ค์์ผ๋ฏ๋ก size์ ๊ฐ์ ๊ฐ์์ํจ๋ค.
size--;
โ ๋ง์ง๋ง ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ ๊ฒฝ์ฐ, โ ์ ๊ณผ์ (๋ฐฐ์ด์ ๋ณต์ฌ)์ ํ์์๋ค.
์ด๋๊ณผ์ (โ )์ด ๋ถ๋ด์ด ๋ง์ด ๊ฐ๋ ์์ ์. ๋๋๋ก์ด๋ฉด โ ๊ณผ์ ์ด ์ผ์ด๋์ง ์๋๋ก ํ๋ ๊ฒ์ด ์ค์ํ๋ค.

๋ฐฐ์ด์ ์ฅ๋จ์
์ฅ์ : ๋ฐฐ์ด์ ๊ตฌ์กฐ๊ฐ ๊ฐ๋จํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ(์ ๊ทผ์๊ฐ, access time)์ด ์งง๋ค.
๋จ์ 1 : ํฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.
** ์คํ์ค์ ๋ณ๊ฒฝํ ์ ์๋ค๋ ๋ป
- ํฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒฝ์ฐ ์๋ก์ด ๋ฐฐ์ด์ ์์ฑ ํ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํด์ผํจ
โ ๋ ํฐ ๋ฐฐ์ด ์์ฑ โ โก ๋ฐ์ดํฐ ๋ณต์ฌ โ โข ์ฐธ์กฐ๋ณ๊ฒฝ
- ํฌ๊ธฐ ๋ณ๊ฒฝ์ ํผํ๊ธฐ ์ํด ์ถฉ๋ถํ ํฐ ๋ฐฐ์ด์ ์์ฑํ๋ฉด, ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ญ๋น๋๋ค.
๋จ์ 2 : ๋น์์ฐจ์ ์ธ ๋ฐ์ดํฐ์ ์ถ๊ฐ, ์ญ์ ์ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฐ๋ค.
- ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ๊ธฐ ์ํด, ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ์ฎ๊ฒจ์ผ ํจ.
- ๊ทธ๋ฌ๋ ์์ฐจ์ ์ธ ๋ฐ์ดํฐ ์ถ๊ฐ(๋์ ์ถ๊ฐ)์ ์ญ์ (๋๋ถํฐ ์ญ์ )๋ ๋น ๋ฅด๋ค.
** ๋ฐฐ์ด ๋จ์ : โ ํฌ๊ธฐ ๋ณ๊ฒฝ X โก ์ถ๊ฐ ์ญ์ ์๊ฐ ์ค๋๊ฑธ๋ฆผ
11-12 LinkedList
- ๋ฐฐ์ด๊ณผ ๋ฌ๋ฆฌ ๋งํฌ๋ ๋ฆฌ์คํธ๋ ๋ถ์ฐ์์ ์ผ๋ก ์กด์ฌํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐ(link)
- ๋ณ๊ฒฝ์ ์ ๋ฆฌํ๋ค.
๋ฐ์ดํฐ์ ์ญ์ : ๋จ ํ ๋ฒ์ ์ฐธ์กฐ๋ณ๊ฒฝ๋ง์ผ๋ก

๋ฐ์ดํฐ์ ์ถ๊ฐ : ํ๋ฒ์ Node ๊ฐ์ฒด์์ฑ๊ณผ ๋ ๋ฒ์ ์ฐธ์กฐ๋ณ๊ฒฝ๋ง์ผ๋ก ๊ฐ๋ฅ

3.2 LinkedList - ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ
๋งํฌ๋ ๋ฆฌ์คํธ(linked list) - ์ฐ๊ฒฐ๋ฆฌ์คํธ. ๋จ์ : ๋ฐ์ดํฐ ์ ๊ทผ์ฑ์ด ๋์จ
๋ฐฐ์ด์ ๊ฐ ์์๊ฐ ์ฐ์์ ์ด๊ธฐ ๋๋ฌธ์ ๋น ๋ฅด๊ฒ ์ํ๋ ์์์ ์ฃผ์๋ฅผ ์ป์ด์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ์ ์๋ค.
ํ์ง๋ง ๋งํฌ๋ ๋ฆฌ์คํธ๋ ๋น์ฐ์์ ์ด๊ธฐ ๋๋ฌธ์ ๋ค์ ์์๋ ์ฐพ์ ์ ์์ง๋ง ๋ด ๋ค์๋ค์์ ์์๋ ํ ๋ฒ์ ์ฐพ์ ์ ์๋ค.
why? ์์ ์ ๋ค์ ์ฃผ์๋ง ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ ์ฒซ ๋ฒ์งธ ์์๋ ๋ ๋ฒ์งธ ์์๊ฐ ์ด๋์ ์๋์ง๋ง ์์ง ์ธ ๋ฒ์งธ ์์๊ฐ ์ด๋์ ์๋์ง๋ ๋ชจ๋ฅธ๋ค.

๋๋ธ๋ฆฌ ๋งํฌ๋ ๋ฆฌ์คํธ(doubly linked list) - ์ด์ค ์ฐ๊ฒฐ๋ฆฌ์คํธ, ์ ๊ทผ์ฑ ํฅ์
linked list์ ์ ๊ทผ์ฑ์ด ๋์๋ค๋ ๋จ์ ์ ๊ฐ์ ํ ๊ฒ์ด doubly linked list์ด๋ค.
doubly linked list๋ ์๋ก ๊ทผ์ ํ ๋ ์์๋ฅผ ์, ๋ค๋ก ์ด๋ํ ์ ์๊ฒ ์ฐ๊ฒฐํด๋ ๊ฒ์ด๋ค.

๋๋ธ๋ฆฌ ์จํ๋ฌ ๋งํฌ๋ ๋ฆฌ์คํธ(doubly circular linked list) - ์ด์ค ์ํ ์ฐ๊ฒฐ๋ฆฌ์คํธ
์ด์ค ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ๋ ๊ฐ์ ํ ๊ฒ์ด ์ด์ค ์ํ ์ฐ๊ฒฐ๋ฆฌ์คํธ์ด๋ค.
๋ง์ง๋ง ๊ฐ null์ ํ์ฉ
๋ง์ง๋ง ์์์ ๋ค์์ ๋งจ ์ ์ฃผ์๊ฐ์ ๋ฃ์ด๋๊ณ
์ฒซ๋ฒ ์งธ ์์์ ์ด์ ์ ๋งจ ๋ค ์ฃผ์๊ฐ์ ๋ฃ์ด์ค๋ค.
ex) TV ์ฑ๋ 1์ฑ๋์์ ๋ค๋ก๊ฐ๋ฉด 999์ฑ๋๋ก ๊ฐ๋ ๊ฒ๊ณผ ๋น์ทํ๋ค.

+) ์๋ฐ๋ ์ด์ค ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ๊ตฌํ์ด ๋์ด์๋ค.
3.3 ArrayList vs. LinkedList - ์ฑ๋ฅ ๋น๊ต
์๋ฃ๊ตฌ์กฐ์ ๋ฐฐ์ด๊ธฐ๋ฐ VS ์ฐ๊ฒฐ๊ธฐ๋ฐ

โ ์์ฐจ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ/์ญ์ - ArrayList๊ฐ ๋น ๋ฆ
โก ๋น์์ฐจ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ/์ญ์ - LinkedList๊ฐ ๋น ๋ฆ
โข ์ ๊ทผ์๊ฐ(access time) - ArrayList๊ฐ ๋น ๋ฆ
์์ 11-5
package ch11; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class ArrayListLinkedListTest { public static void main(String[] args) { ArrayList al = new ArrayList(2000000); LinkedList ll = new LinkedList(); System.out.println("= ์์ฐจ์ ์ผ๋ก ์ถ๊ฐํ๊ธฐ ="); System.out.println("ArrayList :"+add1(al)); System.out.println("LinkedList :"+add1(ll)); System.out.println(); System.out.println("= ์ค๊ฐ์ ์ถ๊ฐํ๊ธฐ ="); System.out.println("ArrayList :"+add2(al)); System.out.println("LinkedList :"+add2(ll)); System.out.println(); System.out.println("= ์ค๊ฐ์์ ์ญ์ ํ๊ธฐ ="); System.out.println("ArrayList :"+remove2(al)); System.out.println("LinkedList :"+remove2(ll)); System.out.println(); System.out.println("= ์์ฐจ์ ์ผ๋ก ์ญ์ ํ๊ธฐ ="); System.out.println("ArrayList :"+remove1(al)); System.out.println("LinkedList :"+remove1(ll)); } public static long add1(List list) { long start = System.currentTimeMillis(); for(int i=0; i<1000000;i++) list.add(i+""); long end = System.currentTimeMillis(); return end - start; } public static long add2(List list) { long start = System.currentTimeMillis(); for(int i=0; i<10000;i++) list.add(500, "X"); long end = System.currentTimeMillis(); return end - start; } public static long remove1(List list) { long start = System.currentTimeMillis(); for(int i=list.size()-1; i >= 0;i--) list.remove(i); long end = System.currentTimeMillis(); return end - start; } public static long remove2(List list) { long start = System.currentTimeMillis(); for(int i=0; i<10000;i++) list.remove(i); long end = System.currentTimeMillis(); return end - start; } }
ArrayList(๋ฐฐ์ด ๊ธฐ๋ฐ) vs LinkedList(์ฐ๊ฒฐ ๊ธฐ๋ฐ) ์ฑ๋ฅ ๋น๊ต
์ปฌ๋ ์ | ์ฝ๊ธฐ(์ ๊ทผ์๊ฐ) | ์ถ๊ฐ / ์ญ์ | ๋น๊ณ |
---|---|---|---|
ArrayList | ๋น ๋ฅด๋ค | ๋๋ฆฌ๋ค | ์์ฐจ์ ์ธ ์ถ๊ฐ์ญ์ ๋ ๋ ๋น ๋ฆ. ๋นํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ์ฌ์ฉ(์ฑ๋ฅ ๋์ด๋ ค๊ณ ๋ฐฐ์ด ํฌ๊ฒ ์ก์) |
LinkedList | ๋๋ฆฌ๋ค | ๋น ๋ฅด๋ค | ๋ฐ์ดํฐ๊ฐ ๋ง์์๋ก ์ ๊ทผ์ฑ์ด ๋จ์ด์ง |
๋ค๋ฃจ๊ณ ์ ํ๋ ๋ฐ์ดํฐ์ ๊ฐ์๊ฐ ๋ณํ์ง ์๋ ๊ฒฝ์ฐ๋ผ๋ฉด, ArrayList
๋ฐ์ดํฐ ๊ฐ์์ ๋ณ๊ฒฝ์ด ์ฆ๋ค๋ฉด LinkedList๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋์ ์ ํ์ด ๋ ์ ์๋ค.
11-15 ์คํ๊ณผ ํ(Stack & Queue)
์คํ(Stack) : LIFO ๊ตฌ์กฐ. ๋ง์ง๋ง์ ์ ์ฅ๋ ๊ฒ์ ์ ์ผ ๋จผ์ ๊บผ๋ด๊ฒ ๋๋ค.
ํ(Queue) : FIFO ๊ตฌ์กฐ. ๋จผ์ ์ ์ฅํ ๊ฒ์ ์ ์ผ ๋จผ์ ๊บผ๋ด๊ฒ ๋๋ค.

Stack๊ณผ Queue๋ฅผ ๊ตฌํํ๊ธฐ ์ํด์๋ ๋ฐฐ์ด๊ณผ ๋งํฌ๋๋ฆฌ์คํธ์ค ์ด๋ค ๊ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์๊น?
- Stack : ๋ฐฐ์ด์ด ์ ํฉํ๋ค.
why? ๋ฐ์ดํฐ๋ฅผ ์์ฐจ์ ์ผ๋ก ์ถ๊ฐํ๊ณ ์ญ์ ํ๊ธฐ ๋๋ฌธ
- Queue : ๋งํฌ๋๋ฆฌ์คํธ๊ฐ ์ ํฉํ๋ค.
why? Queue๋ ํญ์ ์ฒซ ๋ฒ์งธ๋ก ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ฏ๋ก, ArrayList์ ๊ฐ์ ๋ฐฐ์ด๊ธฐ๋ฐ์ ์ปฌ๋ ์ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ผ ๋๋ง๋ค ๋น ๊ณต๊ฐ์ ์ฑ์ฐ๊ธฐ ์ํด ๋ฐ์ดํฐ์ ๋ณต์ฌ๊ฐ ๋ฐ์ํ๋ฏ๋ก ๋นํจ์จ์ ์ด๋ค.
11-16 ์คํ๊ณผ ํ(Stack & Queue)์ ๋ฉ์๋
Stack์ ๋ฉ์๋
๋ฉ์๋ | ์ค๋ช |
---|---|
boolean empty() | Stack์ด ๋น์ด์๋์ง ์๋ ค์ค๋ค. |
Object peek() | Stack์ ๋งจ ์์ ์ ์ฅ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํ. pop()๊ณผ ๋ฌ๋ฆฌ Stack์์ ๊ฐ์ฒด๋ฅผ ๊บผ๋ด์ง๋ ์์.(๋น์์ ๋๋ EmptuStackException์ ๋ฐํ) |
Object pop() | Stack์ ๋งจ ์์ ์ ์ฅ๋ ๊ฐ์ฒด๋ฅผ ๊บผ๋ธ๋ค.(๋น์์ ๋๋ EmptyStackException๋ฐ์) |
Object push() | Stack์ ๊ฐ์ฒด(item)์ ์ ์ฅํ๋ค. |
int search(Object o) | Stack์์ ์ฃผ์ด์ง ๊ฐ์ฒด(o)๋ฅผ ์ฐพ์์ ๊ทธ ์์น๋ฅผ ๋ฐํ. ๋ชป์ฐพ์ผ๋ฉด -1์ ๋ฐํ. (๋ฐฐ์ด๊ณผ ๋ฌ๋ฆฌ ์์น๋ 0์ด ์๋ 1๋ถํฐ ์์) |
Queue์ ๋ฉ์๋
๋ฉ์๋ | ์ค๋ช |
---|---|
boolean add(Object o) | ์ง์ ๋ ๊ฐ์ฒด๋ฅผ Queue์ ์ถ๊ฐํ๋ค. ์ฑ๊ณตํ๋ฉด true๋ฅผ ๋ฐํ. ์ ์ฅ๊ณต๊ฐ์ด ๋ถ์กฑํ๋ฉด IllegalStateException ๋ฐ์ |
Object remove() | Queue์์ ๊ฐ์ฒด๋ฅผ ๊บผ๋ด ๋ฐํ. ๋น์ด์์ผ๋ฉด NoSuchElementException ๋ฐ์ |
Object element() | ์ญ์ ์์ด ์์๋ฅผ ์ฝ์ด์จ๋ค. peek๊ณผ ๋ฌ๋ฆฌ Queue๊ฐ ๋น์์ ๋ NoSuchElementException ๋ฐ์ |
boolean offer(Object o) | Queue์ ๊ฐ์ฒด๋ฅผ ์ ์ฅ. ์ฑ๊ณตํ๋ฉด true. ์คํจํ๋ฉด false๋ฅผ ๋ฐํ. |
Object poll() | Queue์์ ๊ฐ์ฒด๋ฅผ ๊บผ๋ด์ ๋ฐํ. ๋น์ด์์ผ๋ฉด null์ ๋ฐํ |
Object peek() | ์ญ์ ์์ด ์์๋ฅผ ์ฝ์ด์จ๋ค. Queue๊ฐ ๋น์ด์์ผ๋ฉด null์ ๋ฐํ |
11-18 ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค ์ฐพ๊ธฐ

All Known Implemention Classes : Queue ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค
Queue ์ธํฐํ์ด์ค์ ์ ์๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด, โAll Known Implemention Classesโ์ ์ ํ์๋ ํด๋์ค๋ค ์ค์์ ์ ๋นํ ๊ฒ์ ๊ณจ๋ผ ์๋์ ๊ฐ์ ์์ผ๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ์ฌ์ฉํ๋ฉด ๋๋ค.
Queue g = new LinkedList();
//LinkedList g = new LinkedList();
g.offer("0");
์์ 11-2
Stack st = new Stack(); Queue q = new LinkedList(); // Queue ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค์ธ LinkedList๋ฅผ ์ฌ์ฉ st.push("0"); st.push("1"); st.push("2"); q.offer("0"); q.offer("1"); q.offer("2"); System.out.println("= Stack ="); while (!st.empty()) { System.out.println(st.pop()); // ์คํ์์ ์์ ํ๋๋ฅผ ๊บผ๋ด ์ถ๋ ฅ } System.out.println("= Queue ="); while (!q.isEmpty()) { System.out.println(q.poll()); // ํ์์ ์์ ํ๋๋ฅผ ๊บผ๋ด ์ถ๋ ฅ }
11-19 ์คํ๊ณผ ํ(Stack & Queue)์ ํ์ฉ
์คํ์ ํ์ฉ ์ - ์์๊ณ์ฐ, ์์๊ดํธ๊ฒ์ฌ, ์๋ํ๋ก์ธ์์ undo/redo, ์น๋ธ๋ผ์ฐ์ ์ ๋ค๋ก/์์ผ๋ก
ํ์ ํ์ฉ ์ - ์ต๊ทผ์ฌ์ฉ๋ฌธ์, ์ธ์์์ ๋๊ธฐ๋ชฉ๋ก, ๋ฒํผ(buffer)
Stack ํ์ฉ ์์ : ์์๊ดํธ ๊ฒ์ฌ

<๊ท์น>
โ(โ
์ ๋ง๋๋ฉด ์คํ์ ๋ฃ๊ณ
โ)โ
๋ฉด ์คํ์์ โ(โ๋ฅผ ๊บผ๋ธ๋ค.
<์กฐ๊ฑด์ฒดํฌ>
โ)โ
๋ฅผ ๋ง๋์ โ(โ
๋ฅผ ๊บผ๋ด๋ ค ํ ๋ ์คํ์ด ๋น์ด์๊ฑฐ๋ ์์์ ๊ฒ์ฌํ๊ณ ๋ ํ์๋ ์คํ์ด ๋น์ด์์ง ์์ผ๋ฉด ๊ดํธ๊ฐ ์๋ชป๋ ๊ฒ์ด๋ค.
โ)โ
๋ฅผ ๋ง๋์ โ(โ
๋ฅผ ๊บผ๋ด๋ ค ํ ๋ ์คํ์ด ๋น์ด์์ผ๋ฉด EmptyStackException
์ด ๋ฐ์ํ๋ฏ๋ก try-catch๋ฌธ์ ์ด์ฉํด์ EmptyStackException
์ด ๋ฐ์ํ๋ฉด ๊ดํธ๊ฐ ์ผ์นํ์ง ์๋๋ค๋ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๋๋ก ํ๋ค
// ์์ 11-3
Stack st = new Stack();
String expression = "((3+5)*8-2)";
System.out.println("expresiion : " + expression);
try {
for(int i = 0; i < expression.length(); i++) {
char ch = expression.charAt(i);
if (ch == '(') {
st.push(ch + "");
} else if (ch == ')') {
st.pop();
}
}
if (st.isEmpty()) {
System.out.println("๊ดํธ๊ฐ ์ผ์นํฉ๋๋ค.");
} else {
System.out.println("๊ดํธ๊ฐ ์ผ์นํ์ง ์์ต๋๋ค.");
}
} catch (EmptyStackException e) {
System.out.println("๊ดํธ๊ฐ ์ผ์นํ์ง ์์ต๋๋ค.");
}
Stack ํ์ฉ ์์ 2 : ์น๋ธ๋ผ์ฐ์ โ๋ค๋กโ, โ์์ผ๋กโ
package ch11;
import java.util.Stack;
public class StackEx1 {
public static Stack back = new Stack();
public static Stack forward = new Stack();
public static void main(String[] args) {
goURL("1. ๋ค์ดํธ");
goURL("2. ์ผํ");
goURL("3. ๋ค์ด๋ฒ");
goURL("4. ๋ค์");
printStatus();
goBack();
System.out.println("= ๋ค๋ก๊ฐ๊ธฐ ๋ฒํผ์ ๋๋ฅธ ํ =");
printStatus();
goBack();
System.out.println("= '๋ค๋ก' ๋ฒํผ์ ๋๋ฅธ ํ =");
printStatus();
goForward();
System.out.println("= '์์ผ๋ก' ๋ฒํผ์ ๋๋ฅธ ํ =");
printStatus();
goURL("codechobo.com");
System.out.println("= ์๋ก์ด ์ฃผ์๋ก ์ด๋ ํ =");
printStatus();
}
public static void printStatus() {
System.out.println("back:"+back);
System.out.println("forward:"+forward);
System.out.println("ํ์ฌํ๋ฉด์ '" + back.peek()+"' ์
๋๋ค.");
System.out.println();
}
public static void goURL(String url){
back.push(url);
if(!forward.empty())
forward.clear();
}
public static void goForward(){
if(!forward.empty())
back.push(forward.pop());
}
public static void goBack(){
if(!back.empty())
forward.push(back.pop());
}
}
Queue ํ์ฉ ์์ : ์ต๊ทผ 5์ ๋ ฅ ๋ช ๋ น์ด ๋ณด์ฌ์ฃผ๊ธฐ
// ์์ 11-4
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
static Queue q = new LinkedList();
static final int MAX_SIZE = 5; // Queue์ ์ต๋ 5๊ฐ๊น์ง๋ง ์ ์ฅ๋๋๋ก ํ๋ค.
public static void main(String[] args) {
System.out.println("help๋ฅผ ์
๋ ฅํ๋ฉด ๋์๋ง์ ๋ณผ ์ ์์ต๋๋ค.");
while(true) {
System.out.print(">>");
try {
Scanner s = new Scanner(System.in);
String input = s.nextLine().trim(); // ์, ๋ค ๊ณต๋ฐฑ ์ ๊ฑฐ
if ("".equals(input)) continue;
if (input.equalsIgnoreCase("q")) {
System.exit(0);
} else if (input.equalsIgnoreCase("help")) {
System.out.println(" help - ๋์๋ง์ ๋ณด์ฌ์ค๋๋ค.");
System.out.println(" q ๋๋ Q - ํ๋ก๊ทธ๋จ์ ์ข
๋ฃํฉ๋๋ค.");
System.out.println(" history - ์ต๊ทผ์ ์
๋ ฅํ ๋ช
๋ น์ด๋ฅผ "
+ MAX_SIZE + "๊ฐ ๋ณด์ฌ์ค๋๋ค.");
} else if (input.equalsIgnoreCase("history")) {
LinkedList list = (LinkedList) q;
final int SIZE = list.size();
for (int i = 0; i < SIZE; i++) {
System.out.println((i+1) + "." + list.get(i));
}
} else {
save(input);
System.out.println(input);
}
} catch (Exception e) {
System.out.println("์
๋ ฅ ์ค๋ฅ์
๋๋ค.");
}
} // while(true)
} // main()
public static void save(String input) {
// queue์ ์ ์ฅํ๋ค.
if(!"".equals(input)) {
q.offer(input);
}
// queue์ ์ต๋ ํฌ๊ธฐ๋ฅผ ๋์ผ๋ฉด ์ ์ผ ์ฒ์ ์
๋ ฅ๋ ๊ฒ์ ์ญ์ ํ๋ค.
if(q.size() > MAX_SIZE) { // size()๋ Collection ์ธํฐํ์ด์ค์ ์ ์
q.remove();
}
}
} // end of class
โ ย Check Point
- for๋ฌธ ๋๋ฆด ๋ size ๋ฏธ๋ฆฌ ์ ์ธํด์ค ๊ฒ. ์ ์ธํ์ง ์์ผ๋ฉด for๋ฌธ ๋ ๋๋ง๋ค list์ ์ฌ์ด์ฆ๋ฅผ ๊ตฌํด์ค๊ธฐ ๋๋ฌธ์ ๋นํจ์จ์ ์
- "".equals(input) ๐
input์ด null์ธ๊ฑด ์๊ด์์. ์ ์ ๋๋ equals๊ฐ ์ฒ๋ฆฌ๋ฅผ ํด์ค๋ค.
input.equals(โโ) โ
โ NPE ๋ฐ์ ๊ฐ๋ฅ์ฑ ์์
11-22 Iterator, ListIterator, Enumeration
Iterator
- ์ปฌ๋ ์
์ ์ ์ฅ๋ ์์๋ฅผ ์ ๊ทผํ๋๋ฐ ์ฌ์ฉ๋๋ ์ธํฐํ์ด์ค
๋ฉ์๋ ์ค๋ช boolean hasNext() ์ฝ์ด ์ฌ ์์๊ฐ ๋จ์์๋์ง ํ์ธํ๋ค. ์์ผ๋ฉด true, ์์ผ๋ฉด false๋ฅผ ๋ฐํํ๋ค. Object next() ๋ค์ ์์๋ฅผ ์ฝ์ด์จ๋ค. next()๋ฅผ ํธ์ถํ๊ธฐ ์ ์ hasNext()๋ฅผ ํธ์ถํด์ ์ฝ์ด์ฌ ์์๊ฐ ์๋์ง ํ์ธํ๋ ๊ฒ์ด ์์ ํ๋ค. void remove() next()๋ก ์ฝ์ด์จ ์์๋ฅผ ์ญ์ ํ๋ค. next()๋ฅผ ํธ์ถํ ๋ค์์ remove()๋ฅผ ํธ์ถํด์ผํ๋ค.(์ ํ์ ๊ธฐ๋ฅ) void forEachRemaining(Consumer<? superย E>ย action) ์ปฌ๋ ์ ์ ๋จ์์๋ ์์๋ค์ ๋ํด ์ง์ ๋ ์์ (action)์ ์ํํ๋ค. ๋๋ค์์ ์ฌ์ฉํ๋ ๋ํดํธ ๋ฉ์๋(JDK1.8๋ถํฐ ์ถ๊ฐ)
- ์ปฌ๋ ์ ์ ์ ์ฅ๋ ์์๋ค์ ์ฝ์ด์ค๋ ๋ฐฉ๋ฒ์ ํ์คํํ ๊ฒ์ด๋ค.
Collection ์ธํฐํ์ด์ค
โIterator๋ฅผ ๊ตฌํํ ํด๋์ค์ ์ธ์คํด์ค'๋ฅผ ๋ฐํํ๋ iterator()๋ฅผ ์ ์ํ๊ณ ์๋ค.
List์ Set ์ธํฐํ์ด์ค์ ๊ณตํต์ ์ ๋ฝ์ ๋ง๋ ๊ฒ
public interface Collection {
...
public Iterator iterator();
...
}
์ปฌ๋ ์ ์ iterator()๋ฅผ ํธ์ถํด์ Iterator๋ฅผ ๊ตฌํํ ๊ฐ์ฒด๋ฅผ ์ป์ด์ ์ฌ์ฉ.
Collection list = new ArrayList(); // ๋ค๋ฅธ ์ปฌ๋ ์
์ผ๋ก ๋ณ๊ฒฝํ ๋๋ ์ด ๋ถ๋ถ๋ง ๊ณ ์น๋ฉด ๋๋ค.
Iterator it = list.iterator();
while (it.hasNext()) { // boolean hasNext() ์ฝ์ด์ฌ ์์๊ฐ ์๋์ง ํ์ธ
System.out.println(it.next()); // Object next() ๋ค์ ์์๋ฅผ ์ฝ์ด์ด
}
์์ 11-5
// ArrayList list = new ArrayList(); HashSet list = new HashSet(); Collection c = new TreeSet(); // Set์ Collection์ ์์ list.add(new Integer(1)); list.add(new Integer(2)); list.add(new Integer(3)); list.add(new Integer(4)); list.add(new Integer(5)); Iterator it = list.iterator(); while (it.hasNext()) { System.out.println(it.next()); } // for (int i = 0; i < list.size(); i++) { // System.out.println(list.get(i)); // }
โ ย Check Point
- ๋ค๋ฅธ ์ปฌ๋ ์
์ผ๋ก ๋ณ๊ฒฝํด์ผ ํ ๋, ArrayList๊ฐ ๊ฐ์ง๊ณ ์๋ get ๋ฉ์๋๋ฅผ ์ด์ฉํด ์ฝ๋๋ฅผ ์์ฑํ๋ฉด HashSet์ผ๋ก ์ปฌ๋ ์
์ ๋ณ๊ฒฝํ์ ๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด์ผํ๋ค.
ํ์ง๋ง, Iterator๋ก ์์๋ฅผ ๊ฐ์ ธ์ค๋ฉด ํ์คํ๋์ด์๊ธฐ ๋๋ฌธ์ ์ฝ๋์ ๋ณ๊ฒฝ ์์ด ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
- ๋คํ์ฑ์ ์ด์ฉํด ์ฐธ์กฐ๋ณ์์ type์ Collection์ผ๋ก ๋ณ๊ฒฝํ๋ฉด ์ถํ ์ธ์คํด์ค๋ฅผ ๋ค๋ฅธ ์ปฌ๋ ์
์ผ๋ก ๋ณ๊ฒฝํ๊ฒ ๋์์ ๋ ๊ฒํ ๋ฅผ ํ์ง ์์๋๋๋ ์ฅ์ ์ด ์๋ค.(์ฐธ์กฐ๋ณ์ ํด๋์ค์ ์กด์ฌํ๋ ๋ฉค๋ฒ, ๋ฉ์๋๋ง ์ธ ์ ์๊ธฐ ๋๋ฌธ)
โ ๊ฒฐ๋ก : ์ฐธ์กฐ๋ณ์์ ์ข ๋ฅ๋ ์ ๊ฒฐ์ ํด์ผํ๋ค.
ArrayList list = new ArrayList(); list.add(new Integer(1)); list.add(new Integer(2)); list.add(new Integer(3)); list.add(new Integer(4)); list.add(new Integer(5)); Iterator it = list.iterator(); while (it.hasNext()) { // ์ฝ์ด์ฌ ์์๊ฐ ๋จ์์๋์ง ํ์ธํ๋ค. System.out.println(it.next()); } // iterator๋ 1ํ์ฉ์ด๋ผ ๋ค ์ฐ๊ณ ๋๋ฉด ๋ค์ ์ป์ด์์ผ ํ๋ค. it = list.iterator(); // ์๋ก์ด iterator ๊ฐ์ฒด๋ฅผ ์ป๋๋ค. while (it.hasNext()) { System.out.println(it.next()); }
โ ย Check Point
- iterator๋ ์ผํ์ฉ์ด๋ค. ๋ค ์ฐ๊ณ ๋๋ฉด ๋ค์ ์ป์ด์์ผ ํ๋ค.
- ๋ค๋ฅธ ์ปฌ๋ ์
์ผ๋ก ๋ณ๊ฒฝํด์ผ ํ ๋, ArrayList๊ฐ ๊ฐ์ง๊ณ ์๋ get ๋ฉ์๋๋ฅผ ์ด์ฉํด ์ฝ๋๋ฅผ ์์ฑํ๋ฉด HashSet์ผ๋ก ์ปฌ๋ ์
์ ๋ณ๊ฒฝํ์ ๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด์ผํ๋ค.
์์ 11-15
package ch11; import java.util.ArrayList; import java.util.Iterator; public class IteratorEx2 { public static void main(String[] args) { ArrayList original = new ArrayList(10); ArrayList copy1 = new ArrayList(10); ArrayList copy2 = new ArrayList(10); for (int i = 0; i < 10; i++) { original.add(i + ""); } Iterator it = original.iterator(); while (it.hasNext()) { copy1.add(it.next()); } System.out.println("= Original์์ copy1๋ก ๋ณต์ฌ(copy)"); System.out.println("original : " + original); System.out.println("copy1 : " + copy1); System.out.println(); it = original.iterator(); // Iterator๋ ์ฌ์ฌ์ฉ์ด ์ ๋๋ฏ๋ก, ๋ค์ ์ป์ด์์ผ ํ๋ค. while (it.hasNext()) { copy2.add(it.next()); it.remove(); // next๋ก ์ฝ์ด์จ ๊ฒ์ ์ญ์ ํ๋ค. } System.out.println("= Original์์ copy2๋ก ์ด๋(move) ="); System.out.println("original:"+original); System.out.println("copy2:"+copy2); } }
์์ 11-16
package ch11; import java.util.Iterator; public class MyVector2 extends MyVector implements Iterator { int cursor = 0; int lastRet = -1; public MyVector2(int capacity) { super(capacity); } public MyVector2() { super(10); } @Override public String toString() { String tmp = ""; Iterator it = this.iterator(); for (int i = 0; it.hasNext(); i++) { if (i != 0) tmp += ", "; tmp += it.next(); // tmp += next().toString(); } return "[" + tmp + "]"; } public Iterator iterator() { cursor = 0; // cursor์ lastRet์ ์ด๊ธฐํํ๋ค. lastRet = -1; return this; } // TODO // size() -1 ์๋๊ฐ..? cursor๊ฐ 1๋ถํฐ ์์ํ๋ฉด ๋ง์ด ๋๋๋ฐ 0๋ถํฐ์์ @Override public boolean hasNext() { return cursor != size(); // cursor(ํ์ฌ์์น)์ size๊ฐ ๊ฐ์ง ์์ผ๋ฉด true๋ฅผ ๋ฐํ } @Override public Object next() { Object next = get(cursor); lastRet = cursor++; return next; } public void remove() { // ๋์ด์ ์ญ์ ํ ๊ฒ์ด ์์ผ๋ฉด IllegalStateException์ ๋ฐ์์ํจ๋ค. if (lastRet == -1) { throw new IllegalStateException(); } else { remove(lastRet); // TODO ์์ง../?? cursor--; // ์ญ์ ํ์ cursor์ ์์น๋ฅผ ๊ฐ์์ํจ๋ค. lastRet = -1; // lastRet์ ๊ฐ์ ์ด๊ธฐํ์ํจ๋ค. } } }
์์ 11-17
package ch11; import java.util.Iterator; public class MyVector2Test { public static void main(String[] args) { MyVector2 v = new MyVector2(); v.add("0"); v.add("1"); v.add("2"); v.add("3"); v.add("4"); System.out.println("์ญ์ ์ : " + v); Iterator it = v.iterator(); it.next(); // it.remove(); it.next(); it.remove(); System.out.println("์ญ์ ํ : " + v); } }
Enumeration
Iterator์ ๊ตฌ๋ฒ์
โ ๊ธฐ๋ฅ์ ๋ณ ๋ค๋ฅผ๊ฒ ์์ ์ด๋ฆ๋ง ๋ค๋ฅธ ๊ฒ
๋ฉ์๋ | ์ค๋ช |
---|---|
boolean hasMoreElements() | ์ฝ์ด ์ฌ ์์๊ฐ ๋จ์์๋์ง ํ์ธํ๋ค. ์์ผ๋ฉด true, ์์ผ๋ฉด false๋ฅผ ๋ฐํํ๋ค. Iterator์ hasNext()์ ๊ฐ๋ค. |
Object nextElement() | ๋ค์ ์์๋ฅผ ์ฝ์ด์จ๋ค. nextElement()๋ฅผ ํธ์ถํ๊ธฐ ์ ์ hasMoreElements()๋ฅผ ํธ์ถํด์ ์ฝ์ด์ฌ ์์๊ฐ ์๋์ง ํ์ธํ๋ ๊ฒ์ด ์์ ํ๋ค. Iterator์ next()์ ๊ฐ๋ค. |
ListIterator
Iterator์ ์๋ฐฉํฅ ์กฐํ๊ธฐ๋ฅ์ ์ถ๊ฐ(List๋ฅผ ๊ตฌํํ ๊ฒฝ์ฐ๋ง ์ฌ์ฉ๊ฐ๋ฅ)
next(), previous() ๋ ๋ค ๊ฐ๋ฅ
์์ 11-1
11-24 Map๊ณผ Iterator
- Map์๋ iterator()๊ฐ ์๋ค. keySet(), entrySet(), values()๋ฅผ ํธ์ถํด์ผํ๋ค.
Collection์ ์์์ด ์๋๊ธฐ ๋๋ฌธ์
Map map = new HashMap(); Iterator it = map.entrySet().iterator(); // entry => k, v(key, value ํ ์) // Set set = map.entryset(); // Iterator it = set.iterator();
11-25~29 Arrays
๋ฐฐ์ด์ ๋ค๋ฃจ๊ธฐ ํธ๋ฆฌํ ๋ฉ์๋(static)๋ฅผ ์ ๊ณตํ๋ค.
1. ๋ฐฐ์ด์ ์ถ๋ ฅ - toString()
static String toString(boolean[] a)
static String toString(byte[] a)
static String toString(char[] a)
static String toString(short[] a)
static String toString(int[] a)
static String toString(long[] a)
static String toString(float[] a)
static String toString(double[] a)
static String toString(Object[] a)
2. ๋ฐฐ์ด์ ๋ณต์ฌ - copyOf()
, copyOfRange()
copyOf() : ๋ฐฐ์ด ์ ์ฒด ๋ณต์ฌ
copyOfRange() :
int[] arr = {0, 1, 2, 3, 4};
int[] arr2 = Arrays.copyOf(arr, arr.length); // arr2 = [0, 1, 2, 3, 4]
int[] arr3 = Arrays.copyOf(arr, 3); // arr3 = [0, 1, 2]
int[] arr4 = Arrays.copyOf(arr, 7); // arr4 = [0, 1, 2, 3, 4, 0, 0]
int[] arr5 = Arrays.copyOfRange(arr, 2, 4); // arr5 = [2, 3] <- 4๋ ๋ถํฌํจ from <= x < to
int[] arr6 = Arrays.copyOfRange(arr, 0, 7); // arr6 = [0, 1, 2, 3, 4, 0, 0, 0]
3. ๋ฐฐ์ด ์ฑ์ฐ๊ธฐ - fill()
, setAll()
int[] arr = new int[5];
Arrays.fill(arr, 9);
Arrays.setAll(arr, (i) -> (int)(Math.random() * 5 ) + 1); // arr = [1, 5, 2, 1, 1]
๋ฉ์๋ | ์ค๋ช |
---|---|
toString() | |
copyOf() | ๋ฐฐ์ด ์ ์ฒด๋ฅผ ๋ณต์ฌํด์ ๋ฐํํ๋ค. |
copyOfRange() | ์ง์ ํ ๋ฒ์์ ๋ฐฐ์ด์ ๋ณต์ฌํด์ ๋ฐํํ๋ค. |
fill() | ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ ์ง์ ๋ ๊ฐ์ผ๋ก ์ฑ์ด๋ค. |
setAll() | ๋ฐฐ์ด์ ์ฑ์ฐ๋๋ฐ ์ฌ์ฉํ ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋๋ค. ๋๋ค์์ด ๋ฐํํ ์์์ ๊ฐ์ผ๋ก ๋ฐฐ์ด์ ์ฑ์ |
sort() | ๋ฐฐ์ด์ ์ ๋ ฌํ๋ค. |
binarySearch() | ๋ฐฐ์ด์ ์ ์ฅ๋ ์์๋ฅผ ๊ฒ์ํ ๋ ์ฌ์ฉ. ๋ฐฐ์ด์์ ์ง์ ๋ ๊ฐ์ด ์ ์ฅ๋ ์์น๋ฅผ(index)๋ฅผ ์ฐพ์์ ๋ฐํํ๋ค. (์ ์ ์กฐ๊ฑด : ๋ฐฐ์ด์ด ์ ๋ ฌ๋ ์ํ์ฌ์ผํจ) |
4. ๋ฐฐ์ด์ ์ ๋ ฌ๊ณผ ๊ฒ์ - sort()
, binaraySearch()
int[] arr = {3, 2, 0, 1, 4};
int idx = Arrays.binarySearch(arr, 2); // idx=-5 <- ์๋ชป๋ ๊ฒฐ๊ณผ
Arrays.sort(arr); // ๋ฐฐ์ด arr์ ์ ๋ ฌํ๋ค.
System.out.println(Arrays.toString(arr)); // [0, 1, 2, 3, 4]
idx = Arrays.binarySearch(arr, 2); // idx = 2 <- ์ฌ๋ฐ๋ฅธ๊ฒฐ๊ณผ
+) ์์ฐจ ํ์๊ณผ ์ด์ง ํ์(binary search)
์์ฐจ ๊ฒ์ : ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ์์๋ถํฐ ์์๋๋ก ํ๋์ฉ ๊ฒ์
์ด์ง ๊ฒ์ : ๋ฐฐ์ด์ ๊ฒ์ํ ๋ฒ์๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์ ๋ฐ์ฉ ์ค์ฌ๊ฐ๋ฉด์ ๊ฒ์
๊ตฌ๋ถ | ์ฅ์ | ๋จ์ |
---|---|---|
์์ฐจ ๊ฒ์ | ๋ฐฐ์ด ์ ๋ ฌ ํ์ X | ๊ฒ์์๋ ๋๋ฆผ |
์ด์ง ๊ฒ์ | ๊ฒ์์๋ ๋น ๋ฆ | ๋ฐฐ์ด ์ ๋ ฌ ํ์ |

5. ๋ค์ฐจ์ ๋ฐฐ์ด์ ์ถ๋ ฅ - deepToString()
toString()์ ์ผ์ฐจ์ ๋ฐฐ์ด์๋ง ์ฌ์ฉํ ์ ์๋ค.
deepToString()์ ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ ์ฌ๊ท์ ์ผ๋ก ์ ๊ทผํด์ ๋ฌธ์์ด์ ๊ตฌ์ฑํ๋ฏ๋ก 2์ฐจ์๋ฟ๋ง ์๋๋ผ 3์ฐจ์ ์ด์์ ๋ฐฐ์ด์๋ ๋์ํ๋ค.
int[] arr = {0, 1, 2, 3, 4};
int[][] arr2D = {{11, 22}, {21, 22}};
System.out.println(Arrays.toString(arr)); // [0, 1, 2, 3, 4]
System.out.println(Arrays.deepToString(arr2D)); // [[11, 12], [21,22]]
6. ๋ค์ฐจ์ ๋ฐฐ์ด์ ๋น๊ต - deepEquals()
String[][] str2D = new String[][]{{"aaa", "bbb"}, {"AAA", "BBB"}};
String[][] str2D2 = new String[][]{{"aaa", "bbb"}, {"AAA", "BBB"}};
System.out.println(Arrays.equals(str2D, str2D2)); // false
System.out.println(Arrays.deepEquals(str2D, str2D2)); // true
์์ ๊ฐ์ด 2์ฐจ์ String ๋ฐฐ์ด์ equals()๋ก ๋น๊ตํ๋ฉด ์ ์ฅ๋ ๋ด์ฉ์ด ๊ฐ์๋ฐ๋ false๋ฅผ ๊ฒฐ๊ณผ๋ก ์ป๋๋ค. ๋ค์ฐจ์ ๋ฐฐ์ด์ โ๋ฐฐ์ด์ ๋ฐฐ์ด'์ด ํํ๋ก ๊ตฌ์ฑํ๊ธฐ ๋๋ฌธ์ equals()๋ก ๋น๊ตํ๋ฉด, ๋ฌธ์์ด์ ๋น๊ตํ๋ ๊ฒ์ด ์๋๋ผ โ๋ฐฐ์ด์ ์ ์ฅ๋ ๋ฐฐ์ด์ ์ฃผ์โ๋ฅผ ๋น๊ตํ๊ฒ ๋๋ค. ์๋ก ๋ค๋ฅธ ๋ฐฐ์ด์ ํญ์ ์ฃผ์๊ฐ ๋ค๋ฅด๋ฏ๋ก false๋ฅผ ๊ฒฐ๊ณผ๋ก ์ป๋๋ค.
7. ๋ฐฐ์ด์ List๋ก ๋ณํ - asList(Objectโฆ a)
asList()๋ ๋ฐฐ์ด์ List์ ๋ด์์ ๋ฐํํ๋ค. ๋งค๊ฐ๋ณ์์ ํ์ ์ด ๊ฐ๋ณ์ธ์๋ผ์ ๋ฐฐ์ด ์์ฑ์์ด ์ ์ฅํ ์์๋ค๋ง ๋์ดํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
List list = Arrays.asList(new Integer[]{1, 2, 3, 4, 5}); // [1, 2, 3, 4, 5]
List list = Arrays.asList(1, 2, 3, 4, 5); // [1, 2, 3, 4, 5]
list.add(6); // UnsupportedOperationException ์์ธ ๋ฐ์(์ฝ๊ธฐ ์ ์ฉ์)
โ๏ธย asList()๊ฐ ๋ฐํํ List์ ํฌ๊ธฐ๋ ๋ณ๊ฒฝํ ์ ์๋ค.
โ ์ถ๊ฐ, ์ญ์ ๋ถ๊ฐ๋ฅ, ์ ์ฅ๋ ๋ด์ฉ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ
๋ง์ผ ํฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ List๊ฐ ํ์ํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ๋ฉด ๋๋ค.
List list = new ArrayList(Arrays.asList(1, 2, 3, 4, 5)); // ์๋ก์ด ArrayList ์์ฑ, ๋ณ๊ฒฝ ๊ฐ๋ฅ
์์ 11-6
package chapter11; import java.util.*; class Ex11_6 { public static void main(String[] args) { int[] arr = {0,1,2,3,4}; int[][] arr2D = {{11,12,13}, {21,22,23}}; System.out.println("arr="+Arrays.toString(arr)); System.out.println("arr2D="+Arrays.deepToString(arr2D)); int[] arr2 = Arrays.copyOf(arr, arr.length); int[] arr3 = Arrays.copyOf(arr, 3); int[] arr4 = Arrays.copyOf(arr, 7); int[] arr5 = Arrays.copyOfRange(arr, 2, 4); int[] arr6 = Arrays.copyOfRange(arr, 0, 7); System.out.println("arr2="+Arrays.toString(arr2)); System.out.println("arr3="+Arrays.toString(arr3)); System.out.println("arr4="+Arrays.toString(arr4)); System.out.println("arr5="+Arrays.toString(arr5)); System.out.println("arr6="+Arrays.toString(arr6)); int[] arr7 = new int[5]; Arrays.fill(arr7, 9); // arr=[9,9,9,9,9] System.out.println("arr7="+Arrays.toString(arr7)); Arrays.setAll(arr7, i -> (int)(Math.random()*6)+1); System.out.println("arr7="+Arrays.toString(arr7)); for(int i : arr7) { char[] graph = new char[i]; Arrays.fill(graph, '*'); System.out.println(new String(graph)+i); } String[][] str2D = new String[][]{{"aaa","bbb"},{"AAA","BBB"}}; String[][] str2D2 = new String[][]{{"aaa","bbb"},{"AAA","BBB"}}; System.out.println(Arrays.equals(str2D, str2D2)); // false System.out.println(Arrays.deepEquals(str2D, str2D2)); // true char[] chArr = { 'A', 'D', 'C', 'B', 'E' }; System.out.println("chArr="+Arrays.toString(chArr)); System.out.println("index of B ="+Arrays.binarySearch(chArr, 'B')); System.out.println("= After sorting ="); Arrays.sort(chArr); System.out.println("chArr="+Arrays.toString(chArr)); System.out.println("index of B ="+Arrays.binarySearch(chArr, 'B')); } }
11-30 Comparator์ Comparable
- ๊ฐ์ฒด ์ ๋ ฌ์ ํ์ํ ๋ฉ์๋(์ ๋ ฌ๊ธฐ์ค ์ ๊ณต)๋ฅผ ์ ์ํ ์ธํฐํ์ด์ค
Comparable์ ๊ตฌํํ ํด๋์ค๋ ์ ๋ ฌ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ์๋ฏธํจ.
๐กComparable ๊ธฐ๋ณธ ์ ๋ ฌ๊ธฐ์ค์ ๊ตฌํํ๋๋ฐ ์ฌ์ฉ
Comparator ๊ธฐ๋ณธ ์ ๋ ฌ๊ธฐ์ค ์ธ์ ๋ค๋ฅธ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๊ณ ์ํ ๋ ์ฌ์ฉpublic interface Comparator { int compare(Object o1, Object o2); // o1, o2 ๋ ๊ฐ์ฒด๋ฅผ ๋น๊ต boolean equals(Obejct obj); // equals๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ๋ผ๋ ๋ป } public interface Comparable { int compareTo(Object o); // ์ฃผ์ด์ง ๊ฐ์ฒด(o)๋ฅผ ์์ ๊ณผ ๋น๊ต }
- compare()๊ณผ compareTo()๋ ๋ ๊ฐ์ฒด์ ๋น๊ต๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋๋ก ์์ฑ
๊ฐ์ผ๋ฉด 0, ์ค๋ฅธ์ชฝ์ด ํฌ๋ฉด ์์(-), ์์ผ๋ฉด ์์(+)
public final class Integer extends Number implements Comparable { ... public int compareTo(Integer anotherInteger) { int v1 = this.value; int v2 = anotherInteger.value; // ๊ฐ์ผ๋ฉด 0, ์ค๋ฅธ์ชฝ ๊ฐ์ด ํฌ๋ฉด -1, ์์ผ๋ฉด 1์ ๋ฐํ return (v1 < v2 ? -1 : (v1 == v2 ? 0 : 1)); } }
์์ 11-7
static void sort(Object[] a) // ๊ฐ์ฒด ๋ฐฐ์ด์ ์ ์ฅ๋ ๊ฐ์ฒด๊ฐ ๊ตฌํํ Comparable์ ์ํ ์ ๋ ฌ static void sort(Object[] a, Comparator c) // ์ง์ ํ Comparator์ ์ํ ์ ๋ ฌ
Arrays.sort()
๋ ๋ฐฐ์ด์ ์ ๋ ฌํ ๋,Comparator
๋ฅผ ์ง์ ํด์ฃผ์ง ์์ผ๋ฉด ์ ์ฅํ๋ ๊ฐ์ฒด(Comparable
์ ๊ตฌํํ ํด๋์ค์ ๊ฐ์ฒด)์ ๊ตฌํ๋ ๋ด์ฉ์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ค.์์ค์ฝ๋
import java.util.Arrays; import java.util.Comparator; public class Main { public static void main(String[] args) { String[] strArr = {"cat", "Dog", "tiger", "lion"}; System.out.println("strArr = " + Arrays.toString(strArr)); Arrays.sort(strArr); // String์ Comparable ๊ตฌํ์ ์ํ ์ ๋ ฌ System.out.println("strArr = " + Arrays.toString(strArr)); Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER); // ๋์๋ฌธ์ ๊ตฌ๋ถ์ํจ System.out.println("strArr = " + Arrays.toString(strArr)); Arrays.sort(strArr, new Descending()); System.out.println("strArr = " + Arrays.toString(strArr)); } // main } class Descending implements Comparator { @Override public int compare(Object o1, Object o2) { if( o1 instanceof Comparable && o2 instanceof Comparable ) { // Comparable๋ก ํ๋ณํ ๊ฐ๋ฅ ์ฌ๋ถ ์ฒดํฌ Comparable c1 = (Comparable) o1; Comparable c2 = (Comparable) o2; return c1.compareTo(c2) * -1; // -1์ ๊ณฑํด์ ๊ธฐ๋ณธ ์ ๋ ฌ๋ฐฉ์์ ์ญ์ผ๋ก ๋ณ๊ฒฝํ๋ค. // ๋๋ c2.compareTo(c1)์ ๊ฐ์ด ์์๋ฅผ ๋ฐ๊ฟ๋ ๋๋ค. } return -1; } }
11-32 Integer์ Comparable
Arrays.sort()์ ๊ฐ์ ๋ฉ์๋์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ด๋ฏธ ํ๋ฅญํ๊ฒ ์ ์์ฑ๋์ด ์์ผ๋ฏ๋ก, ์ฐ๋ฆฌ๊ฐ ํด์ผ ํ ์ผ์ ์๋์ ๊ฐ์ด compareTo()๋ฅผ ๊ตฌํํด์ ์ด๋ค ๋น๊ต๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ ์ง๋ง ์๋ ค์ฃผ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํ๋ค.
public final class Integer extends Number implements Comparable {
// ๊ธฐ๋ณธ ์ ๋ ฌ ๊ธฐ์ค(default - ์ ๋ ฌ ๊ธฐ์ค์ด ์์ ๋ ์ฌ์ฉ)
...
public int compareTo(Object o) {
return compareTo((Integer)o);
}
// Arrays.sort()์ ๊ฐ์ ๋ฉ์๋๊ฐ ์ ๋ ฌ์ ์ํํ๋ ๊ณผ์ ์์. compareTo()๋ฅผ ํธ์ถํ๋ค.
public int compareTo(Integer anotherInteger) {
int thisVal = this.value;
int anotherVal = anotherInteger.value;
// ๋น๊ตํ๋ ๊ฐ์ด ํฌ๋ฉด -1. ๊ฐ์ผ๋ฉด 0, ์์ผ๋ฉด 1์ ๋ฐํํ๋ค.
return (thisVal < anotherVal ? -1 : (thisVal == anotherVal ? 0 : 1));
// // ์ผ์ชฝ ๊ฐ์ด ํฌ๋ฉด ์์๋ฅผ, ๋ ๊ฐ์ด ๊ฐ์ผ๋ฉด 0, ์ผ์ชฝ ๊ฐ์ด ํฌ๋ฉด ์์๋ฅผ ๋ฐํํ๋ค.
// return thisVal - anotherVal; // ๋ด๋ฆผ์ฐจ์์ ๊ฒฝ์ฐ ๋ฐ๋๋ก ๋บ์
ํ๋ฉด ๋๋ค.
}
}
๐กย ๊ฐ๋จํ๊ฒ ๋บ์ ํ์ง ์๊ณ ๋ณต์กํ๊ฒ ์ผํญ์ฐ์ฐ์๋ฅผ ์ฐ๋ ์ด์ ?
์ผํญ์ฐ์ฐ์๊ฐ ์ฑ๋ฅ์ ์ ๋ฆฌํจ(์์ฃผ ์ฝ๊ฐ)

์์ 11-8 : 1~50 ์ฌ์ด์ ์ซ์ ์ค์์ 25๊ฐ๋ฅผ ๊ณจ๋ผ์ '5 x 5' ํฌ๊ธฐ์ ๋น๊ณ ํ์ ๋ง๋ ๋ค.
package chapter11; import java.util.HashSet; import java.util.Iterator; import java.util.Set; // 1~50 ์ฌ์ด์ ์ซ์ ์ค์์ 25๊ฐ๋ฅผ ๊ณจ๋ผ์ '5 x 5' ํฌ๊ธฐ์ ๋น๊ณ ํ์ ๋ง๋๋ ์์ public class Ex11_8 { public static void main(String[] args) { Set set = new HashSet(); // Set set = LinkedHashSet(); int[][] board = new int[5][5]; // 1~50 ์ฌ์ด์ ๋๋คํ ์ซ์๋ฅผ 25๊ฐ ๊ณจ๋ผ์ Set์ ๋ฃ์ด์ค๋ค. for (int i = 0; set.size() < 25; i++) { set.add((int)(Math.random() * 50) + 1 + ""); } Iterator it = set.iterator(); for (int i = 0; i < board.length; i++) { for (int j = 0; j < board[i].length; j++) { board[i][j] = Integer.parseInt((String)it.next()); System.out.print((board[i][j] < 10 ? " " : " ") + board[i][j]); } System.out.println(); } } }
11-34 HashSet - ์์X, ์ค๋ณตX
- Set ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๋ํ์ ์ธ ์ปฌ๋ ์ ํด๋์ค
- ์์๋ฅผ ์ ์งํ๋ ค๋ฉด, LinkedHashSet ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.

์์ฑ์ ๋๋ ๋ฉ์๋ | ์ค๋ช |
---|---|
HashSet() | HashSet ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. |
HashSet(Collection c) | ์ฃผ์ด์ง ์ปฌ๋ ์ ์ ํฌํจํ๋ HashSet ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. |
HashSet(int initialCapacity) | ์ฃผ์ด์ง ๊ฐ์ ์ด๊ธฐ์ฉ๋์ผ๋กํ๋ HashSet ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. |
HashSet(int initialCapacity, float loadFactor) | ์ด๊ธฐ์ฉ๋์ load factor๋ฅผ ์ง์ ํ๋ ์์ฑ์ |
boolean add(Object o) | ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ค.(์ฑ๊ณตํ๋ฉด true, ์คํจํ๋ฉด false) |
boolean addAll(Collection c) | ์ฃผ์ด์ง ์ปฌ๋ ์ ์ ์ ์ฅ๋ ๋ชจ๋ ๊ฐ์ฒด๋ค์ ์ถ๊ฐํ๋ค.(ํฉ์งํฉ) |
void clear() | ์ ์ฅ๋ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์ญ์ ํ๋ค. |
Object clone() | HashSet์ ๋ณต์ ํด์ ๋ฐํํ๋ค.(์์ ๋ณต์ฌ) |
boolean contains(Object o) | ์ง์ ๋ ๊ฐ์ฒด๋ฅผ ํฌํจํ๊ณ ์๋์ง ์๋ ค์ค๋ค. |
boolean containsAll(Collection c) | ์ฃผ์ด์ง ์ปฌ๋ ์ ์ ์ ์ฅ๋ ๋ชจ๋ ๊ฐ์ฒด๋ค์ ํฌํจํ๊ณ ์๋์ง ์๋ ค์ค๋ค. |
boolean isEmpty() | HashSet์ด ๋น์ด์๋์ง ์๋ ค์ค๋ค. |
Iterator iterator() | iterator๋ฅผ ๋ฐํํ๋ค. |
boolean remove(Obejct o) | ์ง์ ๋ ๊ฐ์ฒด๋ฅผ HashSet์์ ์ญ์ ํ๋ค.(์ฑ๊ณตํ๋ฉด true, ์คํจํ๋ฉด false) |
boolean removeAll(Collecton c) | ์ฃผ์ด์ง ์ปฌ๋ ์ ์์ ์ ์ฅ๋ ๋ชจ๋ ๊ฐ์ฒด์ ๋์ผํ ๊ฒ๋ค์ HashSet์์ ๋ชจ๋ ์ญ์ ํ๋ค.(์ฐจ์งํฉ) |
boolean retainAll(Collection c) | ์ฃผ์ด์ง ์ปฌ๋ ์ ์ ์ ์ฅ๋ ๊ฐ์ฒด์ ๋์ผํ ๊ฒ๋ง ๋จ๊ธฐ๊ณ ์ญ์ ํ๋ค.(๊ต์งํฉ) |
int size() | ์ ์ฅ๋ ๊ฐ์ฒด์ ๊ฐ์๋ฅผ ๋ฐํํ๋ค. |
Object[] toArray() | ์ ์ฅ๋ ๊ฐ์ฒด๋ค์ ๊ฐ์ฒด๋ฐฐ์ด์ ํํ๋ก ๋ฐํํ๋ค. |
Object[] toArray(Object[] a) | ์ง์ ๋ ๊ฐ์ฒด๋ค์ ์ฃผ์ด์ง ๊ฐ์ฒด๋ฐฐ์ด(a)์ ๋ด๋๋ค. |
+) load factor๋ ์ปฌ๋ ์ ํด๋์ค์ ์ ์ฅ๊ณต๊ฐ์ด ๊ฐ๋ ์ฐจ๊ธฐ ์ ์ ๋ฏธ๋ฆฌ ์ฉ๋์ ํ๋ณดํ๊ธฐ ์ํ ๊ฒ์ผ๋ก 0.8๋ก ์ง์ ํ๋ฉด, ์ ์ฅ๊ณต๊ฐ์ 80%๊ฐ ์ฑ์์ก์ ๋ ์ฉ๋์ด ๋ ๋ฐฐ๋ก ๋์ด๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 0.75, ์ฆ 75%์ด๋ค.
์์ 11-9
Object[] objArr = {"1",new Integer(1),"2","2","3","3","4","4","4"}; Set set = new HashSet(); for (int i = 0; i < objArr.length; i++) { System.out.println(objArr[i] + " = " + set.add(objArr[i])); } // HashSet์ ์ ์ฅ๋ ์์๋ค์ ์ถ๋ ฅํ๋ค. System.out.println(set); // HashSet์ ์ ์ฅ๋ ์์๋ค์ ์ถ๋ ฅํ๋ค.(Iterator ์ด์ฉ) Iterator it = set.iterator(); while (it.hasNext()) { // ์ฝ์ด์ฌ ์์๊ฐ ์๋์ง ํ์ธ System.out.println(it.next()); // ๋ค์ ์์๋ฅผ ์ถ๋ ฅํ๋ค. }
๊ฒฐ๊ณผ
<๊ฒฐ๊ณผ> 1=true 1=true 2=true 2=false 3=true 3=false 4=true 4=false 4=false [1, 1, 2, 3, 4] 1 1 2 3
HashSet์ ์ค๋ณต๋ ๊ฐ์ ์ ์ฅํ์ง ์๋๋ฐ, ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด 1์ด ๋ ๋ฒ ์ถ๋ ฅ๋์๋ค.
๋ ๋ค
โ1โ
๋ก ๋ณด์ด๊ธฐ ๋๋ฌธ์ ๊ตฌ๋ณ์ด ์ ๋์ง๋ง, ์ฌ์ค ํ๋๋String ์ธ์คํด์ค
์ด๊ณ ๋ค๋ฅธ ํ๋๋Integer ์ธ์คํด์ค
๋ก ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด์ด๋ฏ๋ก ์ค๋ณต์ผ๋ก ๊ฐ์ฃผํ์ง ์๋๋ค.+) ์ค๋ณต์ ์ ๊ฑฐํ๋ ๋์์ ์ ์ฅํ ์์๋ฅผ ์ ์งํ๊ณ ์ถ๋ค๋ฉด
LinkedHashSet
์ ์ฌ์ฉํ๋ฉด ๋๋ค.
์์ 11-10 : ๋ก๋๋ฒํธ
์ค๋ณต๋ ๊ฐ์ ์ ์ฅ๋์ง ์๋ HashSet์ ์ฑ์ง์ ์ด์ฉํด์ ๋ก๋๋ฒํธ๋ฅผ ๋ง๋๋ ์์ .
๋ช ๋ฒ ์คํํด๋ณด๋ฉด ๊ฐ์ ์ซ์๊ฐ ๋น์ทํ ์์น์ ๋์จ๋ค๋ ์ฌ์ค์ ๋ฐ๊ฒฌํ ์ ์๋ค. HashSet์ ์ ์ฅ๋ ์์๋ฅผ ๋ณด์ฅํ์ง ์๊ณ ์์ฒด์ ์ธ ์ ์ฅ๋ฐฉ์์ ๋ฐ๋ผ ์์๊ฐ ๊ฒฐ์ก๋๊ธฐ ๋๋ฌธ์ ์ด ๊ฒฝ์ฐ์๋ LinkedHashSet์ด ๋ ๋์ ์ ํ์ด๋ค.
Set set = new HashSet(); // Set set = new LinkedHashSet(); for (int i = 0; set.size() < 6; i++) { int num = (int)(Math.random() * 45) + 1; // set.add(new Integer(num)); set.add(num); } System.out.println(set); // set์ ์ ๋ ฌ๋ถ๊ฐ why? set์ ์์ ์ ์ง๋ฅผ ์ ํ๊ธฐ ๋๋ฌธ List list = new LinkedList(set); // LinkedList(Collection c) / 1. set์ ๋ชจ๋ ์์๋ฅผ List(LinkedList)์ ์ ์ฅ Collections.sort(list); // Collections.sort(List list) / 2. list๋ฅผ ์ ๋ ฌ System.out.println(list); // 3. list๋ฅผ ์ถ๋ ฅ
11-37 HashSet - ์์ 3
- HashSet์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๊ธฐ ์ ์ ๊ธฐ์กด์ ๊ฐ์ ๊ฐ์ฒด๊ฐ ์๋์ง ํ์ธํ๋ค.
๊ฐ์ ๊ฐ์ฒด๊ฐ ์์ผ๋ฉด ์ ์ฅํ๊ณ , ์์ผ๋ฉด ์ ์ฅํ์ง ์๋๋ค.
- boolean add(Obejct o)๋ ๊ธฐ์กด์ ์ ์ฅ๋ ์์์ ๊ฐ์ ๊ฒ์ธ์ง ํ๋ณํ๊ธฐ ์ํด ์ถ๊ฐํ๋ ค๋ ์์์
equals()
์hashCode()
๋ฅผ ํธ์ถํ๋ค.๊ทธ๋์ equals()์ hashCode()๊ฐ ์ค๋ฒ๋ผ์ด๋ฉ ๋์ด ์์ด์ผ ํ๋ค.
์์ 11-11
package chapter11; import java.util.HashSet; import java.util.Objects; public class Ex11_11 { public static void main(String[] args) { HashSet set = new HashSet(); /* * HashSet์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๊ธฐ ์ ์ ๊ธฐ์กด์ ๊ฐ์ ๊ฐ์ฒด๊ฐ ์๋์ง ํ์ธํ๋ค. * ๊ฐ์ ๊ฐ์ฒด๊ฐ ์์ผ๋ฉด ์ ์ฅํ๊ณ , ์์ผ๋ฉด ์ ์ฅํ์ง ์๋๋ค. * * boolean add(Object o)๋ ์ ์ฅํ ๊ฐ์ฒด์ equals()์ hashCode()๋ฅผ ํธ์ถํด ๊ฐ์ ๊ฐ์ฒด๊ฐ ์๋์ง ๊ฒ์ฌํจ. * ๊ทธ๋์ ์ ์ฅํ๋ ๊ฐ์ฒด๊ฐ equals()์ hashCode()๊ฐ ์ค๋ฒ๋ผ์ด๋ฉ ๋์ด์์ด์ผํจ. */ set.add("abc"); set.add("abc"); set.add(new Person("Ann", 21)); set.add(new Person("Ann", 21)); System.out.println(set); } } class Person { String name; int age; Person(String name, int age) { this.name = name; this.age = age; } public String toString() { return name + ":" + age; } public boolean equals(Object obj) { if(!(obj instanceof Person)) return false; Person p = (Person) obj; return name.equals(p.name) && age == p.age; } public int hashCode() { return Objects.hash(name, age); } }
์์ 11-12
package chapter11; import java.util.HashSet; import java.util.Iterator; public class Ex11_12 { public static void main(String[] args) { HashSet setA = new HashSet(); HashSet setB = new HashSet(); HashSet setHab = new HashSet(); HashSet setKyo = new HashSet(); HashSet setCha = new HashSet(); setA.add("1"); setA.add("2"); setA.add("3"); setA.add("4"); setA.add("5"); System.out.println("A = " + setA); setB.add("4"); setB.add("5"); setB.add("6"); setB.add("7"); setB.add("8"); System.out.println("B = " + setB); Iterator it = setB.iterator(); while (it.hasNext()) { Object tmp = it.next(); if (setA.contains(tmp)) { setKyo.add(tmp); } } it = setA.iterator(); while (it.hasNext()) { Object tmp = it.next(); if(!setB.contains(tmp)) { setCha.add(tmp); } } it = setA.iterator(); while(it.hasNext()) { setHab.add(it.next()); } it = setB.iterator(); while(it.hasNext()) { setHab.add(it.next()); } System.out.println("A โฉ B = " + setKyo); // ๊ต์งํฉ System.out.println("A โช B = " + setHab); // ํฉ์งํฉ System.out.println("A - B = " + setCha); // ์ฐจ์งํฉ } }
11-39 TreeSet - ๋ฒ์ ํ์, ์ ๋ ฌ
- ์ด์ง ํ์ ํธ๋ฆฌ(binary search tree)๋ผ๋ ์๋ฃ๊ตฌ์กฐ์ ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ
- ์ ๋ ฌ, ๊ฒ์, ๋ฒ์ ๊ฒ์์ ์ ๋ฆฌ๋ฆฌ
- ์ด์ง ํธ๋ฆฌ๋ ๋ชจ๋ ๋ ธ๋๊ฐ ์ต๋ 2๊ฐ์ ํ์ ๋ ธ๋๋ฅผ ๊ฐ์
- ๊ฐ ์์(node)๊ฐ ๋๋ฌด(tree)ํํ๋ก ์ฐ๊ฒฐ(LinkedList์ ๋ณํ)

11-40 ์ด์ง ํ์ ํธ๋ฆฌ(binary search tree)
- ๋ชจ๋ ๋ ธ๋๋ ์ต๋ ๋ ๊ฐ์ ์์๋ ธ๋๋ฅผ ๊ฐ์ง ์ ์๋ค.
- ์ผ์ชฝ ์์๋ ธ๋์ ๊ฐ์ ๋ถ๋ชจ๋ ธ๋์ ๊ฐ๋ณด๋ค ์๊ณ ์ค๋ฅธ์ชฝ ์์๋ ธ๋์ ๊ฐ์ ๋ถ๋ชจ๋ ธ๋์ ๊ฐ๋ณด๋ค ์ปค์ผ ํ๋ค.
- ๋ ธ๋์ ์ถ๊ฐ ์ญ์ ์ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.(์์ฐจ์ ์ผ๋ก ์ ์ฅํ์ง ์์ผ๋ฏ๋ก)
- ๊ฒ์(๋ฒ์๊ฒ์)๊ณผ ์ ๋ ฌ์ ์ ๋ฆฌํ๋ค.
- ์ค๋ณต๋ ๊ฐ์ ์ ์ฅํ์ง ๋ชปํ๋ค.
- ๋ฐ์ดํฐ๊ฐ ๋ง์์ง ์๋ก ์ถ๊ฐ, ์ญ์ ์ ์๊ฐ์ด ๋ ๊ฑธ๋ฆผ(๋น๊ต ํ์ ์ฆ๊ฐ)

11-41 TreeSet - ๋ฐ์ดํฐ ์ ์ฅ๊ณผ์ boolean add(Obejct o)
- TreeSet์ 7,4,9,1,5์ ์์๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ฉด, ์๋์ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
(๋ฃจํธ๋ถํฐ ํธ๋ฆฌ๋ฅผ ๋ฐ๋ผ ๋ด๋ ค๊ฐ๋ฉฐ ๊ฐ์ ๋น๊ต. ์์ผ๋ฉด ์ผ์ชฝ, ํฌ๋ฉด ์ค๋ฅธ์ชฝ์ ์ ์ฅ)
11-42 TreeSet - ์ฃผ์ ์์ฑ์์ ๋ฉ์๋
์์ฑ์ ๋๋ ๋ฉ์๋ | ์ค๋ช |
---|---|
TreeSet() | ๊ธฐ๋ณธ ์์ฑ์ |
TreeSet(Collection c) | ์ฃผ์ด์ง ์ปฌ๋ ์ ์ ์ ์ฅํ๋ TreeSet์ ์์ฑ |
TreeSet(Comparator comp) | ์ฃผ์ด์ง ์ ๋ ฌ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ TreeSet์ ์์ฑ |
Object first() | ์ ๋ ฌ๋ ์์์์ ์ฒซ ๋ฒ์งธ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. |
Obejct last() | ์ ๋ ฌ๋ ์์์์ ๋ง์ง๋ง ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. |
Object ceiling(Object o) | ์ง์ ๋ ๊ฐ์ฒด์ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ฐํ, ์์ผ๋ฉด ํฐ ๊ฐ์ ๊ฐ์ง ๊ฐ์ฒด ์ค ์ ์ผ ๊ฐ๊น์ด ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ฐํ. ์์ผ๋ฉด null |
Object floor(Object o) | ์ง์ ๋ ๊ฐ์ฒด์ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ฐํ, ์์ผ๋ฉด ์์ ๊ฐ์ ๊ฐ์ง ๊ฐ์ฒด ์ค ์ ์ผ ๊ฐ๊น์ด ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ฐํ. ์์ผ๋ฉด null |
Object higher(Obejct o) | ์ง์ ๋ ๊ฐ์ฒด๋ณด๋ค ํฐ ๊ฐ์ ๊ฐ์ง ๊ฐ์ฒด ์ค ์ ์ผ ๊ฐ๊น์ด ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ฐํ. ์์ผ๋ฉด null |
Object lower(Obejct o) | ์ง์ ๋ ๊ฐ์ฒด๋ณด๋ค ์์ ๊ฐ์ ๊ฐ์ง ๊ฐ์ฒด ์ค ์ ์ผ ๊ฐ๊น์ด ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ฐํ. ์์ผ๋ฉด null |
SortedSet subSet(Object fromElement, Object toElement) | ๋ฒ์ ๊ฒ์(fromElement์ toElement)์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.(๋ ๋ฒ์์ธ toElement๋ ๋ฒ์์ ํฌํจ๋์ง ์์) |
SortedSet headSet(Object toElement) | ์ง์ ๋ ๊ฐ์ฒด๋ณด๋ค ์์ ๊ฐ์ ๊ฐ์ฒด๋ค์ ๋ฐํํ๋ค. |
SortedSet tailSet(Object fromElement) | ์ง์ ๋ ๊ฐ์ฒด๋ณด๋ค ํฐ ๊ฐ์ ๊ฐ์ฒด๋ค์ ๋ฐํํ๋ค. |
์์ 11-13
Set set = new TreeSet(); // ๋ฒ์ ๊ฒ์, ์ ๋ ฌ. ์ ๋ ฌํ์์์ // Set set = new HashSet(); // ์ ๋ ฌ ํ์ for (int i = 0; set.size() < 6; i++) { int num = (int)(Math.random() * 45) + 1; // 1 ~ 45๊น์ง์ ๋๋คํ ์ซ์๋ฅผ ๊ฐ์ ธ์จ๋ค. set.add(num); // set.add(new Integer(num)); } System.out.println(set);
TreeSet์ ๋น๊ต๊ธฐ์ค์ด ๊ผญ ํ์ํ๋ค.
์ ์ฅํ๋ ๊ฐ์ฒด๊ฐ Comparable์ ๊ฐ์ง๊ณ ์๋๊ฐ, TreeSet์ด Comparator๋ฅผ ๊ฐ์ง๊ณ ์๋์ง ๋ ์ค์ ํ๋๋ฅผ ํด์ผํ๋ค.
์์ 11-14
TreeSet set = new TreeSet(); String from = "b"; String to = "d"; set.add("abc"); set.add("alien"); set.add("bat"); set.add("car"); set.add("Car"); set.add("disc"); set.add("dance"); set.add("dZZZZ"); set.add("dzzzz"); set.add("elephant"); set.add("elevator"); set.add("fan"); set.add("flower"); System.out.println(set); System.out.println("range search : from " + from + " to " + to); System.out.println("result1 : " + set.subSet(from, to)); System.out.println("result1 : " + set.subSet(from, "dpp")); System.out.println("result1 : " + set.subSet(from, "d333")); System.out.println("result1 : " + set.subSet(from, "dc"));
์์ 11-15
TreeSet set = new TreeSet(); // Set set = new TreeSet(); // headSet, tailSet, subSet์ TreeSet์ ๋ฉ์๋์ด๊ธฐ ๋๋ฌธ์ ์ฐธ์กฐ๋ณ์์ ํ์ ์ Set์ผ๋ก ๋ณ๊ฒฝํ๋ฉด ์ ๋๋ค. int[] score = {80, 95, 50, 35, 45, 65, 10, 100}; for (int i = 0; i < score.length; i++) { set.add(new Integer(score[i])); } System.out.println("50๋ณด๋ค ์์ ๊ฐ : " + set.headSet(50)); System.out.println("50๋ณด๋ค ํฐ ๊ฐ : " + set.tailSet(50)); System.out.println("40๊ณผ 80์ฌ์ด์ ๊ฐ : " + set.subSet(50, 80));
11-45 TreeSet - ์์ 3 ๋ฒ์๊ฒ์ subSet(), headSet(), tailSet()
TreeSet์ ๋ฒ์๊ฒ์์ ์ ๋ฆฌํ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
๋ฉ์๋ | ์ค๋ช |
---|---|
SortedSet subSet(Object fromElement, Object toElement) | ๋ฒ์ ๊ฒ์(fromElement์ toElement)์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.(๋ ๋ฒ์์ธ toElement๋ ๋ฒ์์ ํฌํจ๋์ง ์์) |
SortedSet headSet(Object toElement) | ์ง์ ๋ ๊ฐ์ฒด๋ณด๋ค ์์ ๊ฐ์ ๊ฐ์ฒด๋ค์ ๋ฐํํ๋ค. |
SortedSet tailSet(Object fromElement) | ์ง์ ๋ ๊ฐ์ฒด๋ณด๋ค ํฐ ๊ฐ์ ๊ฐ์ฒด๋ค์ ๋ฐํํ๋ค. |

ํธ๋ฆฌ ์ํ(tree traversal)
- ์ด์ง ํธ๋ฆฌ์ ๋ชจ๋ ๋ ธ๋๋ฅผ ํ๋ฒ์ฉ ์ฝ๋ ๊ฒ์ ํธ๋ฆฌ ์ํ๋ผ๊ณ ํ๋ค
- ์ ์, ์ค์ ํ์ ์ํ๋ฒ์ด ์์ผ๋ฉฐ, ์ค์ ์ํํ๋ฉด ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋๋ค.
์ ์์์(preorder)
๋ถ๋ชจ๋ฅผ ๋จผ์ ์ฝ์

ํ์์ํ(postorder)
๋ถ๋ชจ๋ฅผ ๋์ค์ ์ฝ์

์ค์์ํ(inorder)
๋ถ๋ชจ๋ฅผ ๊ฐ์ด๋ฐ์ ๋ฃ์

๋ ๋ฒจ์ํ

11-46 HashMap๊ณผ Hashtable - ์์X, ์ค๋ณต(ํคX, ๊ฐO)
- Map ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํ. ๋ฐ์ดํฐ๋ฅผ ํค(key)์ ๊ฐ(value)์ ์์ผ๋ก ์ ์ฅ
- HashMap(๋๊ธฐํX)์ Hashtable(๋๊ธฐํO)์ ์ ๋ฒ์

key - value ํํ์ ๊ฐ์ด ํ์ํ๋ฉด HashMap
HashMap
- Map ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๋ํ์ ์ธ ์ปฌ๋ ์ ํด๋์ค
- ์์๋ฅผ ์ ์งํ๋ ค๋ฉด, LinkedHashMap ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
TreeMap
- ๋ฒ์ ๊ฒ์๊ณผ ์ ๋ ฌ์ ์ ๋ฆฌํ ์ปฌ๋ ์ ํด๋์ค
- HashMap๋ณด๋ค ๋ฐ์ดํฐ ์ถ๊ฐ, ์ญ์ ์ ์๊ฐ์ด ๋ ๊ฑธ๋ฆผ
+) TreeSet์ TreeMap์ ๊ฐ์ง๊ณ ๋ง๋ ๊ฒ, key-value ํํ๋ก ์ ์ฅํ๋ ๊ฒ๋ง ์ ์ธํ๋ฉด ๋ ํด๋์ค๋ ๋์ผํ๋ค.
11-47 HashMap์ ํค(key)์ ๊ฐ(value)
- ํด์ฑ(hashing)๊ธฐ๋ฒ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ. ๋ฐ์ดํฐ๊ฐ ๋ง์๋ ๊ฒ์์ด ๋น ๋ฅด๋ค.
- Map ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํ. ๋ฐ์ดํฐ๋ฅผ ํค์ ๊ฐ์ ์์ผ๋ก ์ ์ฅ
๊ฐ(value) ํค(key)์ ๋ฌ๋ฆฌ ๋ฐ์ดํฐ์ ์ค๋ณต์ ํ์ฉํ๋ค.
HashMap map = new HashMap();
map.put("myId", "1234");
map.put("asdf", "1111");
map.put("asdf", "1234");
// HashMap์ ์ค์ ์์ค
public class HashMap extends AbstractMap
implements Map, Cloneable, Serializable {
transient Entry[] table;
...
static class Entry implements Map.Entry {
final Object key;
Object value;
...
}
}
HashMap์ Map์ ๊ตฌํํ์ผ๋ฏ๋ก Map์ ํน์ง, ํค(key)
์ ๊ฐ(value)
์ ๋ฌถ์ด์ ํ๋์ ๋ฐ์ดํฐ(entry)
๋ก ์ ์ฅํ๋ค๋ ํน์ง์ ๊ฐ๋๋ค.
๋น๊ฐ์ฒด์งํฅ์ ์ธ ์ฝ๋ | ๊ฐ์ฒด์งํฅ์ ์ธ ์ฝ๋ |
---|---|
Object[] key; Object[] value; | Entry[] table; class Entry { Object key; Object value; } |
HashMap์ Entry๋ผ๋ ๋ด๋ถ ํด๋์ค๋ฅผ ์ ์ํ๊ณ , ๋ค์ Entry ํ์ ์ ๋ฐฐ์ด์ ์ ์ธํ๊ณ ์๋ค. ํค(key)์ ๊ฐ(value)์ ๋ณ๊ฐ์ ๊ฐ์ด ์๋๋ผ ์๋ก ๊ด๋ จ๋ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ๊ฐ์ ๋ฐฐ์ด๋ก ์ ์ธํ๊ธฐ ๋ณด๋ค๋ ํ๋์ ํด๋์ค๋ก ์ ์ํด์ ํ๋์ ๋ฐฐ์ด๋ก ๋ค๋ฃจ๋ ๊ฒ์ด ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ(integrity)์ ์ธ ์ธก๋ฉด์์ ๋ ๋ฐ๋์งํ๊ธฐ ๋๋ฌธ์ด๋ค.
ํด์ฑ(hashing) - (1/3) ํ์์ ๋ณด๊ด๋ฆฌ

ํด์ํจ์(hash function)
ํด์ํจ์์ key๊ฐ์ ๋ฃ์ผ๋ฉด ํด์ฌ์ฝ๋๋ฅผ ๋ฐํํ๋ค.
์ฌ๊ธฐ์ ์ด ํด์ฌ์ฝ๋๊ฐ ๋ฐฐ์ด์ index(์ ์ฅ์์น)
์์ ํ์์ ๋ณด๊ฐ ๋ค์ด์๋ ์บ๋น๋ท์์ ์ ์ฅ๋ ์๋์ด ๋ช ๋ฒ์งธ ์นธ์ ์๋์ง ์๋ ค์ฃผ๋ ๊ฒ์ด๋ค.
์ฆ ํด๋น ํค๊ฐ ์ ์ฅ๋์ด์๋ ์์น๋ฅผ ์ฝ๊ฒ ์ฐพ์ ์ ์๋ค.

ํด์ฑ(hashing) - (2/3)
- ์ ์ : ํด์ํจ์(hash function)๋ก ํด์ํ ์ด๋ธ(hash table)์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ, ๊ฒ์(์ฝ์ด์ค๊ธฐ)

- ํด์ํ
์ด๋ธ์ ๋ฐฐ์ด๊ณผ ๋งํฌ๋ ๋ฆฌ์คํธ๊ฐ ์กฐํฉ๋ ํํ(์ฅ์ ๋ง ๊ฐ์ ธ์๋ค.)
๊ธธ์ด๊ฐ ๊ฐ๋ณ์ ์ธ 2์ฐจ์ ๋ฐฐ์ด์ด๋ผ table์ด๋ผ๊ณ ํ๋ ๊ฑฐ์
๋งํฌ๋ ๋ฆฌ์คํธ๋ก๋ง ๋ง๋ค๋ฉด ๋ฐ์ดํฐ ๊ฒ์์ ์๊ฐ์ด ์ค๋๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋ถ๋ฅํด์ ๋ฌถ์ด๋ ๊ฒ์ด๋ค. ํด์ํจ์์ ๊ฒฐ๊ณผ์ธ ๋ฐฐ์ด์ index๋ก ํ๋ฒ์ ์ฐพ์๊ฐ๊ณ , ๊ทธ ์์ ๋ค์ด๊ฐ์๋ถํด ๊ฒ์ ์๋๊ฐ ๋๋ฆฌ์ง๋ง ๋ณ๊ฒฝ์ ์ ๋ฆฌํจ์ผ๋ก ๋งํฌ๋๋ฆฌ์คํธ๋ก ๊ตฌํ
why ๋งํฌ๋ ๋ฆฌ์คํธ? โ ๋ณ๊ฒฝ์ด ์ฌ์
why ๋ฐฐ์ด? โ ์ ๊ทผ์ฑ์ด ์ข์(index๋ง ์๋ฉด ํ๋ฒ์ ์ฐพ์๊ฐ ์ ์๋ค.)
Objects.hash() ๋ฉ์๋๋ฅผ ์ด์ฉํด ํด์ํจ์๋ฅผ ์์ฑํ๋ฉด๋ ๋ค
Objects.hash()๋ฅผ ์ด์ฉํด hashCode()๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ..?
โ ???? ๋จผ์??
ํด์ฑ์ ํด์ํจ์๋ฅผ ์ด์ฉํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํจ์์ ์ฑ๋ฅ์ด ์ค์ํ๋ฐ, Objects.hash() ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ์์ฑํ๋ฉด ๋๋ค..???
ํด์ฑ์ ์ฌ์ฉํ๋ ํด๋์ค๋ค
HashTable
HashMap
HashSet
โ hashCode()๋ฉ์๋๋ฅผ ์ฌ์ฉํจ
์ด ๋ฉ์๋๋ฅผ Objects.hash()๋ฅผ ์ด์ฉํด hashCode()๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ๋ค.
ํด์ฑ(hashing) - (3/3)
ํด์ํ ์ด๋ธ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ณผ์

โ ํค๋ก ํด์ํจ์๋ฅผ ํธ์ถํด์ ํด์์ฝ๋๋ฅผ ์ป๋๋ค.
โก ํด์์ฝ๋(ํด์ํจ์์ ๋ฐํ๊ฐ)์ ๋์ํ๋ ๋งํฌ๋๋ฆฌ์คํธ๋ฅผ ๋ฐฐ์ด์์ ์ฐพ๋๋ค.
โข ๋งํฌ๋๋ฆฌ์คํธ์์ ํค์ ์ผ์นํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋๋ค.
โป ํด์ํจ์๋ ๊ฐ์ ํค์ ๋ํด ํญ์ ๊ฐ์ ํด์์ฝ๋๋ฅผ ๋ฐํํด์ผ ํ๋ค.
์๋ก ๋ค๋ฅธ ํค์ผ์ง๋ผ๋ ๊ฐ์ ๊ฐ์ ํด์์ฝ๋๋ฅผ ๋ฐํํ ์๋ ์๋ค.
11-48 HashMap - ์ฃผ์ ๋ฉ์๋
- HashMap์ ํด์ ํ ๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค.(๋ฐฐ์ด + ๋งํฌ๋ ๋ฆฌ์คํธ)
์์ฑ์ / ๋ฉ์๋ | ์ค๋ช |
---|---|
HashMap() | HashMap ๊ฐ์ฒด๋ฅผ ์์ฑ |
HashMap(int initialCapacity) | ์ง์ ๋ ๊ฐ์ ์ด๊ธฐ์ฉ๋์ผ๋ก ํ๋ HashMap ๊ฐ์ฒด๋ฅผ ์์ฑ |
HashMap(int initialCapacity, float loadFactor) | ์ง์ ๋ ์ด๊ธฐ์ฉ๋๊ณผ load factor์ HashMap ๊ฐ์ฒด๋ฅผ ์์ฑ |
HashMap(Map m) | ์ง์ ๋ Map์ ๋ชจ๋ ์์๋ฅผ ํฌํจํ๋ HashMap์ ์์ฑ |
void clear() | HashMap์ ์ ์ฅ๋ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐ |
Object clone() | ํ์ฌ HashMap์ ๋ณต์ ํด์ ๋ฐํ |
boolean containsKey(Object key) | HashMap์ ์ง์ ๋ ๊ฐ(value)์ด ํฌํจ๋์ด์๋์ง ์๋ ค์ค๋ค. (ํฌํจ๋์ด ์์ผ๋ฉด true) |
boolean containsValue(Object value) | HashMap์ ์ง์ ๋ ๊ฐ(value)์ด ํฌํจ๋์ด์๋์ง ์๋ ค์ค๋ค. (ํฌํจ๋์ด ์์ผ๋ฉด true) |
Set entrySet() | HashMap์ ์ ์ฅ๋ ํค์ ๊ฐ์ ์ํธ๋ฆฌ(ํค์ ๊ฐ์ ๊ฒฐํฉ)์ ํํ๋ก Set์ ์ ์ฅํด์ ๋ฐํ |
Object get(Object key) | ์ง์ ๋ ํค(key)์ ๊ฐ(๊ฐ์ฒด)์ ๋ฐํ. ๋ชป์ฐพ์ผ๋ฉด null ๋ฐํ |
Object getOrDefault(Object key, Object defaultValue) | ์ง์ ๋ ํค(key)์ ๊ฐ(๊ฐ์ฒด)์ ๋ฐํํ๋ค. ํค๋ฅผ ๋ชป์ฐพ์ผ๋ฉด, ๊ธฐ๋ณธ๊ฐ(defaultValue)์ผ๋ก ์ง์ ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํ |
boolean is Empty() | HashMap์ด ๋น์ด์๋์ง ์๋ ค์ค๋ค. |
Set keySet() | HashMap์ ์ ์ฅ๋ ๋ชจ๋ ํค๊ฐ ์ ์ฅ๋ Set์ ๋ฐํ |
Object put(Object key, Object value) | ์ง์ ๋ ํค์ ๊ฐ์ HashMap์ ์ ์ฅ |
void putAll(Map m) | Map์ ์ ์ฅ๋ ๋ชจ๋ ์์๋ฅผ HashMap์ ์ ์ฅ |
Object remove(Object key) | HashMap์์ ์ง์ ๋ ํค๋ก ์ ์ฅ๋ ๊ฐ(๊ฐ์ฒด)์ ์ ๊ฑฐ |
Object replace(Object key, Object value) | ์ง์ ๋ ํค์ ๊ฐ์ ์ง์ ๋ ๊ฐ์ฒด(value)๋ก ๋์ฒด |
boolean replace(Object key, Object oldValue, Object newValue) | ์ง์ ๋ ํค์ ๊ฐ์ฒด(oldValue)๊ฐ ๋ชจ๋ ์ผ์นํ๋ ๊ฒฝ์ฐ์๋ง ์๋ก์ด ๊ฐ์ฒด(newValue)๋ก ๋์ฒด |
int size() | HashMap์ ์ ์ฅ๋ ์์์ ๊ฐ์๋ฅผ ๋ฐํ |
Collection values() | HashMap์ ์ ์ฅ๋ ๋ชจ๋ ๊ฐ์ ์ปฌ๋ ์ ์ ํํ๋ก ๋ฐํ |
์์ 11-16
import java.util.HashMap; import java.util.Scanner; public class Main { public static void main(String[] args) { HashMap map = new HashMap(); map.put("myId", "1234"); // id = myId, pw = 1234 map.put("asdf", "1111"); map.put("asdf", "1234"); Scanner s = new Scanner(System.in); while (true) { System.out.println("id์ password๋ฅผ ์ ๋ ฅํด์ฃผ์ธ์."); System.out.print("id : "); // id๋ฅผ ๊ณต๋ฐฑ์ ๊ฑฐํด String์ผ๋ก ์ ๋ ฅ๋ฐ๋๋ค. String id = s.nextLine().trim(); System.out.print("pw : "); // pw๋ฅผ ๊ณต๋ฐฑ์ ๊ฑฐํด String์ผ๋ก ์ ๋ ฅ๋ฐ๋๋ค. String password = s.nextLine().trim(); System.out.println(); if (!map.containsKey(id)) { // ์ ๋ ฅํ id๊ฐ ์กด์ฌํ๋์ง ๊ฒ์ฆ System.out.println("์ ๋ ฅํ์ id๋ ์กด์ฌํ์ง ์์ต๋๋ค." + " ๋ค์ ์ ๋ ฅํด์ฃผ์ธ์."); continue; } else { if (map.get(id).equals(password)) { // ์ ๋ ฅํ id์ pw๊ฐ ์ผ์นํ๋์ง ๊ฒ์ฆ System.out.println("id์ ๋น๋ฐ๋ฒํธ๊ฐ ์ผ์นํฉ๋๋ค."); break; } else { System.out.println("๋น๋ฐ๋ฒํธ๊ฐ ์ผ์นํ์ง ์์ต๋๋ค. ๋ค์ ์ ๋ ฅํด์ฃผ์ธ์."); } } } } }
์์ 11-17
import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class Main { public static void main(String[] args) { HashMap map = new HashMap(); map.put("๊น์๋ฐ", new Integer(90)); map.put("๊น์๋ฐ", new Integer(100)); map.put("์ด์๋ฐ", new Integer(100)); map.put("๊ฐ์๋ฐ", new Integer(80)); map.put("์์๋ฐ", new Integer(90)); System.out.println(map); System.out.println("####################"); // HashMap์ Collection์ ์์์ด ์๋๊ธฐ ๋๋ฌธ์ iterator ๋ฉ์๋ ์์ Set set = map.entrySet(); // HashMap์ ์ ์ฅ๋ ํค์ ๊ฐ์ ์ํธ๋ฆฌ(ํค์ ๊ฐ์ ๊ฒฐํฉ)์ ํํ๋ก Set์ ์ ์ฅํด์ ๋ฐํ Iterator it = set.iterator(); while (it.hasNext()) { // ์ฝ์ด์ฌ ๋ค์ ์์๊ฐ ์๋์ง ํ์ธ Map.Entry e = (Map.Entry) it.next(); // ๋ค์ ์์๋ฅผ ๊ฐ์ ธ์จ๋ค. System.out.println("์ด๋ฆ : " + e.getKey() + ", ์ ์ : " + e.getValue()); } set = map.keySet(); // map์ key๋ค๋ง ๊ฐ์ ธ์จ๋ค. System.out.println("์ฐธ๊ฐ์ ๋ช ๋จ : " + set); Collection values = map.values(); // map์ value๋ค๋ง ๊ฐ์ ธ์จ๋ค. it = values.iterator(); System.out.println("#### values ####" + values); System.out.println("#### ํด๋์ค ####" + values.getClass().getName()); int total = 0; while (it.hasNext()) { int i = (int) it.next(); total += i; } System.out.println("์ด์ : " + total); System.out.println("ํ๊ท : " + (float) total/set.size()); // Comparable์ ๊ตฌํํ ํด๋์ค์ ๊ฐ์ฒด๋ง ์ธ์๋ก ๋ฃ์ ์ ์๋ค. System.out.println("์ต๊ณ ์ ์ : " + Collections.max(values)); System.out.println("์ต์ ์ ์ : " + Collections.min(values)); // } }
์์ 11-18
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; public class Main { public static void main(String[] args) { String[] data = { "A","K","A","K","D","K","A","K","K","K","Z","D" }; HashMap map = new HashMap(); for (int i = 0; i < data.length; i++) { if (map.containsKey(data[i])) { // map์ data์ i๋ฒ์งธ์ ์๋ ๊ฐ์ด ์กด์ฌํ๋ฉด int value = (int) map.get(data[i]); // map์์ key = data[i]์ ํด๋นํ๋ value๋ฅผ ๊ฐ์ ธ์จ๋ค. map.put(data[i], value + 1); // key = data[i]์ value๊ฐ์ 1 ์ฆ๊ฐ์ํจ๋ค. // map์ data์ i๋ฒ์งธ์ ์๋ ๊ฐ์ด ์กด์ฌํ์ง ์์ผ๋ฉด } else { map.put(data[i], 1); // map์ key = data[i], value๋ 1๋ก ๊ฐ์ ๋ฃ๋๋ค. } } Iterator it = map.entrySet().iterator(); // map์์ ๋ฐ์ดํฐ๋ฅผ entry(key, value ํ์) ํํ๋ก ๊ฐ์ ธ์จ ํ iterator๋ฅผ ๋ฐํํ๋ค. while (it.hasNext()) { // ์ฝ์ด์ฌ ์์๊ฐ ์๋์ง ํ์ธํ๋ค. Map.Entry entry = (Map.Entry) it.next(); // ๋ค์ ์์๋ฅผ ๊ฐ์ ธ์จ๋ค. int value = (int) entry.getValue(); // entry์์ value๋ฅผ ๊ฐ์ ธ์จ๋ค. System.out.println(entry.getKey() + " : " + printBar('#', value)); } } // value์ ์๋งํผ ๋ฌธ์ ch๋ฅผ ๋ฐํํ๋ ๋ฉ์๋ public static String printBar(char ch, int value) { char[] bar = new char[value]; // length value ๋งํผ์ char๋ฐฐ์ด ์์ฑ for (int i = 0; i < bar.length; i++) { bar[i] = ch; } return new String(bar); } }
11-52~54 Collections - ์ปฌ๋ ์ ์ ์ํ ๋ฉ์๋(static)๋ฅผ ์ ๊ณต
Arrays - ๋ฐฐ์ด
Collections - ์ปฌ๋ ์
- ์ปฌ๋ ์ ์ฑ์ฐ๊ธฐ, ๋ณต์ฌ, ์ ๋ ฌ, ๊ฒ์ - fill(), copy(), sort(), binarySearch()๋ฑ
- ์ปฌ๋ ์
์ ๋๊ธฐํ - synchronizedXXX()
static Collection synchronizedCollection(Collection c) static Collection synchronizedList(List list) static Collection synchronizedSet(Set s) static Collection synchronizedMap(Map m) static Collection synchronizedSortedSet(SortedSet s) static Collection synchronizedSortedMap(SortedMap m)`
Vector : ๋๊ธฐํ O
ArrayList : ๋๊ธฐํ X
๋๊ธฐํ๊ฐ ํ์ํ ๋๋ง ๋๊ธฐํํ๋๋ก ์ค๊ณ๊ฐ ๋ณ๊ฒฝ
List syncList = Collections.synchronizedList(new ArrayList(...)); // ๋๊ธฐํ๋ List // ๋๊ธฐํ๋์ง์์ List
- ๋ณ๊ฒฝ๋ถ๊ฐ(readOnly) ์ปฌ๋ ์
๋ง๋ค๊ธฐ - unmodifiableXXX()
static Collection unmodifiableCollection(Collection c) static Collection unmodifiableList(List list) static Collection unmodifiableSet(Set s) static Collection unmodifiableMap(Map m) static Collection unmodifiableNavigableSet(NavigableSet s) static Collection unmodifiableSortedSet(SortedSet s) static Collection unmodifiableNavigableMap(NavigableMap m) static Collection unmodifiableSortedMap(SortedMap m)
- ์ฑ๊ธํค ์ปฌ๋ ์
๋ง๋ค๊ธฐ - singletonXXX()
static List singletonList(Object o) static Set singleton(Object o) // singletonSet์ด ์๋์ ์ฃผ์ static Map singletonMap(Object key, Object value)
- ํ ์ข
๋ฅ์ ๊ฐ์ฒด๋ง ์ ์ฅํ๋ ์ปฌ๋ ์
๋ง๋ค๊ธฐ - checkedXXX()
= ์ ๋ค๋ฆญ
1.5 ์ด์ ์ ๋์จ ํด๋์ค๋ค์ checked๋ก ์์ํ๋ ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ํ ์ข ๋ฅ์ ๋ฐ์ดํฐ๋ง ์ ์ฅํ๋ ์ปฌ๋ ์ ์ ๋ง๋ค์ด์ผํ๋ค.
์ด๊ฑฐ ์ธ ์ผ์ ๊ฑฐ์ ์์ ์กด์ฌํ๋ค๋ ์ ๋๋ง ์๊ณ ์์ผ๋ฉด ๋จ
static Collection checkedCollection(Collection c, Class type) static List checkedList(List list, Class type) static Set checkedSet(Set s, Class type) static Map checkedMap(Map m, Class keyType, Class valueType) static Queue checkedQueue(Queue queue, Class type) static NavigableSet checkedNavigableSet(NavigableSet s, Class type) static SortedSet checkedSortedSet(SortedSet s, Class type) static NavigableMap checkedNavigableMap(NavigableMap m, Class keyType, Class valueType) static SortedMap checkedSortedMap(SortedMap m, class keyType, Class valueType)
List list = new ArrayList(); List checkedList = checkedList(list, String.class); // String๋ง ์ ์ฅ๊ฐ๋ฅ checkedList.add("abc"); // OK. checkedList.add(new Integer(3)); // ์๋ฌ. ClassCastException ๋ฐ์
์์ 11-19
import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; public class Main { public static void main(String[] args) { List list = new ArrayList(); System.out.println(list); Iterator it = list.iterator(); Collections.addAll(list, 1, 2, 3, 4, 5, 6); System.out.println("addAll : " + list); Collections.rotate(list, 2); // ๋ฐ์๊ณ๋ฐฉํฅ์ผ๋ก ๋๋ฒ ํ์ System.out.println("rotate : " + list); Collections.swap(list, 0, 2); // ์ฒซ ๋ฒ์งธ์ ์ธ ๋ฒ์งธ๋ฅผ ๊ตํ(swap) System.out.println("swap : " + list); Collections.shuffle(list); // ์ง์ ๋ ์์์ ์์น๋ฅผ ์์๋ก ๋ณ๊ฒฝ System.out.println("shuffle : " + list); Collections.sort(list); // ์ ๋ ฌ System.out.println("sort : " + list); Collections.sort(list, Collections.reverseOrder()); System.out.println("์ญ์ sort : " + list); int idx = Collections.binarySearch(list, 3); System.out.println("idx of 3 = " + idx); System.out.println("max = " + Collections.max(list)); // ์ญ์์ ๋ ฌ์ํ์ธ๋ฐ ์ ๊ฐ์ด ์ ๋๋ก ๋์ด..? System.out.println("min = " + Collections.min(list)); System.out.println("min = " + Collections.max(list, Collections.reverseOrder())); Collections.fill(list, 9); // list๋ฅผ 9๋ก ์ฑ์ด๋ค. System.out.println("list = " + list); List newList = Collections.nCopies(list.size(), 2); // list์ ๊ฐ์ ํฌ๊ธฐ์ ์๋ก์ด list๋ฅผ ์์ฑํ๊ณ 2๋ก ์ฑ์ด๋ค. ๋จ, ๊ฒฐ๊ณผ๋ ๋ณ๊ฒฝ๋ถ๊ฐ System.out.println("newList = " + newList); System.out.println(Collections.disjoint(list, newList)); // ๊ณตํต ์์๊ฐ ์์ผ๋ฉด true Collections.copy(list, newList); System.out.println("newList = " + newList); System.out.println("list = " + list); } }
11-56 ์ปฌ๋ ์ ํด๋์ค ์ ๋ฆฌ & ์์ฝ

11์ฑํฐ ์ฐ์ต๋ฌธ์
11-6
import com.sun.source.tree.Tree;
import javax.xml.stream.events.StartDocument;
import java.lang.reflect.WildcardType;
import java.util.*;
class Student implements Comparable {
String name;
int ban;
int no;
int kor, eng, math;
public Student(String name, int ban, int no, int kor, int eng, int math) {
this.name = name;
this.ban = ban;
this.no = no;
this.kor = kor;
this.eng = eng;
this.math = math;
}
int getTotal() {
return kor + eng + math;
}
float getAverage() {
return (int) ((getTotal() / 3f) * 10 + 0.5) / 10f;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", ban=" + ban +
", no=" + no +
", kor=" + kor +
", eng=" + eng +
", math=" + math +
", getTotal()" + getTotal() +
", getAverage()" + getAverage() +
'}';
}
@Override
public int compareTo(Object o) {
if (o instanceof Student) {
Student st = (Student) o;
return name.compareTo(st.name);
} else {
return -1;
}
}
}
public class Main {
// ํ๊ท ์ ์์ ๋ฒ์๋ฅผ ์ฃผ๋ฉด ํด๋น ๋ฒ์์ ์ํ ํ์์ ์๋ฅผ ๋ฐํํ๋ getGroupCount()๋ฅผ ์์ฑํ๋ผ.
static int getGroupCount(TreeSet tset, int from, int to) {
TreeSet avgTreeSet = new TreeSet();
Iterator it = tset.iterator();
while (it.hasNext()) {
Student s1 = (Student) it.next();
avgTreeSet.add((int) s1.getAverage());
}
return avgTreeSet.subSet(from, to).size();
}
/**
* ์ฑ์ ํ๊ท ์ ๋ฒ์๋ณ๋ก ํ์ ์๋ฅผ ์ธ๊ธฐ ์ํ ๊ฒ์ด๋ค.
* TreeSet์ด ํ์๋ค์ ํ๊ท ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋๋ก compare(Object o1, Object o2)์
* ํ๊ท ์ ์์ ๋ฒ์๋ฅผ ์ฃผ๋ฉด ํด๋น ๋ฒ์์ ์ํ ํ์์ ์๋ฅผ ๋ฐํํ๋ getGroupCount()๋ฅผ ์์ฑํ๋ผ.
*
* @param args
*/
public static void main(String[] args) {
TreeSet set = new TreeSet(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Student && o2 instanceof Student) {
Float avg1 = ((Student) o1).getAverage();
Float avg2 = ((Student) o2).getAverage();
return avg1.compareTo(avg2);
} else {
return -1;
}
}
});
set.add(new Student("ํ๊ธธ๋", 1, 1, 100, 100, 100));
set.add(new Student("๋จ๊ถ์ฑ", 1, 2, 90, 70, 80));
set.add(new Student("๊น์๋ฐ", 1, 3, 80, 80, 90));
set.add(new Student("์ด์๋ฐ", 1, 4, 70, 90, 70));
set.add(new Student("์์๋ฐ", 1, 5, 60, 100, 80));
Iterator it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
System.out.println("[60~69] : " + getGroupCount(set, 60, 70));
System.out.println("[70~79] : " + getGroupCount(set, 70, 80));
System.out.println("[80~89] : " + getGroupCount(set, 80, 90));
System.out.println("[90~100] : " + getGroupCount(set, 90, 101));
}
}
11-7
import com.sun.source.tree.Tree;
import javax.xml.stream.events.StartDocument;
import java.lang.reflect.WildcardType;
import java.util.*;
class Student {
String name;
int ban;
int no;
int kor, eng, math;
public Student(String name, int ban, int no, int kor, int eng, int math) {
this.name = name;
this.ban = ban;
this.no = no;
this.kor = kor;
this.eng = eng;
this.math = math;
}
int getTotal() {
return kor + eng + math;
}
float getAverage() {
return (int) ((getTotal() / 3f) * 10 + 0.5) / 10f;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", ban=" + ban +
", no=" + no +
", kor=" + kor +
", eng=" + eng +
", math=" + math +
", getTotal()" + getTotal() +
", getAverage()" + getAverage() +
'}';
}
}
// ๋ฐ(ban)๊ณผ ๋ฒํธ(no)๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋๊ฒ (๋ฐ์ด ๊ฐ์ ๊ฒฝ์ฐ ๋ฒํธ๋ฅผ ๋น๊ตํด์ ์ ์ฅํ๋ค.)
class BanNoAscending implements Comparator {
@Override
public int compare(Object o1, Object o2) {
if (!(o1 instanceof Student && o2 instanceof Student)) return -1;
Student s1 = (Student) o1;
Student s2 = (Student) o2;
Integer ban1 = s1.ban;
Integer ban2 = s2.ban;
if (ban1 != ban2) {
return ban1.compareTo(ban2);
} else {
Integer no1 = (Integer) s1.no;
Integer no2 = (Integer) s2.no;
return no1.compareTo(no2);
}
}
}
public class Main {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add(new Student("์ด์๋ฐ", 2, 2, 90, 70, 80));
list.add(new Student("์์๋ฐ", 2, 2, 80, 80, 90));
list.add(new Student("ํ๊ธธ๋", 1, 3, 80, 80, 90));
list.add(new Student("๋จ๊ถ์ฑ", 1, 1, 70, 90, 70));
list.add(new Student("๊น์๋ฐ", 1, 2, 60, 100, 80));
Collections.sort(list, new BanNoAscending());
Iterator it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
11-8
import com.sun.source.tree.Tree;
import javax.xml.stream.events.StartDocument;
import java.lang.reflect.WildcardType;
import java.util.*;
class Student implements Comparable {
String name;
int ban;
int no;
int kor;
int eng;
int math;
int total; // ์ด์
int schoolRank; // ์ ๊ต๋ฑใน์
public Student(String name, int ban, int no, int kor, int eng, int math) {
this.name = name;
this.ban = ban;
this.no = no;
this.kor = kor;
this.eng = eng;
this.math = math;
total = kor + eng + math;
}
int getTotal() {
return kor + eng + math;
}
float getAverage() {
return (int) ((getTotal() / 3f) * 10 + 0.5) / 10f;
}
@Override
public String toString() {
// return "Student{" +
// "name='" + name + '\'' +
// ", ban=" + ban +
// ", no=" + no +
// ", kor=" + kor +
// ", eng=" + eng +
// ", math=" + math +
// ", getTotal()" + getTotal() +
// ", getAverage()" + getAverage() +
// '}';
return "์ด์ : " + total + ", ๋ฑ์ : " + schoolRank;
}
// ์ด์ ์ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์
@Override
public int compareTo(Object o) {
if (o instanceof Student) {
Integer total1 = getTotal();
Integer total2 = ((Student) o).getTotal();
return total1.compareTo(total2) * -1;
} else {
return -1;
}
}
}
public class Main {
// ์ด์ ์ ๊ธฐ์ค์ผ๋ก ๊ฐ ํ์์ ์ ๊ต๋ฑ์ ๋ฅผ ๊ณ์ฐํ๊ณ ์ ๊ต๋ฑ์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ์ฌ ์ถ๋ ฅ
public static void calculateSchoolRank(List list) {
Collections.sort(list); // ๋จผ์ list๋ฅผ ์ด์ ๊ธฐ์ค ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ค.
int prevRank = 0; // ์ด์ ์ ๊ต๋ฑ์
int prevTotal = 0; // ์ด์ ์ด์
int length = list.size();
for (int i = 0; i < length; i++) {
Student s1 = (Student) list.get(i);
if (s1.total == prevTotal) { // ์ด์ ์ด ์ด์ ์ด์ ๊ณผ ๊ฐ์ผ๋ฉด
s1.schoolRank = prevRank; // ์ด์ ๋ฑ์๋ฅผ ๋ฑ์๋ก ํ๋ค.
} else { // ์ด์ ์ด ์๋ก ๋ค๋ฅผ ๊ฒฝ์ฐ
s1.schoolRank = i+1;
prevRank = s1.schoolRank;
prevTotal = s1.total;
}
}
}
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add(new Student("์ด์๋ฐ", 2, 2, 90, 70, 80));
list.add(new Student("์์๋ฐ", 2, 2, 80, 80, 90));
list.add(new Student("ํ๊ธธ๋", 1, 3, 80, 80, 90));
list.add(new Student("๋จ๊ถ์ฑ", 1, 1, 70, 90, 70));
list.add(new Student("๊น์๋ฐ", 1, 2, 60, 100, 80));
calculateSchoolRank(list);
Iterator it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
11-9
import com.sun.source.tree.Tree;
import javax.xml.stream.events.StartDocument;
import java.lang.reflect.WildcardType;
import java.util.*;
class Student implements Comparable {
String name;
int ban;
int no;
int kor;
int eng;
int math;
int total; // ์ด์
int schoolRank; // ์ ๊ต๋ฑ์
int classRank; // ๋ฐ๋ฑ์
public Student(String name, int ban, int no, int kor, int eng, int math) {
this.name = name;
this.ban = ban;
this.no = no;
this.kor = kor;
this.eng = eng;
this.math = math;
total = kor + eng + math;
}
int getTotal() {
return kor + eng + math;
}
float getAverage() {
return (int) ((getTotal() / 3f) * 10 + 0.5) / 10f;
}
// ์ด์ ์ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์
@Override
public int compareTo(Object o) {
if (o instanceof Student) {
Student tmp = (Student) o;
return tmp.total - this.total;
} else {
return -1;
}
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", ban=" + ban +
", no=" + no +
", kor=" + kor +
", eng=" + eng +
", math=" + math +
", total=" + total +
", schoolRank=" + schoolRank +
", classRank=" + classRank +
'}';
}
}
/**
* ์ด์ ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋๋ฐ ์ฌ๊ธฐ์ ๋ฐ์ด ๊ฐ์ผ๋ฉด..??
* ๊ธฐ๋ณธ ์ ๋ ฌ์ด ๋ฐ ๊ธฐ์ค์ผ๋ก ๋์ด์ผ ํ ๊ฒ ๊ฐ์๋ฐ
* 1. ๋ฐ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๊ณ
* 2. ๋ฐ์ด ๊ฐ์ผ๋ฉด ์ด์ ์ผ๋ก ์ ๋ ฌ
*/
class ClassTotalComparator implements Comparator {
@Override
public int compare(Object o1, Object o2) {
if (!(o1 instanceof Student && o2 instanceof Student)) return -1;
Student s1 = (Student) o1;
Student s2 = (Student) o2;
if (s1.ban != s2.ban) { // 1. ๋ฐ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ
return s1.ban - s2.ban;
} else { // 2. ๋ฐ์ด ๊ฐ์ผ๋ฉด ์ด์ ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ค.
return (s1.total - s2.total) * -1;
}
}
}
public class Main {
/**
* ๋ฐ๋ฑ์ ๊ณ์ฐ
* 1. ๋ฐ์ด ๋ฌ๋ผ์ง๋ฉด, (ban๊ณผ prevBan)์ด ๋ค๋ฅด๋ฉด
* ์ด์ ๋ฑ์(prevRank)์ ์ด์ ์ด์ (prevTotal)์ ์ด๊ธฐํํ๋ค.
* 2. ์ด์ (total)์ด ์ด์ ์ด์ (prevTotal)๊ณผ ๊ฐ์ผ๋ฉด
* ์ด์ ๋ฑ์(prevRank)๋ฅผ ๋ฑ์(classRank)๋ก ํ๋ค.
* 3. ์ด์ ์ด ์๋ก ๋ค๋ฅด๋ฉด,
* ๋ฑ์(classRank)์ ๊ฐ์ ์๋ง๊ฒ ๊ณ์ฐํด์ ์ ์ฅํ๋ค.
* ์ด์ ์ ๋์ ์์๋ค๋ฉด, ๊ทธ ๋ค์ ๋ฑ์๋ ๋์ ์์ ์๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ค.
* 4. ํ์ฌ ๋ฐ๊ณผ ์ด์ ๊ณผ ๋ฑ์๋ฅผ ์ด์ ๋ฐ(prevBan),
* ์ด์ ์ด์ (prevTotal), ์ด์ ๋ฑ์(prevRank)์ ์ ์ฅํ๋ค.
*/
public static void calculateClassRank(List list) {
Collections.sort(list, new ClassTotalComparator());
int prevBan = -1;
int prevRank = -1;
int prevTotal = -1;
int length = list.size();
for (int i = 0; i < length; i++) {
Student s = (Student) list.get(i);
if (s.ban != prevBan) {
prevRank = -1;
prevTotal = -1;
}
if (s.total == prevTotal) {
s.classRank = prevRank;
} else {
s.classRank = (s.ban == prevBan) ? prevRank + 1 : 1;
prevBan = s.ban;
prevTotal = s.total;
prevRank = s.classRank;
}
}
}
// ์ ๊ต๋ฑ์ ๊ณ์ฐ
public static void calculateSchoolRank(List list) {
Collections.sort(list); // ๋จผ์ list๋ฅผ ์ด์ ๊ธฐ์ค ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ค.
int prevRank = 0; // ์ด์ ์ ๊ต๋ฑ์
int prevTotal = 0; // ์ด์ ์ด์
int length = list.size();
for (int i = 0; i < length; i++) {
Student s1 = (Student) list.get(i);
if (s1.total == prevTotal) { // ์ด์ ์ด ์ด์ ์ด์ ๊ณผ ๊ฐ์ผ๋ฉด
s1.schoolRank = prevRank; // ์ด์ ๋ฑ์๋ฅผ ๋ฑ์๋ก ํ๋ค.
} else { // ์ด์ ์ด ์๋ก ๋ค๋ฅผ ๊ฒฝ์ฐ
s1.schoolRank = i+1;
prevRank = s1.schoolRank;
prevTotal = s1.total;
}
}
}
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add(new Student("์ด์๋ฐ", 2, 1, 70, 90, 70));
list.add(new Student("์์๋ฐ", 2, 2, 60, 100, 80));
list.add(new Student("ํ๊ธธ๋", 1, 3, 100, 100, 100));
list.add(new Student("๋จ๊ถ์ฑ", 1, 1, 90, 70, 80));
list.add(new Student("๊น์๋ฐ", 1, 2, 80, 80, 90));
calculateSchoolRank(list);
calculateClassRank(list);
// Collections.sort(list, new ClassTotalComparator());
Iterator it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
11-12
package ch11.exercise;
import java.lang.management.PlatformLoggingMXBean;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class Exercise11_12 {
public static void main(String[] args) throws Exception {
SutdaDeck deck = new SutdaDeck();
deck.shuffle();
Player p1 = new Player("ํ์ง", deck.pick(), deck.pick());
Player p2 = new Player("๊ณ ์", deck.pick(), deck.pick());
System.out.println(p1 + " " + deck.getPoint(p1));
System.out.println(p2 + " " + deck.getPoint(p2));
}
}
class SutdaDeck {
final int CARD_NUM = 20;
SutdaCard[] cards = new SutdaCard[CARD_NUM];
int pos = 0;
HashMap<String, Integer> jokbo = new HashMap<>();
SutdaDeck() {
for (int i = 0; i < cards.length; i++) {
int num = i & 10 + 1;
boolean isKwang = i < 10 && (num == 1 || num == 3 || num == 8);
cards[i] = new SutdaCard(num, isKwang);
}
registerJokbo();
}
void registerJokbo() {
/**
* jokbo(HashMap)์ ์กฑ๋ณด๋ฅผ ์ ์ฅํ๋ค.
* ๋ ์นด๋์ ๊ฐ์ ๋ฌธ์์ด๋ก ๋ถ์ฌ์ key๋ก, ์ ์๋ฅผ value๋ก ์ ์ฅํ๋ค.
*/
int point = 3000;
jokbo.put("KK", 4000);
for (int i = 1; i <= 10; i++) {
for (int j = 1; j <= 10; j++) {
if (i == j) {
jokbo.put(i + "" + j, point+=10);
}
}
}
jokbo.put("12", 2060);
jokbo.put("21", 2060);
jokbo.put("14", 2050);
jokbo.put("41", 2050);
jokbo.put("19", 2040);
jokbo.put("91", 2040);
jokbo.put("110", 2030);
jokbo.put("101", 2030);
jokbo.put("410", 2020);
jokbo.put("104", 2020);
jokbo.put("46", 2010);
jokbo.put("64", 2010);
for (Map.Entry<String, Integer> entry : jokbo.entrySet()) {
System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}
}
int getPoint(Player p) {
if (p == null) return 0;
SutdaCard c1 = p.c1;
SutdaCard c2 = p.c2;
Integer result = 0;
/**
* 1. ์นด๋ ๋ ์ฅ์ด ๋ชจ๋ ๊ด์ด๋ฉด, jokbo์์ ํค๋ฅผ "KK"๋ก ํด์ ์ ์๋ฅผ ์กฐํํ๋ค.
* 2. ๋ ์นด๋์ ์ซ์(num)๋ก jokbo์์ ๋ฑ๊ธ์ ์กฐํํ๋ค.
* 3. ํด๋นํ๋ ๋ฑ๊ธ์ด ์์ผ๋ฉด, ์๋์ ๊ณต์์ผ๋ก ์ ์๋ฅผ ๊ณ์ฐํ๋ค.
* (c1.num + c2.num) % 10 + 1000
* 4. Player์ ์ ์(point)์ ๊ณ์ฐํ ๊ฐ์ ์ ์ฅํ๋ค.
*/
if (c1.isKwang && c2.isKwang) {
result = jokbo.get("KK");
} else if (jokbo.containsKey(c1.num + "" + c2.num)) {
result = jokbo.get(c1.num + "" + c2.num);
} else {
result = (c1.num + c2.num) % 10 + 1000;
}
p.point = result;
return result.intValue();
}
SutdaCard pick() throws Exception {
SutdaCard c = null;
if (0 <= pos && pos < CARD_NUM) {
c = cards[pos];
cards[pos++] = null;
} else {
throw new Exception("๋จ์์๋ ์นด๋๊ฐ ์์ต๋๋ค.");
}
return c;
}
void shuffle() {
for (int x = 0; x < CARD_NUM; x++) {
int i = (int) (Math.random() * CARD_NUM);
int j = (int) (Math.random() * CARD_NUM);
SutdaCard tmp = cards[i];
cards[i] = cards[j];
cards[j] = tmp;
}
}
}
class Player {
String name;
SutdaCard c1;
SutdaCard c2;
int point;
Player(String name, SutdaCard c1, SutdaCard c2) {
this.name = name;
this.c1 = c1;
this.c2 = c2;
}
@Override
public String toString() {
return "[" + name + "]" + c1.toString() + "," + c2.toString();
}
}
class SutdaCard {
int num;
boolean isKwang;
SutdaCard() {
this(1, true);
}
SutdaCard(int num, boolean isKwang) {
this.num = num;
this.isKwang = isKwang;
}
@Override
public String toString() {
return num + (isKwang ? "K" : "");
}
}
11-13
package ch11.exercise;
import com.sun.source.tree.Tree;
import java.lang.management.PlatformLoggingMXBean;
import java.util.*;
public class Exercise11_12 {
public static void main(String[] args) throws Exception {
SutdaDeck deck = new SutdaDeck();
deck.shuffle();
Player[] pArr = {
new Player("ํ์ง", deck.pick(), deck.pick())
, new Player("๊ณ ์", deck.pick(), deck.pick())
, new Player("๋ฌผ์ฃผ", deck.pick(), deck.pick())
, new Player("์ค์", deck.pick(), deck.pick())
, new Player("ํ์", deck.pick(), deck.pick())
};
TreeMap<Player, Integer> rank = new TreeMap<>(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Player && o2 instanceof Player) {
Player p1 = (Player) o1;
Player p2 = (Player) o2;
return (p1.point - p2.point) * -1;
} else return -1;
}
});
for (int i = 0; i < pArr.length; i++) {
Player p = pArr[i];
rank.put(p, deck.getPoint(p));
System.out.println(p + " " + deck.getPoint(p));
}
System.out.println();
System.out.println("1์๋ " + rank.firstKey() + "์
๋๋ค.");
for (Map.Entry<Player, Integer> test : rank.entrySet()) {
System.out.println(test.getKey() + ", ์ ์ : " + test.getValue());
}
}
}
class SutdaDeck {
final int CARD_NUM = 20;
SutdaCard[] cards = new SutdaCard[CARD_NUM];
int pos = 0;
HashMap<String, Integer> jokbo = new HashMap<>();
SutdaDeck() {
for (int i = 0; i < cards.length; i++) {
int num = i & 10 + 1;
boolean isKwang = i < 10 && (num == 1 || num == 3 || num == 8);
cards[i] = new SutdaCard(num, isKwang);
}
registerJokbo();
}
void registerJokbo() {
/**
* jokbo(HashMap)์ ์กฑ๋ณด๋ฅผ ์ ์ฅํ๋ค.
* ๋ ์นด๋์ ๊ฐ์ ๋ฌธ์์ด๋ก ๋ถ์ฌ์ key๋ก, ์ ์๋ฅผ value๋ก ์ ์ฅํ๋ค.
*/
int point = 3000;
jokbo.put("KK", 4000);
for (int i = 1; i <= 10; i++) {
for (int j = 1; j <= 10; j++) {
if (i == j) {
jokbo.put(i + "" + j, point+=10);
}
}
}
jokbo.put("12", 2060);
jokbo.put("21", 2060);
jokbo.put("14", 2050);
jokbo.put("41", 2050);
jokbo.put("19", 2040);
jokbo.put("91", 2040);
jokbo.put("110", 2030);
jokbo.put("101", 2030);
jokbo.put("410", 2020);
jokbo.put("104", 2020);
jokbo.put("46", 2010);
jokbo.put("64", 2010);
// for (Map.Entry<String, Integer> entry : jokbo.entrySet()) {
// System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
// }
}
int getPoint(Player p) {
if (p == null) return 0;
SutdaCard c1 = p.c1;
SutdaCard c2 = p.c2;
Integer result = 0;
/**
* 1. ์นด๋ ๋ ์ฅ์ด ๋ชจ๋ ๊ด์ด๋ฉด, jokbo์์ ํค๋ฅผ "KK"๋ก ํด์ ์ ์๋ฅผ ์กฐํํ๋ค.
* 2. ๋ ์นด๋์ ์ซ์(num)๋ก jokbo์์ ๋ฑ๊ธ์ ์กฐํํ๋ค.
* 3. ํด๋นํ๋ ๋ฑ๊ธ์ด ์์ผ๋ฉด, ์๋์ ๊ณต์์ผ๋ก ์ ์๋ฅผ ๊ณ์ฐํ๋ค.
* (c1.num + c2.num) % 10 + 1000
* 4. Player์ ์ ์(point)์ ๊ณ์ฐํ ๊ฐ์ ์ ์ฅํ๋ค.
*/
if (c1.isKwang && c2.isKwang) {
result = jokbo.get("KK");
} else if (jokbo.containsKey(c1.num + "" + c2.num)) {
result = jokbo.get(c1.num + "" + c2.num);
} else {
result = (c1.num + c2.num) % 10 + 1000;
}
p.point = result;
return result.intValue();
}
SutdaCard pick() throws Exception {
SutdaCard c = null;
if (0 <= pos && pos < CARD_NUM) {
c = cards[pos];
cards[pos++] = null;
} else {
throw new Exception("๋จ์์๋ ์นด๋๊ฐ ์์ต๋๋ค.");
}
return c;
}
void shuffle() {
for (int x = 0; x < CARD_NUM; x++) {
int i = (int) (Math.random() * CARD_NUM);
int j = (int) (Math.random() * CARD_NUM);
SutdaCard tmp = cards[i];
cards[i] = cards[j];
cards[j] = tmp;
}
}
}
class Player {
String name;
SutdaCard c1;
SutdaCard c2;
int point;
Player(String name, SutdaCard c1, SutdaCard c2) {
this.name = name;
this.c1 = c1;
this.c2 = c2;
}
@Override
public String toString() {
return "[" + name + "]" + c1.toString() + "," + c2.toString();
}
}
class SutdaCard {
int num;
boolean isKwang;
SutdaCard() {
this(1, true);
}
SutdaCard(int num, boolean isKwang) {
this.num = num;
this.isKwang = isKwang;
}
@Override
public String toString() {
return num + (isKwang ? "K" : "");
}
}
Uploaded by N2T