3์ฃผ์ฐจ ์๋ฃ์ ๋ชจ๋ ํ ํฝ์ "๊ธฐ์ด โ ์์ฉ โ ์ค์ " ์์๋ก ์ฌ๋ฐฐ์ดํ ํ์ต ๊ฒฝ๋ก.
1ยท2์ฃผ์ฐจ์์ ์ปฌ๋ ์ ยทI/O๋ฅผ ๊ฐ๋ก ยท๋ด๋ถ ๊ตฌ์กฐ ์์ค์ผ๋ก ๋ดค๋ค๋ฉด,
3์ฃผ์ฐจ๋ ์ ์ฒด ๋ถ๋ฅ ์ง๋ + ์ ๋๊ตฌ(์ ๋ค๋ฆญ/์์ผ๋์นด๋/๋๋ค/์คํธ๋ฆผ) ๊น์ง ํ์ฅํ๋ค.
[Phase 1] Pass by Value ์ง์ง ์ดํด (C ํฌ์ธํฐ๋ถํฐ)
โ
[Phase 2] ์ปฌ๋ ์
ํ๋ ์์ํฌ ์ ์ฒด ์ง๋
โ โ
[Phase 3] ํด์ ์๋ฆฌ [Phase 4] ์ถ์ํ ๋๊ตฌ (์ถ์ํด๋์ค vs ์ธํฐํ์ด์ค)
โ โ
[Phase 5] ์ ๋ค๋ฆญ๊ณผ ์์ผ๋์นด๋
โ
[Phase 6] ๊ฐ์ฒด ๋น๊ต โ Comparable & Comparator
โ
[Phase 7] I/O ์์คํ
ํฐ ๊ทธ๋ฆผ (IO vs NIO)
โ
[Phase 8] Stream ์ค์ (InputStream/OutputStream/Reader/Writer)
โ
[Phase 9] I/O ๊ฐํ (Buffered/Data/Serialization)
โ
[Phase 10] ํจ์ํ ํ๋ก๊ทธ๋๋ฐ โ ๋๋ค์ ์คํธ๋ฆผ
์ด 10 Phase ร 43 Unit โ ๋ถ๋์ด ๋ง์ ํ์ผ 1์๊ฐ ร 2์ฃผ ๋๋ ์์ถ 7์ผ ์ผ์ ๊ฐ๋ฅ.
| ์์ญ | 1์ฃผ์ฐจ (๊ฐ๋ก ) | 2์ฃผ์ฐจ (๋ด๋ถ) | 3์ฃผ์ฐจ (์ ์ฒด ์ง๋ + ์ ๊ท) |
|---|---|---|---|
| Pass by value | ์๋ฐ๋ ํญ์ ๊ฐ ๋ณต์ฌ | (์์) | C ํฌ์ธํฐ๋ก ๋น๊ต + ๊ฐ์ฒด ๋งค๊ฐ๋ณ์ 2๊ฐ์ง ํจํด |
| ์ปฌ๋ ์ | ArrayList vs LinkedList | ๋ฐฐ์ด ํ์ฅ ์ ์ฑ | List/Set/Queue/Map 5๊ณ์ธต ๋ชจ๋ + Vector, HashTable, ConcurrentHashMap |
| ํด์ | LoadFactor 0.75 | (์์) | ํด์ ํจ์ยท์ถฉ๋ยท์ฒด์ด๋ยท์คํ ์ด๋๋ ์ฑ ์ง์ ๊ตฌํ |
| I/O | ๊ฐ๋ + try-with-resources | (์์) | Stream vs Channel, Blocking vs Non-blocking, BufferedStream, DataStream, ObjectStream |
| ์ ๊ท | โ | Reflection, Iterator | ์ ๋ค๋ฆญ/์์ผ๋์นด๋, Comparable/Comparator, ๋๋ค, ์คํธ๋ฆผ |
| Day | Phase | ํ์ต ๋ชฉํ |
|---|---|---|
| 1์ผ์ฐจ | Phase 1 + 2 | Pass by value ๋ง๋ฌด๋ฆฌ + ์ปฌ๋ ์ ์ ์ฒด ์ง๋ |
| 2์ผ์ฐจ | Phase 3 + 4 | ํด์ ์๋ฆฌ + ์ถ์ํด๋์ค/์ธํฐํ์ด์ค |
| 3์ผ์ฐจ | Phase 5 + 6 | ์ ๋ค๋ฆญ/์์ผ๋์นด๋/PECS + ๊ฐ์ฒด ๋น๊ต |
| 4์ผ์ฐจ | Phase 7 | I/O ์์คํ ํฐ ๊ทธ๋ฆผ |
| 5์ผ์ฐจ | Phase 8 | Stream ์ค์ ์ฝ๋ฉ |
| 6์ผ์ฐจ | Phase 9 | Buffered/Data/Serialization |
| 7์ผ์ฐจ | Phase 10 | ๋๋ค์ ์คํธ๋ฆผ ํจ์ํ |
์ฌ์ ์ผ์ (14์ผ): ๊ฐ Phase๋ฅผ 1~2์ผ์ฉ ๋ฐฐ์ ํ๋ฉด ์ฝ๋ ์ค์ต๊น์ง ์ถฉ๋ถํ ๊ฐ๋ฅ.
๋ชฉํ: 1์ฃผ์ฐจ์์ ๋ณธ "Java๋ ํญ์ ๊ฐ ๋ณต์ฌ"์ ์๋ฏธ๋ฅผ C ํฌ์ธํฐ์ ๋น๊ต ํด์ ๋ฉ๋ชจ๋ฆฌ ๋ ๋ฒจ๊น์ง ๋ด๋ ค๊ฐ ์ดํดํ๋ค.
์ ์ ์ง์: 1์ฃผ์ฐจ Phase 4 (JVM ๋ฉ๋ชจ๋ฆฌ)
ํต์ฌ ๊ฐ๋
* ๊ฐ ๋ถ์ ๋ณ์ = ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ ์ฅํ๋ ํฌ์ธํฐ ๋ณ์int *p = &a; (์ ์ ๋ณ์ a์ ์ฃผ์๋ฅผ p์ ์ ์ฅ)*p (์ญ์ฐธ์กฐ โ p๊ฐ ๊ฐ๋ฆฌํค๋ ์ฃผ์์ ์ค์ ๊ฐ)์๊ธฐ ์ ๊ฒ
&a ์ *p ์ ์๋ฏธ ์ฐจ์ด๋?์ ์ ์ง์: Unit 1.1
ํต์ฌ ๊ฐ๋
์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 1.2
ํต์ฌ ๊ฐ๋
์๋ฐ ๋งค๊ฐ๋ณ์๋ ํญ์ ๊ฐ ๋ณต์ฌ:
ํต์ฌ ํจํด 2๊ฐ์ง:
static void modify(MyObject obj) {
obj.value = 20; // โ
๊ฐ์ ๊ฐ์ฒด์ ํ๋ ๋ณ๊ฒฝ โ ํธ์ถ์์ ๋ฐ์
obj = new MyObject(30); // โ ์ง์ญ๋ณ์ obj๊ฐ ์ ๊ฐ์ฒด ๊ฐ๋ฆฌํด โ ํธ์ถ์ ๋ฌด๊ด
}
์๊ธฐ ์ ๊ฒ
arg2 = arg1 (run ๋ฉ์๋ ์์์) ์ด ํธ์ถ์์ ์ํฅ์ ๋ชป ์ฃผ๋ ์ด์ ๋?์๋ณธ ์๋ฃ: 3์ฃผ์ฐจ, Java Call by Value ์์
๋ชฉํ: 1ยท2์ฃผ์ฐจ์์ ๋ถ๋ถ์ ์ผ๋ก ๋ณธ ์ปฌ๋ ์ ์ List/Set/Queue/Map 4๋ ๊ณ์ด์ ์ ์ฒด ์ง๋ ๋ก ํ์ฅํ๋ค.
์ ์ ์ง์: 1์ฃผ์ฐจ Phase 6
ํต์ฌ ๊ฐ๋
Collection ์ธํฐํ์ด์ค: List, Set, Queue๊ฐ ์์Map์ ๋ณ๋ (key-value ๊ตฌ์กฐ)์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 2.1
ํต์ฌ ๊ฐ๋
| ๊ตฌํ์ฒด | ํน์ง | ๋ด๋ถ ๊ตฌ์กฐ |
|---|---|---|
| HashSet | ์์ ๋ณด์ฅ X, ์ค๋ณต X | HashMap ๊ธฐ๋ฐ |
| TreeSet | ์๋ ์ ๋ ฌ(0-9, A-Z, a-z), ์ค๋ณต X | Red-Black Tree |
| LinkedHashSet | ์ฝ์ ์์ ์ ์ง, ์ค๋ณต X | HashMap + LinkedList |
์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: 2์ฃผ์ฐจ Phase 5
ํต์ฌ ๊ฐ๋
| ๊ตฌํ์ฒด | ๋ด๋ถ | Thread Safe | ๋น๊ณ |
|---|---|---|---|
| ArrayList | ๋ฐฐ์ด (1.5๋ฐฐ ํ์ฅ) | โ | ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฅ ๋ง์ด ์ |
| LinkedList | ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ | โ | Queue ์ธํฐํ์ด์ค๋ ๊ตฌํ |
| Vector | ๋ฐฐ์ด (ArrayList์ ๋์ผ) | โ (synchronized) | ๋๊ธฐํ๋ก ์ธํด ๋๋ฆผ, ๊ฑฐ์ ์ ์ |
์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 2.3
ํต์ฌ ๊ฐ๋
์ฃผ์ ๋ฉ์๋ ํ์ด:
| ๋์ | ์์ (์คํจ ์ false/null) | ๊ฐ์ (์คํจ ์ ์์ธ) |
|---|---|---|
| ์ฝ์ | offer() | add() |
| ์กฐํ | peek() | element() |
| ์ ๊ฑฐ | poll() | remove() |
์์
Queue<Integer> queue = new LinkedList<>();
queue.offer(1);
queue.offer(2);
queue.poll(); // 1 ๋ฐํ ํ ์ ๊ฑฐ
queue.peek(); // 2 (์ ๊ฑฐ ์ ํจ)
์๊ธฐ ์ ๊ฒ
add() ์ offer() ์ ์ฐจ์ด๋?์ ์ ์ง์: Unit 2.4
ํต์ฌ ๊ฐ๋
| ๊ตฌํ์ฒด | ์์ | null ํ์ฉ | Thread Safe |
|---|---|---|---|
| HashMap | โ | ํค 1๊ฐ, ๊ฐ ๋ค์ | โ |
| LinkedHashMap | โ ์ฝ์ ์ | HashMap๊ณผ ๋์ผ | โ |
| TreeMap | โ ํค ์ ๋ ฌ | ๊ฐ๋ง (ํค๋ โ) | โ |
| HashTable | โ | โ (ํคยท๊ฐ ๋ชจ๋) | โ (๋ฉ์๋ ๋๊ธฐํ) |
| ConcurrentHashMap | โ | โ | โ (๋์์ฑ ์ต์ ํ) |
์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 2.1 ~ 2.5
์ ์ฒด ๊ณ์ธต:
Collection โโฌโ List โโโฌโ ArrayList
โ โโ LinkedList
โ โโ Vector
โโ Set โโโฌโ HashSet
โ โโ TreeSet
โ โโ LinkedHashSet
โโ Queue โโฌโ LinkedList (List๋ ๊ตฌํ)
โโ ArrayDeque
โโ PriorityQueue
Map (Collection X) โโฌโ HashMap
โโ LinkedHashMap
โโ TreeMap
โโ HashTable
โโ ConcurrentHashMap
์๊ธฐ ์ ๊ฒ
๋ชฉํ: HashMapยทHashSet์ ๋ด๋ถ์์ ์ผ์ด๋๋ ์ผ์ ์ง์ ๊ตฌํํด๋ณด๋ฉด์ ์ดํดํ๋ค.
์ ์ ์ง์: Phase 2
ํต์ฌ ๊ฐ๋
์์ ํด์ ํจ์:
ํด์๊ฐ = ์ด๋ฆ์ ์ฒซ ๊ธ์ ASCII % 10
Alice โ 65 % 10 = 5 (์์น 5์ ์ ์ฅ)
Bob โ 66 % 10 = 6 (์์น 6์ ์ ์ฅ)
์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 3.1
ํต์ฌ ๊ฐ๋
์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 3.2
ํต์ฌ ๊ฐ๋
Index 5 โ [("Alice", 1234), ("Alex", 5678)]ํต์ฌ ๋์ (์ง์ ๊ตฌํ):
put: ํด์๊ฐ ๊ณ์ฐ โ ๋ฒํท โ ํค ์กด์ฌํ๋ฉด ๊ฐฑ์ , ์์ผ๋ฉด ๋ฆฌ์คํธ์ ์ถ๊ฐget: ํด์๊ฐ ๊ณ์ฐ โ ๋ฒํท ํ์ โ ํค ์ผ์นํ๋ ๋
ธ๋ ๋ฐํ์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 3.3
ํต์ฌ ๊ฐ๋
์๊ธฐ ์ ๊ฒ
๋ชฉํ: ๋ ์ถ์ํ ๋๊ตฌ์ ์ ํํ ์ฐจ์ด์ ์ ํ ๊ธฐ์ค์ ์ก๋๋ค.
์ ์ ์ง์: 1์ฃผ์ฐจ Phase 2 (์์)
ํต์ฌ ๊ฐ๋
abstract ๋ช
์์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 4.1
ํต์ฌ ๊ฐ๋
public static final ์์interface Constants {
int MAX_VALUE = 100; // = public static final int MAX_VALUE = 100;
}์๊ธฐ ์ ๊ฒ
public static final ์ธ ์ด์ ๋?์ ์ ์ง์: Unit 4.2
ํต์ฌ ๊ฐ๋
default ๋ฉ์๋: ์ธ์คํด์ค ๋ฉ์๋์ฒ๋ผ ํธ์ถstatic ๋ฉ์๋: ์ธํฐํ์ด์ค๋ช
์ผ๋ก ํธ์ถinterface Vehicle {
void move();
default void start() { System.out.println("starting"); }
static void stop() { System.out.println("stopped"); }
}
์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 4.1 ~ 4.3
ํต์ฌ ๋น๊ตํ:
| ํญ๋ชฉ | ์ถ์ํด๋์ค | ์ธํฐํ์ด์ค |
|---|---|---|
| ๋ค์ค ์์ | โ | โ |
| ๊ตฌํ ๋ฉ์๋ | โ | Java 8+ default๋ง |
| ํ๋ | ์์ | public static final ๋ง |
| ์์ฑ์ | โ | โ |
| ์ฌ์ฉ ์๋ | "is-a" ๊ฐํ ๊ด๊ณ | "can-do" ๋ฅ๋ ฅ |
์ ํ ๊ฐ์ด๋:
์๊ธฐ ์ ๊ฒ
List ์ธํฐํ์ด์ค์ AbstractList ์ถ์ํด๋์ค๊ฐ ๋ ๋ค ์กด์ฌํ๋ ์ด์ ๋?๋ชฉํ: ์ ๋ค๋ฆญ์ ๋ถ๊ณต๋ณ์ฑ์ ์ดํดํ๊ณ PECS ์์น์ผ๋ก ์์ผ๋์นด๋๋ฅผ ์์ ์์ฌ๋ก ์ด๋ค.
์ ์ ์ง์: Phase 4
ํต์ฌ ๊ฐ๋
String์ Object์ ์์ โ String[]์ Object[]๋ก ์ทจ๊ธ ๊ฐ๋ฅ (๋ฐฐ์ด์ ๊ณต๋ณ)List<String>์ List<Object>๋ก ์ทจ๊ธ ๋ถ๊ฐ (์ ๋ค๋ฆญ์ ๋ถ๊ณต๋ณ)List<String> stringList = ...;
List<Object> objList = stringList; // ์ปดํ์ผ ์๋ฌ์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 5.1
ํต์ฌ ๊ฐ๋
List<?> = "์ด๋ค ํ์
์ด๋ OK"List<String>, List<Integer> ๋ชจ๋ List<?> ์ ๋์
๊ฐ๋ฅObject๋ก๋ง ๋ค๋ฃฐ ์ ์์public static void processList(List<?> list) {
for (Object item : list) {
if (item instanceof String s) { ... }
}
}
์๊ธฐ ์ ๊ฒ
List<?> ์ List<Object> ์ ์ฐจ์ด๋?List<?> ์ ์ด๋ค ์์๋ addํ ์ ์๋ ์ด์ ๋? (ํํธ: ํ์
์์ ์ฑ)์ ์ ์ง์: Unit 5.2
ํต์ฌ ๊ฐ๋
Box<? extends Fruit>: T๊ฐ Fruit์ด๊ฑฐ๋ Fruit์ ์์Box<? extends Fruit> box1 = new Box<Apple>(); // OK
Box<? extends Fruit> box2 = new Box<Banana>(); // OK
์๊ธฐ ์ ๊ฒ
extends Fruit ์ธ๋ฐ ์ add๋ ๋ชป ํ๋๊ฐ?extends๋ฅผ ์ฐ๋ ๊ฒ ์์ ํ๊ฐ?์ ์ ์ง์: Unit 5.3
ํต์ฌ ๊ฐ๋
Box<? super Fruit>: T๊ฐ Fruit์ด๊ฑฐ๋ Fruit์ ๋ถ๋ชจBox<? super Fruit> box1 = new Box<Fruit>();
Box<? super Fruit> box2 = new Box<Object>();
์๊ธฐ ์ ๊ฒ
super Fruit ์ธ๋ฐ ์ ๊บผ๋ผ ๋๋ Object๋ก๋ง ๋ฐ๋๊ฐ?์ ์ ์ง์: Unit 5.4
ํต์ฌ ๊ฐ๋
// Producer: ์ปฌ๋ ์
์์ ๊บผ๋ด๊ธฐ (extends)
void printAll(Collection<? extends B> c) {
for (B e : c) System.out.println(e);
}
// Consumer: ์ปฌ๋ ์
์ ๋ฃ๊ธฐ (super)
void addElement(Collection<? super B> c) {
c.add(new B());
}
๊ท์น ์์ฝ:
extendssuper์๊ธฐ ์ ๊ฒ
Collections.copy(dest, src) ์ ์๊ทธ๋์ฒ์์ src์ dest๋ ๊ฐ๊ฐ ์ด๋ ์ชฝ์ธ๊ฐ?๋ชฉํ: ์๋ฐ์์ ๊ฐ์ฒด์ ์ ๋ ฌ ๊ธฐ์ค์ ์ด๋ป๊ฒ ์ ์ํ๋์ง ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ์ตํ๋ค.
์ ์ ์ง์: Phase 5
ํต์ฌ ๊ฐ๋
<, > ๋ก ๋น๊ต ๊ฐ๋ฅ์๊ธฐ ์ ๊ฒ
obj1 > obj2 ๊ฐ ์๋ฐ์์ ์ปดํ์ผ ์๋ฌ์ธ ์ด์ ๋?์ ์ ์ง์: Unit 6.1
ํต์ฌ ๊ฐ๋
Comparable<T> ์ธํฐํ์ด์ค ๊ตฌํcompareTo(T o) ํ ๋ฉ์๋๋ง ์ฌ์ ์Collections.sort() ๊ฐ ์๋ ์ฌ์ฉclass Member implements Comparable<Member> {
int age;
public int compareTo(Member o) {
return this.age - o.age; // ๋์ด ์ค๋ฆ์ฐจ์
}
}
์๊ธฐ ์ ๊ฒ
Integer, String, LocalDate ๊ฐ ๋ชจ๋ Comparable์ธ ์ด์ ๋?equals() ์ compareTo() ์ ์ผ๊ด์ฑ์ ๊นจ๋ฉด ์ด๋ค ๋ฌธ์ ๊ฐ ์๊ธฐ๋๊ฐ?์ ์ ์ง์: Unit 6.2
ํต์ฌ ๊ฐ๋
Comparator<T> ์ธํฐํ์ด์คcompare(T o1, T o2) ํ ๋ฉ์๋๋ง ์ฌ์ ์Collections.sort(list, comparator), list.sort(comparator) ์ ์ ๋ฌComparator<Member> byAge = (a, b) -> a.age - b.age;
Comparator<Member> byName = Comparator.comparing(m -> m.name);
list.sort(byAge);
list.sort(byName);
์๊ธฐ ์ ๊ฒ
Comparator.reversed() ๋ ๋ฌด์์ ํ๋๊ฐ?์ ์ ์ง์: Unit 6.3
ํต์ฌ ๋น๊ต:
| ํญ๋ชฉ | Comparable | Comparator |
|---|---|---|
| ์ ์ ์์น | ํด๋์ค ๋ด๋ถ | ํด๋์ค ์ธ๋ถ |
| ๋ฉ์๋ | compareTo(T o) | compare(T o1, T o2) |
| ๋น๊ต ๋์ | this vs ๋งค๊ฐ๋ณ์ | ๋งค๊ฐ๋ณ์ 1 vs ๋งค๊ฐ๋ณ์ 2 |
| ์ ๋ ฌ ๊ธฐ์ค ์ | 1๊ฐ (๊ธฐ๋ณธ) | ๋ฌด์ ํ |
์ ํ ๊ฐ์ด๋:
๋ชฉํ: I/O์ ์ ์ฒด ํ๊ฒฝ(IO vs NIO, Stream vs Channel, Blocking vs Non-blocking)์ ์ก๋๋ค.
์ ์ ์ง์: 1์ฃผ์ฐจ Phase 7
ํต์ฌ ๊ฐ๋
์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 7.1
ํต์ฌ ๊ฐ๋
| ๊ตฌ๋ถ | IO (Java 1.0~) | NIO (Java 1.4+) | NIO.2 (Java 7+) |
|---|---|---|---|
| ๋จ์ | ์คํธ๋ฆผ (1๋ฐ์ดํธ์ฉ) | ์ฑ๋ + ๋ฒํผ (๋ธ๋ก) | ์ฑ๋ + ๋ฒํผ |
| ๋ฐฉํฅ | ๋จ๋ฐฉํฅ (In/Out ๋ถ๋ฆฌ) | ์๋ฐฉํฅ | ์๋ฐฉํฅ |
| Blocking | ํญ์ Blocking | Non-blocking ๊ฐ๋ฅ | Non-blocking ๊ฐ๋ฅ |
| ํ์ผ API | File ํด๋์ค | FileChannel | Files (static), Path |
File vs Files ํต์ฌ ์ฐจ์ด:
File: ๊ฐ์ฒด ์์ฑ ํ์, ์ฌ๋ณผ๋ฆญ ๋งํฌ ๋ฑ ์ผ๋ถ ๊ธฐ๋ฅ ๋ถ์ฌFiles: ๋ชจ๋ ๋ฉ์๋ static, ํ๋ถํ API์๊ธฐ ์ ๊ฒ
File ์ด "๊ฐ์ฒด ์์ฑ ํ ์ฌ์ฉ"์ธ ๋ฐ ๋นํด Files ๊ฐ "static"์ธ ๊ฒ ์ด๋ค ์ฅ์ ์ ์ฃผ๋๊ฐ?์ ์ ์ง์: Unit 7.2
ํต์ฌ ๊ฐ๋
| ํญ๋ชฉ | Stream (IO) | Channel (NIO) |
|---|---|---|
| ๋ฐ์ดํฐ ๋จ์ | byte / byte[] | Buffer (๋ธ๋ก) |
| ๋ฐฉํฅ | ๋จ๋ฐฉํฅ (In ๋๋ Out) | ์๋ฐฉํฅ |
| ๋ฒํผ | ๊ธฐ๋ณธ non-buffer (๋ณด์กฐ ์คํธ๋ฆผ์ผ๋ก ์ถ๊ฐ) | ํญ์ Buffer ํตํด์ |
| ๋์ | Blocking | Blocking ๋๋ Non-blocking |
ํต์ฌ ํฌ์ธํธ
์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 7.3
ํต์ฌ ๊ฐ๋
Blocking IO:
read() ํธ์ถ โ ๋ฐ์ดํฐ๊ฐ ์ฌ ๋๊น์ง ์ค๋ ๋ ์ ์งNon-blocking NIO:
์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 7.4
ํต์ฌ ๊ฐ๋
์ค๋ฒํค๋:
File ๊ฐ์ฒด (์ ํต IO):
File file = new File(path, fileName);
file.createNewFile(); // ํ์ผ ์์ฑ
file.getAbsolutePath(); // ์ ๋๊ฒฝ๋ก
file.getCanonicalPath(); // ์ ๊ทํ๋ ๊ฒฝ๋ก
file.getName(); // ํ์ผ๋ช
file.getParent(); // ๋ถ๋ชจ ๋๋ ํฐ๋ฆฌ
์๊ธฐ ์ ๊ฒ
๋ชฉํ: ๋ฐ์ดํธ ์คํธ๋ฆผ๊ณผ ๋ฌธ์ ์คํธ๋ฆผ์ ์ฐจ์ด๋ฅผ ์์ ์ตํ๊ณ ํ๊ธ ์ฒ๋ฆฌ๊น์ง ์์ ๋กญ๊ฒ ํ๋ค.
์ ์ ์ง์: Phase 7
ํต์ฌ ๊ฐ๋
System.in = ํ์ค ์
๋ ฅ ์คํธ๋ฆผ (๋ณดํต ํค๋ณด๋)InputStream ํ์
read() ๋ 1๋ฐ์ดํธ์ฉ ์ฝ์ํ๊ธ์ด ์ ๋๋ ์ด์ :
read() ํ ๋ฒ์ผ๋ก๋ ๊นจ์ง์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 8.1
ํต์ฌ ๊ฐ๋
InputStream์ ์์ํ ํ์ผ ์ ์ฉ ๋ฐ์ดํธ ์คํธ๋ฆผread(): 1๋ฐ์ดํธ ์ฝ๊ธฐ (๋ฐํ์ int)-1 ๋ฐํtry (FileInputStream fis = new FileInputStream("input.txt")) {
int b;
while ((b = fis.read()) != -1) {
System.out.print((char) b);
}
}
์๊ธฐ ์ ๊ฒ
read() ์ ๋ฐํ ํ์
์ด byte๊ฐ ์๋๋ผ int์ธ ์ด์ ๋? (ํํธ: -1์ ์ด๋ป๊ฒ ํํ?)์ ์ ์ง์: Unit 8.2
ํต์ฌ ๊ฐ๋
byte[] ๋ฒํผ๋ก ํ ๋ฒ์ ์ฌ๋ฌ ๋ฐ์ดํธread(byte[] buf) ๋ ์ฝ์ ๋ฐ์ดํธ ์ ๋ฐํbyte[] buf = new byte[10];
int n;
while ((n = fis.read(buf)) != -1) {
for (int k = 0; k < n; k++) { // โ n๊น์ง๋ง! buf.length๊ฐ ์๋
System.out.print((char) buf[k]);
}
}
์๊ธฐ ์ ๊ฒ
for (byte b : buf) ๋ก ์ํํ๋ฉด ๋ง์ง๋ง์ ์ด๋ค ๋ฌธ์ ๊ฐ ์๊ธฐ๋๊ฐ?์ ์ ์ง์: Unit 8.3
ํต์ฌ ๊ฐ๋
OutputStream์ ์์write(int b): 1๋ฐ์ดํธ ์ฐ๊ธฐnew FileOutputStream(path, true) โ ์ด์ด์ฐ๊ธฐ ๋ชจ๋try (FileOutputStream fos = new FileOutputStream("output.txt", true)) {
fos.write(65); // 'A'
fos.write(66); // 'B'
}
๋ฐ์ดํธ๊ฐ ์์ด๋ก ๋ณด์ด๋ ์ด์ :
์๊ธฐ ์ ๊ฒ
write(byte) ๋ก 1๋ฐ์ดํธ์ฉ ์ฐ๋ฉด ์ ๊นจ์ง๋๊ฐ?์ ์ ์ง์: Unit 8.4
ํต์ฌ ๊ฐ๋
๋ ๊ฐ์ง ๋ฐฉ๋ฒ:
// ๋ฐฉ๋ฒ 1: FileReader (์ง์ )
try (FileReader fr = new FileReader("reader.txt")) {
int c;
while ((c = fr.read()) != -1) System.out.print((char) c);
}
// ๋ฐฉ๋ฒ 2: InputStreamReader (๋ณด์กฐ ์คํธ๋ฆผ)
try (FileInputStream fis = new FileInputStream("reader.txt");
InputStreamReader isr = new InputStreamReader(fis)) {
int c;
while ((c = isr.read()) != -1) System.out.print((char) c);
}
์๊ธฐ ์ ๊ฒ
FileReader ์ InputStreamReader ์ ์ฐจ์ด๋?์ ์ ์ง์: Unit 8.5
ํต์ฌ ๊ฐ๋
Writer ์ ํ์ผ์ฉ ๊ตฌํ์ฒดwrite(int), write(char[]), write(String), write(char[], offset, length) ๋ค์try (FileWriter fw = new FileWriter("writer.txt")) {
fw.write('A');
fw.write(new char[]{'B', 'C', 'D'});
fw.write("์๋
ํ์ธ์");
}
์๊ธฐ ์ ๊ฒ
FileWriter ์ FileOutputStream ์ ํ๊ธ ๋ฐ์ดํฐ์ ๊ฐ๊ฐ ์ฐ๋ฉด ๊ฒฐ๊ณผ๋?๋ชฉํ: ๊ธฐ๋ณธ ์คํธ๋ฆผ์ ๋ณด์กฐ ์คํธ๋ฆผ์ ์ ํ ์ฑ๋ฅยทํธ์์ฑยท๊ตฌ์กฐํ๋ฅผ ๋ชจ๋ ์ก๋๋ค.
์ ์ ์ง์: 1์ฃผ์ฐจ Phase 7
ํต์ฌ ๊ฐ๋
try (์์์ ์ธ) ๊ตฌ๋ฌธclose() ํธ์ถAutoCloseable ์ธํฐํ์ด์ค ๊ตฌํtry (FileInputStream fis = new FileInputStream("a.txt");
FileOutputStream fos = new FileOutputStream("b.txt")) {
// ...
} // fos.close() โ fis.close() ์์ผ๋ก ํธ์ถ
์๊ธฐ ์ ๊ฒ
finally ๋ธ๋ก์์ close ํ๋ ๊ฒ๋ณด๋ค try-with-resources๊ฐ ๋ ์์ ํ ์ด์ ๋?์ ์ ์ง์: Phase 8
ํต์ฌ ๊ฐ๋
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dst))) {
byte[] buf = new byte[1024];
int n;
while ((n = bis.read(buf)) != -1) bos.write(buf, 0, n);
}
์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 9.2
ํต์ฌ ๊ฐ๋
int, double, boolean, String)์ ํ์
๋ณ๋ก ์ ์ฅ/์ฝ๊ธฐDataStream ์์ด (CSV ๋ฐฉ์):
writer.write(name + "," + age + "," + score); // ๋งค๋ฒ ํ์ฑ ํ์
DataStream ์ฌ์ฉ:
dos.writeUTF(name);
dos.writeInt(age);
dos.writeDouble(score);
// ์ฝ์ ๋
String name = dis.readUTF();
int age = dis.readInt();
double score = dis.readDouble();
์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: 1์ฃผ์ฐจ Phase 7 + Unit 9.3
ํต์ฌ ๊ฐ๋
Serializable (๋ง์ปค ์ธํฐํ์ด์ค) ๊ตฌํObjectOutputStream.writeObject(obj) / ObjectInputStream.readObject()transient ํ๋๋ ์ง๋ ฌํ ์ ์ธ (1์ฃผ์ฐจ์ ํ์ต)์์:
class Person implements Serializable {
String name;
transient String job; // ์ ์ธ๋จ
}
oos.writeObject(personLee); // ์ ์ฅ
Person p = (Person) ois.readObject(); // ๋ณต์
์๊ธฐ ์ ๊ฒ
transient ๊ฐ ์ ์ฉ๋ ํ๋๋ ์ญ์ง๋ ฌํ ํ ์ด๋ค ๊ฐ์ด ๋๋๊ฐ?์ ์ ์ง์: Unit 9.4
ํต์ฌ ๊ฐ๋
public class MyClass implements Serializable {
private static final long serialVersionUID = 1L;
// ...
}
์๊ธฐ ์ ๊ฒ
serialVersionUID ๋ช
์ ๋๋ฝ์ด ์ด๋ค ์ฌ๊ณ ๋ก ์ด์ด์ง๋๊ฐ?serialVersionUID ๋๋ฝ์ ๊ฒฝ๊ณ ๋ฅผ ๋์ฐ๋ ์ด์ ๋?๋ชฉํ: ํจ์๋ฅผ ๊ฐ์ผ๋ก ๋ค๋ฃจ๋ ์ ํจ๋ฌ๋ค์์ผ๋ก ์ปฌ๋ ์ ์ฒ๋ฆฌ๋ฅผ ์ ์ธ์ ์ผ๋ก ํ๋ค.
์ ์ ์ง์: Phase 4
ํต์ฌ ๊ฐ๋
@FunctionalInterface ์ด๋
ธํ
์ด์
(๊ฐ์ ๊ฒ์ฆ)์๋ฐ ํ์ค ํจ์ํ ์ธํฐํ์ด์ค:
| ์ธํฐํ์ด์ค | ์๊ทธ๋์ฒ | ์ฉ๋ |
|---|---|---|
Function<T, R> | R apply(T) | ๋ณํ |
Predicate<T> | boolean test(T) | ์กฐ๊ฑด |
Consumer<T> | void accept(T) | ์๋น |
Supplier<T> | T get() | ๊ณต๊ธ |
์๊ธฐ ์ ๊ฒ
Runnable, Comparator, Comparable ๋ ํจ์ํ ์ธํฐํ์ด์ค์ธ๊ฐ?์ ์ ์ง์: Unit 10.1
ํต์ฌ ๊ฐ๋
// ์ ํต: ์ต๋ช
ํด๋์ค
Comparator<Integer> c1 = new Comparator<Integer>() {
public int compare(Integer a, Integer b) { return a - b; }
};
// ๋๋ค
Comparator<Integer> c2 = (a, b) -> a - b;
์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 10.2, Phase 2
ํต์ฌ ๊ฐ๋
์ค๊ฐ ์ฐ์ฐ (Stream ๋ฐํ):
filter, map, sorted, distinct, limit, skip์ต์ข ์ฐ์ฐ (๊ฐ ๋๋ void ๋ฐํ):
forEach, collect, count, reduce, anyMatchsList.stream()
.filter(s -> s.length() > 3)
.map(String::toUpperCase)
.sorted()
.forEach(System.out::println);
์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 10.3
ํต์ฌ ํจํด:
// 1. ํํฐ๋ง + ๋ณํ + ์์ง
List<Integer> lengths = sList.stream()
.filter(s -> !s.isEmpty())
.map(String::length)
.collect(Collectors.toList());
// 2. ํต๊ณ
int total = nums.stream().mapToInt(Integer::intValue).sum();
double avg = nums.stream().mapToInt(Integer::intValue).average().orElse(0);
// 3. ๊ทธ๋ฃนํ
Map<Integer, List<String>> byLength = sList.stream()
.collect(Collectors.groupingBy(String::length));
์๊ธฐ ์ ๊ฒ
stream() ๊ณผ parallelStream() ์ ์ฐจ์ด์ ์ฃผ์์ ์?Collectors.toList() ์ .toList() (Java 16+)์ ์ฐจ์ด๋?*p์ &a ์ ์๋ฏธ๋ฅผ ์ค๋ช
ํ๋ผarg2 = arg1 ๊ฐ ํธ์ถ์์ ์ํฅ์ ์ ์ฃผ๋ ์ด์ ๋ฅผ ์คํ ํ๋ ์์ผ๋ก ์ค๋ช
ํ๋ผpublic static final ์ธ ์ด์ ๋?List<String> ์ด List<Object> ๊ฐ ์๋ ์ด์ ๋?Box<? extends Fruit> ์ add๋ฅผ ๋ชป ํ๋ ์ด์ ๋?compareTo ์ ๋ฐํ๊ฐ ๊ท์น์?read() 1๋ฐ์ดํธ๋ก๋ ์ ์ฝํ๋ ์ด์ ๋?serialVersionUID ๋ฅผ ๋ช
์ํด์ผ ํ๋ ์ด์ ๋?๋ฐ๋์ ๊น์ด ํ๊ธฐ:
[ ] Phase 1 โ Pass by Value ์ ๋ณต (Unit 1.1~1.3)
[ ] Phase 2 โ ์ปฌ๋ ์
์ ์ฒด ์ง๋ (Unit 2.1~2.6)
[ ] Phase 3 โ ํด์์ ์๋ฆฌ (Unit 3.1~3.4)
[ ] Phase 4 โ ์ถ์ํด๋์ค vs ์ธํฐํ์ด์ค (Unit 4.1~4.4)
[ ] Phase 5 โ ์ ๋ค๋ฆญ๊ณผ ์์ผ๋์นด๋ (Unit 5.1~5.5)
[ ] Phase 6 โ ๊ฐ์ฒด ๋น๊ต (Unit 6.1~6.4)
[ ] Phase 7 โ I/O ์์คํ
ํฐ ๊ทธ๋ฆผ (Unit 7.1~7.5)
[ ] Phase 8 โ Stream ์ค์ (Unit 8.1~8.6)
[ ] Phase 9 โ I/O ๊ฐํ (Unit 9.1~9.5)
[ ] Phase 10 โ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ (Unit 10.1~10.4)
[ ] ์ข
ํฉ ์๊ธฐ ์ ๊ฒ 31๋ฌธํญ ํต๊ณผ