์ ์์ฝ
๊ตฌ๋ถ | ์ฅ์ | ๋จ์ |
๋ฐฐ์ด | - ๋น ๋ฅธ ์ ๊ทผ ์๋ - ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ํจ์จ์ |
- ํฌ๊ธฐ ๋ณ๊ฒฝ ๋ถ๊ฐ - API ๊ธฐ๋ฅ ๋ถ์ฌ |
์ปฌ๋ ์ | - ์ ์ฐํ ํฌ๊ธฐ ์กฐ์ - ํ๋ถํ API - ๋ค์ํ ์๋ฃ๊ตฌ์กฐ ๊ตฌํ์ฒด ์กด์ฌ |
- ์ค๋ฒํค๋ ์กด์ฌ - ์ ๋ค๋ฆญ ์ฌ์ฉ ํ์ - ํ์ ์์ ์ฑ ๋ฌธ์ ๋ฐ์ ๊ฐ๋ฅ |
์ํฉ | ์ถ์ฒ ์๋ฃ๊ตฌ์กฐ |
์์ ์๊ฐ ๊ณ ์ ๋์ด ์๊ณ ๋ณ๊ฒฝ๋์ง ์์ | ๋ฐฐ์ด |
์ฝ์ /์ญ์ ๊ฐ ๋น๋ฒํจ | LinkedList, HashMap |
๊ฒ์์ด ๋น๋ฒํ๊ณ ์ธ๋ฑ์ค ๊ธฐ๋ฐ ์ ๊ทผ ํ์ | ArrayList |
์ค๋ณต์ ํ์ฉํ์ง ์๋ ์งํฉ์ด ํ์ | HashSet, TreeSet |
ํค-๊ฐ ๊ตฌ์กฐ์ ์ ์ฅ์ด ํ์ | HashMap, TreeMap |
๋ฐฐ์ด
๊ฐ์ ํ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ฐ์์ ์ผ๋ก ์ ์ฅํ ์ ์๋ ๊ณ ์ ํฌ๊ธฐ ์๋ฃ ๊ตฌ์กฐ
- ์ธ๋ฑ์ค๋ฅผ ํตํ ๋น ๋ฅธ ์ ๊ทผ์ด ๊ฐ๋ฅ
- ๊ธฐ๋ณธํ(int[])๊ณผ ์ฐธ์กฐํ(String[]) ๋ชจ๋ ์ง์
- ๋ค์ฐจ์ ๋ฐฐ์ด ์ง์
- ๋ด๋ถ์ ์ผ๋ก Heap ์์ญ์ ์ฐ์๋ ๊ณต๊ฐ์ ํ ๋น(CPU ์บ์์ ์นํ์ )
int [] arr = new int [5];
int [] arr2 = {1,2,3,4,5};
System.out.println(Arrays.toString(arr2)); // ์ด๊ฑฐ ํ๋ฉด ํ์ด์ฌ์์ ํ๋ฒ์ ์ถ๋ ฅํ๋ฏ์ด ๋์ด
// ๋ค์ฐจ์ ๋ฐฐ์ด์ฉ์
Arrays.deeptoString(arr);
int [][] arr3 = new int[3][]; // ์ด๊ฑฐ ๋จ
arr3[0] = new int[1];
arr3[1] = new int[2];
arr3[2] = new int[3];
for(int [] t : arr3){
System.out.println(t.length);
}
์ปฌ๋ ์
๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ ์ฅ, ํ์, ์ ๋ ฌ, ์ญ์ ํ๊ธฐ ์ํ ๋์ ์๋ฃ๊ตฌ์กฐ๋ค(java.util์ ์๋ค.)
- ์์์ ์ถ๊ฐ/์ญ์ ๊ฐ ๋์
- ๋ฐ๋ณต์(Iterator) ๊ธฐ๋ฐ ์ํ ๊ฐ๋ฅ
- null ํ์ฉ ์ฌ๋ถ ๋ฐ ๋๊ธฐํ ์ฌ๋ถ ๋ฑ์ด ๊ตฌํ์ฒด ๋ง๋ค ๋ค๋ฆ
List
์ค๋ณต๋ ๊ฐ์ด ๊ฐ๋ฅํ๊ณ , ์ธ๋ฑ์ค๋ก ์ฐธ์กฐ ๊ด๋ฆฌํ๋ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
add(), get(), set(), remove(), indexOf(), lastIndexOf(), contains() // ๊ณตํต๋ฉ์๋
๐ธ ArrayList
- ๋ด๋ถ์ ์ผ๋ก ๋ฐฐ์ด์ด ์ฌ์ฉ๋์ง๋ง, ์๋ ๋ฆฌ์ฌ์ด์ง์ ์ํ
(add()์ ์ฉ๋์ด ์ด๊ณผ๋๋ฉด ๋ด๋ถ์ ์ผ๋ก grow()๋ฅผ ์ฌ์ฉํด ํฌ๊ธฐ๋ฅผ 1.5๋ฐฐ ํ์ฅํ๋ค) - ๋์์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ์ ๊ทผํ ์ ์๋ค.
๐ธ LinkedList
- ๊ฐ ์์์ ํฌ์ธํฐ๋ฅผ ํฌํจํด ๋น์ฐ์์ ์ผ๋ก ์ ์ฅ๋๋ค.
- ๊ทธ๋์ ์ค๊ฐ ์ธ๋ฑ์ค๋ฅผ ์ญ์ ํด๋ ํด๋น ์ธ๋ฑ์ค ๋ฒํธ๋ ๋น๊ฒ ๋๋ค.
(ArrayList์ ๋น๊ตํด ์ธ๋ฑ์ค๋ฅผ ๋น๊ธฐ๋ ์ฐ์ฐ์ด ์ฌ๋ผ์ ธ ๋น๊ต์ ๋น ๋ฆ)
์ฐ์ฐ | ArrayList | LinkedList |
---|---|---|
์ธ๋ฑ์ค ์ ๊ทผ | O(1) | O(n) |
์ฝ์ /์ญ์ (์ค๊ฐ) | O(n) (๋ฐ์ด๋ด๊ธฐ ๋ฐ์) | O(1) (๋ ธ๋ ์ฐ๊ฒฐ๋ง) |
๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ | ์ ์ (๋ฐ์ดํฐ๋ง ์ ์ฅ) | ๋ง์ (๋ฐ์ดํฐ + ๋งํฌ) |
์บ์ ์ ์ค๋ฅ | ๋์ (์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ) | ๋ฎ์ (๋ถ์ฐ์ ๋ฉ๋ชจ๋ฆฌ) |
๐ธ Vector
- ArrayList์ ๋์ผํ๋
๋ชจ๋ ๋ฉ์๋์ synchronized
์ฒ๋ฆฌ(thread-safe)
Set
์ค๋ณต์ ํ์ฉํ์ง ์๊ณ ์ ์ฅ ์์๋ฅผ ๋ฏธ๋ณด์ฅํ๋ค.(null๋ ํ๋๋ง)
๐ธ HashSet
- ๋ด๋ถ์ ์ผ๋ก HashMap<K, Object> ๊ตฌ์กฐ๋ก ๊ด๋ฆฌ
hashCode()
์equals()
๋ฅผ ๋ชจ๋ Override ํด์ผ ์ค๋ณต ํ๋จ์ด ์ ํ
(equals(): ๊ธฐ๋ณธ์ ์ผ๋ก ์ฃผ์๊ฐ์ ๋น๊ต(==), Override๋ก ๋ด์ฉ์ ๋น๊ตํ๊ฒ ์ค์ )
(hashCode(): ๊ฐ์ฒด๋ฅผ Hash๊ธฐ๋ฐ์์ ์ฌ์ฉํ ๋, ๋ด๋ถ ๋ฒํท์ ๊ฒฐ์ ํ ๋ ์ฌ์ฉ, ๊ฐ์ ๊ฐ์ฒด๋ ํญ์ ๊ฐ์ hashCode()๋ฅผ ๋ฐํํด์ผ ํจ.)- Lombok ์ฌ์ฉ ์
@EqualsAndHashCode
๋ก ์๋ ์์ฑ ๊ฐ๋ฅ
class Person {
String name;
public Person(String name) { this.name = name; }
}
Set set = new HashSet<>();
set.add(new Person("Alice"));
set.add(new Person("Alice")); // ๋ค๋ฅธ ๊ฐ์ฒด๋ก ์ธ์๋จ
System.out.println(set.size()); // ๊ฒฐ๊ณผ: 2
// ๋ ๋ค ์ฃผ์๊ฐ ๋ค๋ฅด๊ณ hashCode๋ ๋ค๋ฅด๊ณ equals๋ false: ์ค๋ณต ์๋๊ฑธ๋ก ์ฒ๋ฆฌ
class Person {
String name;
public Person(String name) { this.name = name; }
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Person)) return false;
Person p = (Person) o;
return this.name.equals(p.name);
}
@Override
public int hashCode() {
return name.hashCode(); // String์ hashCode ์ฌ์ฉ
}
}
Set<Person> set = new HashSet<>();
set.add(new Person("Alice"));
set.add(new Person("Alice"));
System.out.println(set.size()); // ๊ฒฐ๊ณผ: 1
๐ธ TreeSet
- Red-Black Tree ๊ธฐ๋ฐ ์ด์งํ์ํธ๋ฆฌ(BST)
Comparable
๊ณผComparator
๋ก ์ ๋ ฌ ๊ธฐ์ค ์ง์ ๊ฐ๋ฅTreeSet<Integer> ts = new TreeSet<>();
- ์ ์ํ TreeSet์ ์์ฑํ๋ค. ๊ฐ์ด ์๋์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋๋ค.
ts.headSet(10); // 10๋ณด๋ค ์์ ๊ฐ
- 10 ๋ฏธ๋ง์ ๊ฐ๋ค๋ง ํฌํจํ ๋ทฐ(view)๋ฅผ ๋ฐํํ๋ค.
- ์ฆ, ts์์ 10๋ณด๋ค ์์ ๊ฐ๋ค๋ง์ ๊ฐ์ง ๋ถ๋ถ ์งํฉ์ด๋ค. (10์ ํฌํจ๋์ง ์์)
ts.tailSet(10); // 10๋ณด๋ค ํฐ ๊ฐ
- 10 ์ด์์ ๊ฐ์ ํฌํจํ๋ ๋ทฐ(view)์ด๋ค.
- ์ฆ, ts์์ 10๋ถํฐ ์์ํ์ฌ ๊ทธ ์ด์์ ๊ฐ์ ํฌํจํ๋ ๋ถ๋ถ ์งํฉ์ด๋ค. (10์ ํฌํจ๋จ)
ts.subSet(5, 15); // 5~14 ์ฌ์ด ๊ฐ
- 5 ์ด์, 15 ๋ฏธ๋ง์ ๊ฐ๋ค๋ก ์ด๋ฃจ์ด์ง ๋ถ๋ถ ์งํฉ์ด๋ค.
- ์ฆ, 5 <= ๊ฐ < 15 ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์์๋ค๋ง ๋ฐํํ๋ค.
๊ธฐ๋ณธ ์ ๋ ฌ (Comparable
)
TreeSet<Integer> set = new TreeSet<>();
set.add(5);
set.add(3);
set.add(10);
System.out.println(set); // [3, 5, 10] - ์ค๋ฆ์ฐจ์ ์๋ ์ ๋ ฌ
์ฌ์ฉ์ ์ ์ ์ ๋ ฌ (Comparator
์ ๋ฌ)
TreeSet<String> names = new TreeSet<>(Comparator.reverseOrder());
names.add("Alice");
names.add("Bob");
names.add("Charlie");
System.out.println(names); // [Charlie, Bob, Alice]
์ฌ์ฉ์ ๊ฐ์ฒด ์ ๋ ฌ (Comparable
๊ตฌํ)
class Person implements Comparable<Person> {
String name;
int age;
public Person(String name, int age) { this.name = name; this.age = age; }
@Override
public int compareTo(Person o) {
return Integer.compare(this.age, o.age);
}
}
TreeSet<Person> people = new TreeSet<>();
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 20));
Stack, Queue, Deque, PriorityQueue
๐ธ Stack (LIFO, ํ์ ์ ์ถ)
- java.util.Stack์ ์ค๋๋ ๊ตฌ์กฐ์ด๋ฉฐ, ๋๊ธฐํ ๋น์ฉ์ด ์์ด ์์ฆ์ ArrayDeque ๊ถ์ฅ
- ๋ฉ์๋:
push()
,pop()
,peek()
Deque<String> stack = new ArrayDeque<>();
stack.push("A");
stack.push("B");
System.out.println(stack.pop()); // "B"
๐ธ Queue (FIFO, ์ ์ ์ ์ถ)
- ์ผ๋ฐ์ ์ผ๋ก LinkedList, ArrayDeque, PriorityQueue ๋ฑ์ ์ฌ์ฉ
- ๋ฉ์๋:
offer(e)
– ์์ ์ถ๊ฐpoll()
– ๊บผ๋ด๊ณ ์ ๊ฑฐ (๋น์ด์์ผ๋ฉด null)peek()
– ๊บผ๋ด์ง ์๊ณ ์กฐํ
Queue<String> queue = new LinkedList<>();
queue.offer("A");
queue.offer("B");
System.out.println(queue.poll()); // "A"
๐ธ Deque (Double Ended Queue, ์๋ฐฉํฅ ํ)
- Stack + Queue ํผํฉํ: ์์ชฝ์์ ์ฝ์ ๊ณผ ์ญ์ ๊ฐ๋ฅ
- ์ฅ์ : ๋น๋ฒํ ์ฝ์ /์ญ์ ์ ์ ํฉ (LinkedList๋ณด๋ค ๋น ๋ฆ), ํ/์คํ ์ ๋ถ ๊ตฌํ ๊ฐ๋ฅ
- ๋ฉ์๋:
addFirst(e)
,addLast(e)
removeFirst()
,removeLast()
peekFirst()
,peekLast()
Deque<String> deque = new ArrayDeque<>();
deque.addFirst("A");
deque.addLast("B");
System.out.println(deque.removeLast()); // "B"
๐ธ PriorityQueue (์ฐ์ ์์ ํ)
- ์์๋ฅผ ์ฝ์ ํ๋ฉด ์๋์ผ๋ก ์ฐ์ ์์์ ๋ฐ๋ผ ์ ๋ ฌ๋์ด ๊บผ๋ผ ์ ์๋ ํ
- ๋ด๋ถ์ ์ผ๋ก Min-Heap (์ต์ ํ) ๊ตฌ์กฐ ์ฌ์ฉ
- ๊ธฐ๋ณธ ์ ๋ ฌ ๊ธฐ์ค์ Comparable.compareTo() ์ค๋ฆ์ฐจ์
- ์ปค์คํ ์ ๋ ฌ์ Comparator ์ ๋ฌ๋ก ๊ฐ๋ฅ
PriorityQueue<Integer> pq = new PriorityQueue<>();
pq.offer(5);
pq.offer(1);
pq.offer(3);
System.out.println(pq.poll()); // 1 (๊ฐ์ฅ ์์ ๊ฐ๋ถํฐ)
PriorityQueue<Integer> descPq = new PriorityQueue<>(Comparator.reverseOrder());
descPq.offer(5);
descPq.offer(1);
descPq.offer(3);
System.out.println(descPq.poll()); // 5
Map
Map์ ํค(key)์ ๊ฐ(value)์ ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ Java์ ์ธํฐํ์ด์ค
ํ๋์ ํค์ ํ๋์ ๊ฐ๋ง ๋์๋๋ฉฐ, ํค๋ ์ค๋ณต๋ ์ ์๊ณ ๊ฐ์ ์ค๋ณต๋ ์ ์๋ ์๋ฃ๊ตฌ์กฐ
๐ธ HashMap
hashCode()
→ ๋ฒํท ์ธ๋ฑ์ค ๊ฒฐ์ - ์ถฉ๋ ์
LinkedList
(Java 8 ์ดํ TreeNode(Red-Black Tree) ๋ก ์ ํ (์ฑ๋ฅ ์ต์ ํ)) - key ํ์, ์ฝ์ , ์ญ์ : ํ๊ท O(1), ์ต์ O(n) → TreeNode๋ก ์ํ
๐ธ HashTable
- ๋ชจ๋ ๋ฉ์๋๊ฐ synchronized → ์ฑ๋ฅ ์ด์
- Legacy ํด๋์ค → ConcurrentHashMap ๊ถ์ฅ
๐ธ LinkedHashMap
- ๋ค์ด์จ ์์๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
new LinkedHashMap<>(capacity, loadFactor, accessOrder);
→ accessOrder = true ์ค์ ์, ์ ๊ทผ ์์ ๊ธฐ์ค์ผ๋ก ์์ ๊ฐฑ์
๐ธ TreeMap
- NavigableMap ์ธํฐํ์ด์ค ๊ตฌํ
- ๋ด๋ถ๋ Red-Black Tree
- ์ ๋ ฌ ๊ธฐ์ค: natural order or Comparator
๐ธ ConcurrentHashMap
- ์ธ๊ทธ๋จผํธ ๊ธฐ๋ฐ ๋ฝ์์ Java 8 ์ดํ์๋ CAS("๋ด๊ฐ ์์ํ ๊ฐ์ผ ๋๋ง ๋ฐ๊พผ๋ค"๋ ์กฐ๊ฑด๋ถ ๊ฐฑ์ ์ฐ์ฐ) + Synchronized ๋ฐฉ์ ๋์
- ๋๊ธฐํ๋ฅผ ๋ณด์ฅํ๋ ๋ถ๋ถ ๋ฝ ๊ตฌ์กฐ
์ฃผ ์ฌ์ฉ ๋ฉ์๋
1. put(K key, V value)
ํค์ ๊ฐ์ ์ฝ์ ํ๊ฑฐ๋, ์ด๋ฏธ ์กด์ฌํ๋ฉด ๊ฐ์ ๋ฎ์ด์
Map<String, Integer> map = new HashMap<>();
map.put("apple", 3);
map.put("banana", 5);
2. get(Object key)
ํด๋น ํค์ ๋ํ ๊ฐ์ ๋ฐํ (์์ผ๋ฉด null)
System.out.println(map.get("apple")); // 3
System.out.println(map.get("grape")); // null
3. containsKey(Object key)
ํค๊ฐ ์กด์ฌํ๋์ง ํ์ธ
if (map.containsKey("banana")) {
System.out.println("๋ฐ๋๋ ์์");
}
4. containsValue(Object value)
ํด๋น ๊ฐ์ด ์กด์ฌํ๋์ง ํ์ธ
if (map.containsKey("banana")) {
System.out.println("๋ฐ๋๋ ์์");
}
5. remove(Object key)
ํน์ ํค ์ ๊ฑฐ
map.remove("apple"); // "apple" ์ญ์
6. keySet()
๋ชจ๋ ํค๋ฅผ Set์ผ๋ก ๋ฐํ
for (String key : map.keySet()) {
System.out.println("key: " + key);
}
7. values()
๋ชจ๋ ๊ฐ์ Collection์ผ๋ก ๋ฐํ
for (Integer value : map.values()) {
System.out.println("value: " + value);
}
8. entrySet()
ํค-๊ฐ ์์ Map.Entry๋ก ๋ฐํ (๋ฐ๋ณต๋ฌธ์ ์์ฃผ ์ฌ์ฉ)
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + " => " + entry.getValue());
}
9. getOrDefault(K key, V defaultValue)
ํค๊ฐ ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ ๋ฐํ
int count = map.getOrDefault("grape", 0); // ์์ผ๋ฉด 0 ๋ฐํ
10. replace(K key, V newValue)
ํค๊ฐ ์กด์ฌํ ๋๋ง ๊ฐ์ ๊ต์ฒด
map.replace("banana", 10); // banana → 10
11. putIfAbsent(K key, V value)
ํค๊ฐ ์์ ๋๋ง ๊ฐ์ ์ฝ์
์ฆ, ์ด๋ฏธ ํค๊ฐ ์์ผ๋ฉด ์๋ฌด๊ฒ๋ ํ์ง ์๊ณ ๊ธฐ์กด ๊ฐ์ ์ ์ง
Map<String, Integer> map = new HashMap<>();
map.put("apple", 3);
// ํค "apple"์ด ์ด๋ฏธ ์์ผ๋ฏ๋ก ๋ณ๊ฒฝ๋์ง ์์
map.putIfAbsent("apple", 10);
// ํค "banana"๋ ์์ผ๋ฏ๋ก ์๋ก ์ถ๊ฐ๋จ
map.putIfAbsent("banana", 5);
System.out.println(map); // ์ถ๋ ฅ: {apple=3, banana=5}
'Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JAVA] ์ฝ๋ ์ธ ์์ฑํ ๊ฒ๋ค (0) | 2024.07.17 |
---|---|
[JAVA] ์์ (0) | 2024.07.17 |
[JAVA] ๊ฐ์ฒด (0) | 2024.07.16 |
[JAVA] ๋ณ์ (0) | 2024.07.15 |
[JAVA] ์๋ฐ ์ ๋ฌธ (0) | 2024.07.10 |