Java - YunByungKwan/Fundamental GitHub Wiki
์ปดํ์ผ ๊ณผ์
๋จผ์ ์๋ฐ ์ฝ๋(.java)๋ฅผ ๋น๋ํ๊ฒ ๋๋ฉด ์๋ฐ ์ปดํ์ผ๋ฌ์ ์ํด์ ๋ฐ์ดํธ ์ฝ๋(.class)๋ก ๋ณํ๋ฉ๋๋ค.
๋ฐํ์ ๊ณผ์
์ดํ JVM์ ํด๋์ค ๋ก๋๊ฐ ๋ณํ๋ ๋ฐ์ดํธ ์ฝ๋๋ฅผ JVM์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ฌ๋ ค๋์ต๋๋ค. ์ด๋ ํด๋์ค ๋ก๋๋ ํ์ํ ๋ค๋ฅธ ํด๋์ค ํ์ผ๋ค๋ ํจ๊ป ๊ฐ์ ธ์ต๋๋ค.
์ดํ Byte Code Verifier๊ฐ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๊ฒ์ฆํ๋ ์ ์ฐจ๋ฅผ ๊ฑฐ์นฉ๋๋ค.
์ดํ ์ธํฐํ๋ฆฌํฐ๊ฐ ํ์ค ํ์ค ์ฝ์ด์ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ฐ์ด๋๋ฆฌ ์ฝ๋๋ก ๋ณํํฉ๋๋ค.
GC๋ JVM์ Heap ์์ญ์์ ์ฌ์ฉํ์ง ์๋ ๊ฐ์ฒด๋ฅผ ์ญ์ ํ๋ ํ๋ก์ธ์ค๋ฅผ ๋งํฉ๋๋ค.
GC๋ Mark and Sweep ์๊ณ ๋ฆฌ์ฆ์ ๊ธฐ๋ฐ์ผ๋ก ๋์ํฉ๋๋ค.
- Mark๋ GC Root๋ก๋ถํฐ ๋ชจ๋ ๋ณ์๋ฅผ ์ค์บํ๋ฉด์ ์ฐธ์กฐ๋๊ณ ์๋ ๊ฐ์ฒด๋ฅผ ๋งํนํ๋ ๊ณผ์ ์ ๋งํฉ๋๋ค.
์ด๋ ์ฐธ์กฐ๋๊ณ ์๋ reachableํ ๊ฐ์ฒด์ ์ฐธ์กฐ๋๊ณ ์์ง ์์ unreachableํ ๊ฐ์ฒด๋ก ๋๋ฉ๋๋ค.
- Sweep์ ์ด Unreachableํ ๊ฐ์ฒด๋ค์ Heap์์ ์ ๊ฑฐํ๋ ๊ณผ์ ์ ๋งํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ ํ์ ์ผ๋ก Compact ๊ณผ์ ์ด ์ํ๋ฉ๋๋ค. Compact๋ Sweep ์ดํ ๋ถ์ฐ๋ ๊ฐ์ฒด๋ค์ Heap์ ์์ ์ฃผ์๋ก ๋ชจ์์ ๋ฉ๋ชจ๋ฆฌ ๋จํธํ๋ฅผ ๋ง์์ค๋๋ค.
๊ทธ๋ฆฌ๊ณ GC๋ minor GC์ major GC๊ฐ ์์ต๋๋ค.
- minor GC๋ Eden์์ญ์ด ๊ฝ ์ฐผ์๋ ๋ฐ์ํ๋ GC๋ฅผ ๋งํฉ๋๋ค. Minor GC ํ ์ด์๋จ์ ๊ฐ์ฒด๋ค์ Eden์์ Survivor์์ญ์ผ๋ก ์ด๋ํฉ๋๋ค.
survivor1๊ณผ 2๋ ๋ ์ค์ ํ๋๋ง ์จ์ผ ํ๊ณ , survivor1์ ์๋ ๊ฐ์ฒด๋ค์ ๋ค์ GC๋ survivor2๋ก ์ด๋ํ๊ณ age๊ฐ ํ๋ ์ฆ๊ฐํฉ๋๋ค.
- major GC๋ Old generation์์ญ์ด ๊ฝ ์ฐผ์๋ ๋ฐ์ํ๋ GC๋ฅผ ๋งํฉ๋๋ค. Survivor์์ญ์์ age๊ฐ ์๊ณ์น์ ๋๋ฌํ ๊ฐ์ฒด๋ค์ด Old generation์์ญ์ผ๋ก ๋์ด์ค๊ณ , ์ด ๊ฐ์ฒด๋ค์ด ์ ๊ฑฐ๋๋ ๊ณผ์ ์ major GC๋ผ๊ณ ํฉ๋๋ค.
GC์ ์ข ๋ฅ๋ก๋ 5๊ฐ์ง ์ ๋๊ฐ ์์ต๋๋ค.
- Serial GC: ์ฑ๊ธ์ฐ๋ ๋๋ก ๋์ํ๋ GC์ด๊ณ ๋ค๋ฅธ GC์ ๋นํด stop-the-world ์๊ฐ์ด ๊น๋๋ค.(Mark Sweep, Compact์๊ณ ๋ฆฌ์ฆ ์ฌ์ฉ)
- Parallel GC: Java 8์ ๊ธฐ๋ณธ GC. Young์์ญ์ GC๋ฅผ ๋ฉํฐ์ฐ๋ ๋๋ก ์ํ.
- Parallel Old GC: Old์์ญ์์๋ ๋ฉํฐ์ฐ๋ ๋๋ก GC ์ํ. Mark-Summary-Compact ์๊ณ ๋ฆฌ์ฆ ์ฌ์ฉ.
- sweep: ๋จ์ผ์ฐ๋ ๋๊ฐ old์์ญ ์ ์ฒด๋ฅผ ํ๋๋ค.
- summary: ๋ฉํฐ์ฐ๋ ๋๊ฐ old์์ญ์ ๋ถ๋ฆฌํด์ ํ๋๋ค.
- CMS GC(Concurrent Mark Sweep): stop-the-world์๊ฐ์ ์ค์ด๊ธฐ ์ํด ๊ณ ์๋ ๊ฒ์ผ๋ก ์๊ณ ์์ต๋๋ค.
- G1 GC(Garbage First): Java 9์ด์์ ๊ธฐ๋ณธ GC. Heap์ ์ผ์ ํ ํฌ๊ธฐ์ Region์ผ๋ก ๋๋. Region๋จ์๋ก ํ์. Compact ์งํ
JVM์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ Method Area, Heap Area, Stack Area, PC Register, Native method stack ์ผ๋ก ๋๋ฉ๋๋ค.(๋ฉํ์คํผ๋ค)
์ด๋ค ์ค์์ Heap Area๋ ๋ค์ young generation๊ณผ old generation์ผ๋ก ๋๋ฉ๋๋ค.
young generation์๋ Eden, survivor1, survivor2 ์์ญ์ด ์๊ณ , old generation์๋ old, permanent ์์ญ์ด ์์ต๋๋ค.
Young Generation์ ์๋ก์ด ๊ฐ์ฒด๋ค์ด ํ ๋น๋๋ ์์ญ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ Eden๊ณผ Survivor0, Survivor1 ์์ญ์ผ๋ก ๋ค์ ๋๋ฉ๋๋ค.
- Eden: ์๋ก์ด ๊ฐ์ฒด๊ฐ ํ ๋น๋๋ ์์ญ. Eden์ด ๊ฝ์ฐจ๋ฉด Minor GC ๋ฐ์
- Survivor0/1: Eden์์ ์ด์๋จ์ ๊ฐ์ฒด๋ค์ด ์ฌ๊ธฐ๋ก ์ด๋ํจ. Survivor0๊ณผ 1์ ๋ฒ๊ฐ์๊ฐ๋ฉด์ ์ด๋ํ๋ค.
Old Generation์ young generation์์ ์ค๋ซ๋์ ์ด์๋จ์ ๊ฐ์ฒด๋ค์ด ์กด์ฌํ๋ ์์ญ์ ๋งํฉ๋๋ค.
- ๋์ผ์ฑ(identity)์ ๋ ๊ฐ์ฒด์ ์ฃผ์๊ฐ์ด ๊ฐ์์ง ๋น๊ตํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
- ๋๋ฑ์ฑ(equality)์ ๋ ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ด ๊ฐ์์ง ๋น๊ตํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
public class Object {
// equals ํจ์
public boolean equals(Object obj) {
return (this == obj);
}
// hashCode ํจ์
public native int hashCode();
}
cf ) ์๋ฐ์ ํญ๋ฑ ์ฐ์ฐ์(โ==โ)๋ ์์ ํ์
(Primitive Type)์ ๊ฒฝ์ฐ ๊ฐ์ ๋น๊ตํ๊ณ , ์ฐธ์กฐ ํ์
(Reference Type)์ ๊ฒฝ์ฐ ์ฃผ์๊ฐ์ ๋น๊ตํ๋ค.
equals() ํจ์๋ Object ํด๋์ค์ ์๋ ํจ์์ด๊ณ ๋ ๊ฐ์ฒด์ ๋ด์ฉ์ด ๊ฐ์์ง ๋๋ฑ์ฑ(equality)์ ๋น๊ตํ๋ ํจ์์
๋๋ค.
์ค๋ฒ๋ผ์ด๋ฉํ์ง ์์ ๊ฒฝ์ฐ Object์ equals() ํจ์๋ ==์ฐ์ฐ์๋ก ๋ ๊ฐ์ฒด์ ์ฃผ์๊ฐ์ ๋น๊ตํฉ๋๋ค.
๊ทธ๋์ ๋ ๊ฐ์ฒด์ ์ฃผ์๊ฐ์ด ์๋ ๋ด์ฉ์ ๋น๊ตํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ค๋ฒ๋ผ์ด๋ฉํด์ ์ฌ์ ์ํ์ฌ ์ฌ์ฉํฉ๋๋ค.
์ด๋ equals()ํจ์๋ฅผ ์ฌ์ ์ํ๋ค๋ฉด hashCode()ํจ์๋ ์ฌ์ ์๊ฐ ํ์ํฉ๋๋ค.
hashCode()ํจ์๋ ๊ฐ์ฒด์ ์ฃผ์๊ฐ์ ๋ณํํ์ฌ ์์ฑํ ์ ์๊ฐ์
๋๋ค.
hashCode()ํจ์๋ ๋ ๊ฐ์ฒด๊ฐ ๊ฐ์ ๊ฐ์ฒด์ธ์ง, ๋์ผ์ฑ(identity)์ ๋น๊ตํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
Hash์ ๊ด๋ จ๋ Collection์ ๊ฒฝ์ฐ, ๊ฐ์ฒด์ ์๋ฏธ์์ ๋๋ฑ์ฑ ๋น๊ต๋ฅผ ์ํด์ hashCode()๋ฅผ ํธ์ถํฉ๋๋ค.
- equals()๊ฐ true์ผ ๊ฒฝ์ฐ, hashCode() ๊ฐ๋ ๊ฐ์์ผ ํ๋ค.
- equals()๊ฐ false์ผ ๊ฒฝ์ฐ, hashCode() ๊ฐ์ ๋ค๋ฅผ์๋, ๊ฐ์์๋ ์๋ค. ๊ทธ๋ฌ๋ ์ฑ๋ฅ์ ์ํด์๋ hashCode() ๊ฐ์ด ๋ค๋ฅธ๊ฒ์ด ๋ซ๋ค. ๊ทธ๋์ผ ํด์ฑ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก Set ์ ํด๋น ์ค๋ธ์ ํธ๊ฐ ์กด์ฌํ๋์ง ์๋์ง ๋น ๋ฅด๊ฒ ๊ฒ์ํ ์ ์๋ค.
- hashCode()๊ฐ์ด ๊ฐ๋ค๊ณ ํด์ eqauls()๊ฐ true๋ฅผ ๋ฆฌํดํ๋ ๊ฒ์ ์๋๋ค. ํด์ฑ ์๊ณ ๋ฆฌ์ฆ ์์ฒด์ ๋ฌธ์ ๋ก, ๊ฐ์ ํด์๊ฐ์ด ๋์ฌ ์ ์๋ค.
String vs StringBuilder/StringBuffer์ ์ฐจ์ด์ ์ String์ ๋ถ๋ณ(immutable)์ด๊ณ , StringBuilder/StringBuffer๋ ๊ฐ๋ณ(mutable)์ด๋ผ๋ ์ ์ด๋ค.
String์ ๋ถ๋ณ์ด๊ธฐ ๋๋ฌธ์ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ์์ ํ๋ค.(Thread-safe)
StringBuilder vs StringBuffer์ ์ฐจ์ด์ ์ synchronizeed ํค์๋์ ์ ๋ฌด์ด๋ค.
StringBuffer ํด๋์ค์ ๊ฑฐ์ ๋ชจ๋ ํจ์์๋ synchronized ํค์๋๊ฐ ๋ถ์ด ์๋ค.
๋ฐ๋ผ์ StringBuffer๋ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ์์ ํ์ง๋ง(Thread-safe), StringBuilder๋ ๊ทธ๋ ์ง ์๋ค.
๊ทธ ๋์ , ์ฑ๋ฅ์ StringBuilder๊ฐ StringBuffer๋ณด๋ค ๋ ์ข๋ค.
์๋ฐ์ synchronized
ํค์๋๋ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์
์ค๋ ๋ ๋๊ธฐํ ์์ผ์ ๊ณต์ ๋๋ ๋ฐ์ดํฐ์ ๋ํด Thread-safeํ๋๋ก ๋ณด์ฅํด์ค๋๋ค.
์๋ฐ์ final ํค์๋๋ ๋ถ๋ณ ์ํ์์ ๋ณด์ฅํ๋ ํค์๋์
๋๋ค.
- final ํค์๋๋ฅผ ๋ณ์๋ ํจ์์ ์ธ์๋ก ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
- final ํค์๋๋ฅผ ๋ฉ์๋์ ์ฌ์ฉํ ๊ฒฝ์ฐ, ํด๋น ๋ฉ์๋๋ override๊ฐ ๋ถ๊ฐ๋ฅํ๊ฒ ๋ฉ๋๋ค.
- final ํค์๋๋ฅผ ํด๋์ค์ ์ฌ์ฉํ ๊ฒฝ์ฐ, ํด๋น ํด๋์ค๋ ๋ค๋ฅธ ํด๋์ค๊ฐ ์์ํ ์ ์๋ ํด๋์ค๊ฐ ๋ฉ๋๋ค.
volatile ํค์๋๋ ๋ณ์๋ฅผ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ค๋ ์๋ฏธ์
๋๋ค.
์์ฆ์ ํ๋ก์ธ์๋ค์ ์๋์ ์ผ๋ก ์ต์ ํ๋ฅผ ์งํํ๋๋ฐ
๊ทธ ์ค์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ ๋ณ๊ฒฝํ๊ณ ์ด๊ฑธ ๋ฉ๋ชจ๋ฆฌ์ ๋ค์ ์
๋ฐ์ดํธํ๋ ๊ฒ์ด ์๋๋ผ
CPU์ ๋ ์ง์คํฐ๋ ์บ์์ ์ ์ฅ์ ํ ๋ค์ ๋ฉ๋ชจ๋ฆฌ์ ์๋๋ค. ์ด๋ ๊ฒ ํ๋ ์ด์ ๋ CPU๋ฅผ ์ฌ์ฉํ๋ ๊ฒ RAM๋ณด๋ค ๋น ๋ฅด๊ธฐ ๋๋ฌธ์
๋๋ค.
๊ทธ๋์ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์๋ ๊ณต์ ๋ณ์์ ๋ํ์ฌ ๋ฐ์ดํฐ์ ๋ถ์ผ์น ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๊ทธ๋์ ๊ณต์ ๋ณ์๋ฅผ volatile๋ก ์ ์ธํ๋ฉด ๋ถ์ผ์น๋ฅผ ์ด๋ ์ ๋ ๋ง์ ์ ์๊ณ ์.
ํ๊ณ์ ์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ๋ณ๊ฒฝ์ ์๋ํ ๊ฒฝ์ฐ ์ฌ์ ํ ๋ฐ์ดํฐ ์ผ์น๋ฅผ ๋ณด์ฅํ ์ ์๋ค๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ฐ๋ ๋ํ์ ์ฐ๋ ๋๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ์ํด ์ฌ๋ฌ ์ฐ๋ ๋๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํด ๋์ ์ฐ๋ ๋ ์งํฉ์ ๋งํฉ๋๋ค.
์ฐ๋ ๋ํ์ ๋์ ์๋ฆฌ๋ ์ฌ์ฉ์์ ์์
์์ฒญ(Runnable ๋๋ Callable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด)์
์์
ํ(BlockingQueue)์ ๋ฃ๊ณ ํ์์ ์์
์ ๊บผ๋ด์ ๋ฏธ๋ฆฌ ์์ฑํด ๋์ ์ฐ๋ ๋๋ค์๊ฒ ํ ๋นํ๋ ๋ฐฉ์์
๋๋ค.
(ExecutorService ์ฌ์ฉ์ ํด์ ๋ ํด์ผ ํจ-> ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐ์ํ ์ ์์)
์ฐ๋ ๋ํ์ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ฐ๋ณต์ ์ผ๋ก ์ฐ๋ ๋๋ฅผ ์์ฑ/์๊ฑฐํ๋ ๋ฐ ๋๋ ๋น์ฉ์ ์ค์ผ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
(์์ฑ ์ ์คํ ์์ญ์ ํ ๋นํด์ผ ํ๋ ๋น์ฉ)
๊ทธ๋ฆฌ๊ณ ์ฐ๋ ๋๊ฐ ๋ฏธ๋ฆฌ ์ค๋น๋์ด ์์ด์ ๋๋ ์ด ๋ฐ์์ ์ค์ผ ์ ์์ต๋๋ค.
๋จ์ ์ผ๋ก๋ ์ฌ๋ฌ ์ฐ๋ ๋ ์ค์ ์งง์ ํ์คํฌ๋ฅผ ํ ๋น๋ฐ์ ์ฐ๋ ๋๋ ์์
์ ๋ง์น๊ณ ๋ค๋ฅธ ์ฐ๋ ๋๊ฐ ์ผํ๋ ๋์ ๋๊ฒ ๋๋ ๋จ์ ์ด ์์ต๋๋ค.
๊ธฐ์กด ์ฐ๋ ๋ํ์ ๊ฐ์ ํ๊ธฐ ์ํ ์ฐ๋ ๋ํ์
๋๋ค.
๊ธฐ์กด ์ฐ๋ ๋ํ์ ๋ฌธ์ ์ ์ ์๋ฅผ ๋ค์ด ์ฐ๋ ๋ํ์ 3๊ฐ์ ์ฐ๋ ๋๊ฐ ์๊ณ ๊ฐ๊ฐ ์์
์ ํ ๋น ๋ฐ์์ ๋
1๋ฒ ์ฐ๋ ๋๊ฐ ํ ๋น ๋ฐ์ ์์
์ด ๋นจ๋ฆฌ ๋๋ฌ๊ณ ์ดํ ์์
์ด ์๋ค๋ฉด 1๋ฒ ์ฐ๋ ๋๋ ๋๊ฒ ๋๋ ๋ฌธ์ ์ ์ด ์์ต๋๋ค.
ForkJoinPool์ ์์ ์์์ฒ๋ผ ์ฐ๋ ๋ํ์ 3๊ฐ์ ์ฐ๋ ๋๊ฐ ์์ ๋ ๋จผ์ 1๋ฒ ์ฐ๋ ๋๊ฐ ์์
์ ๊ฐ์ ธ๊ฐ์ ๋ถํ ํฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ๋๊ณ ์๋ 2๋ฒ ์ฐ๋ ๋๊ฐ 1๋ฒ ์ฐ๋ ๋์ ๋ถํ ๋ ์์
์ ๊ฐ์ ธ๊ฐ๋ ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค.
๊ทธ๋์ ๊ธฐ์กด ์ฐ๋ ๋ํ๋ณด๋ค ๋ญ๋น๋๋ ์ฐ๋ ๋๋ฅผ ์ค์ผ ์ ์๋ ์ฅ์ ์ด ์์ต๋๋ค.
- ExecutorService๋ ํ์คํฌ๋ฅผ ์ค์ผ์ค๋งํ๊ณ ํด๋น ํ ์คํฌ๋ฅผ ์ํํ ์ค๋ ๋๋ฅผ ์ ํํด ์คํํ๋ค. (ํ์คํฌ๋ฅผ ์ค๋ ๋์ ๋งคํํ ๋ฟ๋ง ์๋๋ผ ํ์คํฌ์ ๊ฒฐ๊ณผ, ์์ธ, ์ทจ์๊น์ง ์ฒ๋ฆฌํจ)
- Executorsํด๋์ค์๋ ์ค์ผ์ค๋ง ์ ์ฑ
์ด ์๋ก ๋ค๋ฅธ executorService๋ฅผ ๋ง๋๋ ํฉํ ๋ฆฌ ๋ฉ์๋๊ฐ ์๋ค.
- ์๋ฅผ ๋ค์ด executor = Executors.newCachedThreadPool();
- Runnable์ ํ์คํฌ๋ฅผ ์ํํ์ง๋ง ๊ฐ์ ๋ฆฌํดํ์ง ์๋๋ค. ๋ฆฌํด๊ฐ์ด ํ์ํ ๊ฒฝ์ฐ Callable ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ค.
- Callableํ์คํฌ๋ฅผ ์ ์ถํ๋ฉด ํจ์ฒ(future)๋ฅผ ์ป๋๋ค.
ExecutorService executor = Executors.newFixedThreadPool(); Callable<V> task = ...; Future<V> result = executor.submit(task);
- Future์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ CompletableFuture ํด๋์ค๋ ๋ธ๋กํน ์์ด ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ ์ฆ์ ์ฒ๋ฆฌํ ์ ์๋ค.
staticํค์๋๋ฅผ ์ฌ์ฉํ ๋ณ์๋ ํจ์๋ ํด๋์ค ๋ก๋๊ฐ ํด๋์ค๋ฅผ ๋ก๋ฉํด์ ๋ฉ์๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ ์ฌํ ๋ ํจ๊ป ์ฌ๋ผ๊ฐ๋๋ค.
๋ฐ๋ผ์ ํด๋์ค ๋ก๋ฉ์ด ๋๋๋ ์ฆ์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
static ๋ณ์๋ static์์ญ์ ์ ์ฅ๋๋ฉฐ ๋ชจ๋ ๊ฐ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๊ณ , GC๊ฐ ๊ด์ฌ๋ฅผ ์ํฉ๋๋ค.
์ธ์คํด์ค ๋ณ์๋ heap์์ญ์ ํ ๋น๋๋ฉฐ GC๊ฐ ๊ด๋ฆฌํฉ๋๋ค.
ํด๋์ค๋ฅผ ์ค๊ณํ ๋ ๋ฉค๋ฒ ๋ณ์ ์ค ๋ชจ๋ ์ธ์คํด์ค์ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉํด์ผ ํ๋ ๋ณ์๊ฐ ์๋ค๋ฉด static ํค์๋๋ฅผ ๋ถ์
๋๋ค.
๋ํ, ๋ฉ์๋ ๋ด์์ ์ธ์คํด์ค ๋ณ์๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด static์ ๋ถ์ด๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํฉ๋๋ค.
Method Area์ ์์นํ๊ฒ ๋ฉ๋๋ค.
Error๋ ์์คํ
๋ ๋ฒจ์์ ๋ฐ์ํ๋ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ์ด๋ ์คํ์ค๋ฒํ๋ก์ฐ์ ๊ฐ์ด ๋ฐ์ํ๋ฉด ๋ณต๊ตฌํ ์ ์๋ ์ฌ๊ฐํ ์ค๋ฅ๋ฅผ ๋งํ๊ณ , Exception์ ๋ฐ์ํ๋๋ผ๋ ์์ตํ ์ ์๋ ๋น๊ต์ ๋ ์ฌ๊ฐํ ์ค๋ฅ์
๋๋ค.
Error์ ์ํฉ์ ๋ฏธ๋ฆฌ ๋ฏธ์ฐ์ ๋ฐฉ์งํ๊ธฐ ์ํด์ Exception ์ํฉ์ ๋ง๋ค ์ ์์ผ๋ฉฐ, ์๋ฐ์์๋ try-catch๋ฌธ์ผ๋ก Exception handling์ ํ ์ ์์ต๋๋ค.
Checked Exception์ ์์ธ์ฒ๋ฆฌ๊ฐ ํ์์ด๋ฉฐ ์ฒ๋ฆฌํ์ง ์์ผ๋ฉด ์ปดํ์ผ๋์ง ์์ต๋๋ค.
์์๋ก๋ IOException, SQLException ๋ฑ์ด ์์ต๋๋ค.
Unchecked Exception์ ์ปดํ์ผ ๋ ์ฒดํฌ๋์ง ์๊ณ , ๋ฐํ์์ ๋ฐ์ํ๋ Exception์ ๋งํฉ๋๋ค.
์์๋ก๋ NullPointerException ๋ฑ์ด ์์ต๋๋ค.
Try-catch๋ฌธ์ ํตํด์ ์ง์ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํ๋ ๋ฐฉ์๊ณผ
throws exception์ ์ด์ฉํด์ ๋ฐ์ํ๋ ์์ธ์ ์ฑ
์์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ์ชฝ์ผ๋ก ๋๊ธฐ๋ ๋ฐฉ์์ด ์์ต๋๋ค.
- stop-the-world: GC๋ฅผ ์คํํ๋ ์ฐ๋ ๋ ์ธ์ ๋ชจ๋ ์ฐ๋ ๋๊ฐ ์์ ์ ์ค๋จํ๋ ํ์
- java์ sort()ํจ์์ด๊ณ , mergesort๋ก ๊ตฌํ๋์ด ์์ต๋๋ค.
์๊ฐ๋ณต์ก๋๋ O(NlogN)์ ๋๋ค. ๋ง์ฝ input ์์๋ค์ด ๋๋ต์ ์ผ๋ก ์ ๋ ฌ๋์ด ์์ ๊ฒฝ์ฐ์๋ O(N)์ ๋๋ค.
- HashSet์ ๋ด๋ถ์ ์ผ๋ก HashMap์ผ๋ก ๊ตฌํ๋์ด ์์ต๋๋ค.
- HashSet์ contains()ํจ์๋ HashMap์ containsKey()ํจ์๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
-
Java์ HashMap์ key, value๊ฐ์ null๊ฐ์ ํ์ฉํฉ๋๋ค.
HashMap<String, String> map = new HashMap<>(); map.put(null, null); // ๊ฐ๋ฅํจ
์ฝํ๋ฆฐ์ ์๋๊ณ ๊ฐ๋ฅํ๊ฒ ํ๋ ค๋ฉด HashMap์ ๋ฐ์ดํฐํ์ ์ด nullableํ์ ์ด์ด์ผ ํฉ๋๋ค.
val map1 = HashMap<String, String>() // ์ฌ๊ธฐ๋ ๋ถ๊ฐ๋ฅ val map2 = HashMap<String?, String?>() // ์ฌ๊ธฐ๋ ๊ฐ๋ฅ
-
๋๊ธฐํ ์ง์์ ํ์ง ์์ต๋๋ค.
-
์์๋ค์ ์์๋ฅผ ๋ณด์ฅํด์ฃผ์ง ์์ต๋๋ค. (์์๊ฐ ๋ค์ด์จ ์์๋๋ก ์ ์ฅํ์ง ์์)
-
get() ํจ์: O(1), put() ํจ์: O(1), containsKey() ํจ์: O(1)
-
์ฐธ๊ณ : https://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html
- Red-Black Tree๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
์๋ฐ์ == ์ฐ์ฐ์๋ ์์ ํ์
์ ๊ฒฝ์ฐ ๊ฐ์ ๋น๊ตํ๊ณ , ์ฐธ์กฐ ํ์
์ ๊ฒฝ์ฐ์๋ ๋ ๊ฐ์ฒด์ ์ฃผ์๊ฐ์ ๋น๊ตํ๋ ์ฐ์ฐ์์
๋๋ค.
2๊ฐ์ง๊ฐ ์์ต๋๋ค. ์ฒซ๋ฒ์งธ๋ Thread ํด๋์ค๋ฅผ ์์ํ๋ ๋ฐฉ๋ฒ์ด๊ณ ๋๋ฒ์งธ๋ Runnable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
// ๋ฐ์๋ ์ฐธ๊ณ
Runnable ์ธํฐํ์ด์ค๋ run() ์ถ์ ๋ฉ์๋๋ฅผ ํ๋๋ง ๊ฐ๋ ํจ์ํ ์ธํฐํ์ด์ค์
๋๋ค.
- Thread ํด๋์ค ์์
public class MyThread extends Thread {
@Override
public void run() {
// ...
}
}
// ๋ฉ์ธ
MyThread thread1 = new MyThread();
thread1.start();
- Runnable ์ธํฐํ์ด์ค ๊ตฌํ
public class MyRunnable implements Runnable {
@Override
public void run() {
// ...
}
}
// ๋ฉ์ธ
MyRunnable runnable = new MyRunnable();
Thread thread= new Thread(runnable);
thread.start();
๋ฆฌํ๋ ์
์ ๊ตฌ์ฒด์ ์ธ ํด๋์ค ํ์
์ ์์ง ๋ชปํด๋ ๊ทธ ํด๋์ค์ ๋ฉ์๋, ํ์
, ๋ณ์ ๋ฑ์ ์ ๊ทผํ ์ ์๋๋ก ๋์์ฃผ๋ API๋ฅผ ๋งํฉ๋๋ค.
new String()์ผ๋ก ์์ฑํ ๊ฒฝ์ฐ ๋ฌธ์์ด์ heap ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ํ ๋น๋ฉ๋๋ค.
๋ฐ๋ฉด์ ""(String literal)์ ๊ฒฝ์ฐ Heap ๋ฉ๋ชจ๋ฆฌ ์์ญ ์ค String Constant Pool์ ์์ฑ๋๋ฉฐ,
๊ฐ์ ๋ฌธ์์ด์ ์์ฑํ ๊ฒฝ์ฐ ๊ฐ์ ๊ณณ์ ์ฐธ์กฐํ๊ฒ ๋ฉ๋๋ค.
์๋ฐ์ ์์ํ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ธฐ๋ณธ ๋จ์๋ก 8๊ฐ๊ฐ ์์ต๋๋ค. ์์ํ์ ์ด ์๋ ๋ชจ๋ ํ์ ์ ๋ณ์๋ ๊ฐ์ฒด์ ์ฃผ์๊ฐ์ ๊ฐ์ง ์ฐธ์กฐ ๋ณ์์ ๋๋ค. ๋ํผํด๋์ค๋ ์์ํ์ ์ ๊ฐ์ฒดํ์์ผ ์ฃผ๋ ํด๋์ค์ ๋๋ค.
๋ฐ์ฑ(Boxing)์ ์์ํ์
์ ๋ณ์๋ฅผ ๊ฐ์ฒด๋ก ๋ณํํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
์ธ๋ฐ์ฑ(UnBoxing)์ ๋ํผ ํด๋์ค์ ์๋ ๊ฐ์ ๋ค์ ์์ํ์
์ผ๋ก ํ๋ณํํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
Integer num = new Integer(17); // ๋ฐ์ฑ
int n = num.intValue(); // ์ธ๋ฐ์ฑ
์๋ฐ์ ์ ๊ทผ ์ ํ์๋ ํฌ๊ฒ 4๊ฐ์ง์ ๋๋ค.
- private: ๋ชจ๋ ์ธ๋ถ ํด๋์ค๋ private ๋ฉค๋ฒ์ ์ ๊ทผํ ์ ์์ต๋๋ค.
- package-private: ๊ฐ์ ํจํค์ง์ ์์ ๊ฒฝ์ฐ์๋ง ์ ๊ทผํ ์ ์์ต๋๋ค. ๋ช ์์ ์ผ๋ก ์ ๊ทผ ์ ํ์๋ฅผ ์ง์ ํ์ง ์์์ ๋ ์ง์ ๋ฉ๋๋ค.
- protected: ๊ฐ์ ํจํค์ง ๋ด์์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๊ณ ๋ค๋ฅธ ํจํค์ง์์ ์ ๊ทผํ๋ ค๋ฉด ์์์ ํด์ผ ํฉ๋๋ค.
- public: ๋ชจ๋ ๊ณณ์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
- ์ค๋ฒ๋ก๋ฉ์ ๊ฐ์ ์ด๋ฆ์ ๋ฉ์๋๋ฅผ ๋งค๊ฐ ๋ณ์์ ํ์ ์ด๋ ๊ฐ์๋ฅผ ๋ฌ๋ฆฌํ์ฌ ์ฌ๋ฌ ๊ฐ ์ ์ํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
- ์ค๋ฒ๋ผ์ด๋ฉ์ ์์ ํด๋์ค๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ฉ์๋๋ฅผ ํ์ ํด๋์ค์์ ์ฌ์ ์ํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
์
์บ์คํ
์ ์๋ธ ํด๋์ค์ ๊ฐ์ฒด๊ฐ ์ํผ ํด๋์ค ํ์
์ผ๋ก ํ๋ณํ๋๋ ๊ฒ์ ๋งํฉ๋๋ค.
Ex) Person person = student; // Person์ด ๋ถ๋ชจ ํด๋์ค, Student๊ฐ ์์ ํด๋์ค
๋ค์ด์บ์คํ
์ ์
์บ์คํ
๋ ๊ฐ์ฒด๋ฅผ ๋ค์ ๋ณต๊ตฌํ๋ ๊ฒ์ ๋งํฉ๋๋ค. ๋ค์ด์บ์คํ
์ ๋ช
์์ ์ธ ํ๋ณํ์ด ํ์ํฉ๋๋ค.
Ex) Person person = new Student();
Student student = (Student) person;
- ์ธ์คํด์ค ๋ณ์๋ ํด๋์ค ์์ญ์ ์ ์ธ๋ ๋ณ์๋ก ์ธ์คํด์ค๊ฐ ์์ฑ๋ ๋ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋ฉ๋๋ค. ๊ฐ ์ธ์คํด์ค๋ง๋ค ๊ณ ์ ์ ๊ฐ์ ๊ฐ์ ธ์ผ ํ ๊ฒฝ์ฐ ์ธ์คํด์ค ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ํด๋์ค ๋ณ์๋ ์ธ์คํด์ค ๋ณ์์ staticํค์๋๊ฐ ๋ถ์ ๊ฒฝ์ฐ์ ๋๋ค. ํด๋์ค ๋ณ์์ ๊ฒฝ์ฐ ๋ชจ๋ ์ธ์คํด์ค๊ฐ ๊ณตํต๋ ๊ฐ์ ๊ณต์ ํ๊ฒ ๋ฉ๋๋ค. ํด๋์ค ๋ณ์๋ ํด๋์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๋ ๊ฐ์ด ํ ๋น๋ฉ๋๋ค. (๋ฉ๋ชจ๋ฆฌ์ ๋ฑ ํ๋ฒ ์ฌ๋ผ๊ฐ)
- ์ง์ญ ๋ณ์๋ ๋ฉ์๋๊ฐ ์คํ๋ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ์ผ๋ฉฐ, ๋ฉ์๋๊ฐ ๋๋๋ฉด ์๋ฉธ๋ฉ๋๋ค.
- ์ธ์คํด์ค ๋ฉ์๋๋ ์ธ์คํด์ค๊ฐ ์์ฑํด์ผ๋ง ํธ์ถ ๊ฐ๋ฅํฉ๋๋ค.
- ํด๋์ค ๋ฉ์๋(static)์ ์ธ์คํด์ค ์์ฑ ์์ด ํธ์ถ ๊ฐ๋ฅํฉ๋๋ค. ๋ํ, ํด๋์ค ๋ฉ์๋๋ ์ธ์คํด์ค ๋ณ์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
public class Test {
int var1; // ์ธ์คํด์ค ๋ณ์
static int var2; // ํด๋์ค ๋ณ์
public void func1() {
int var3; // ์ง์ญ ๋ณ์
}
}
์ธํฐํ์ด์ค(interface)์ ์ถ์ํด๋์ค(abstract class)์ ๋ํ ์ค๋ช ๊ณผ ์ธ์ ์ฌ์ฉํ๋์ง
์ธํฐํ์ด์ค๋ ๊ธฐ๋ณธ ์ค๊ณ๋๋ผ๊ณ ํ ์ ์์ต๋๋ค. ๊ตฌํ์ด ํ์ํ ๋ฉ์๋๋ค์ ์ ์ํ๋ฉฐ, ์๋ฐ8๋ถํฐ๋ defaultํค์๋๋ฅผ ํตํด ๊ตฌํ๋ ๊ฐ๋ฅํฉ๋๋ค.
์ถ์ํด๋์ค๋ ๋ฏธ์์ฑ ์ค๊ณ๋๋ผ๊ณ ํ ์ ์์ต๋๋ค. abstractํค์๋๋ฅผ ์ฌ์ฉํด์ ์ ์ํฉ๋๋ค.
์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์ฌ๋ฌ ํด๋์ค๋ค์ด ๊ณตํต๋ ์ด๋ค ๊ธฐ๋ฅ์ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ธํฐํ์ด์ค๋ก ๊ณตํต๋ ๊ธฐ๋ฅ์ ์ ์ํ๊ณ ๊ฐ๊ฐ ํด๋์ค์ ๋ง๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
์ถ์ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์ญ์ ๊ณตํต๋ ๊ธฐ๋ฅ์ ๊ฐ๋๋ค๋ฉด ์ถ์ํด๋์ค๋ฅผ ์์ํด์ ์ฌ์ฉํฉ๋๋ค.
๋๊ฐ๋ฅผ ๋๋ ๋์ ์ด์ ๋ ์๋ฐ๊ฐ ๋ค์ค ์์์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ถ์ํด๋์ค๋ง์ผ๋ก ๋ฌถ์ ์ ์๋ ๋ค๋ฅธ ๊ณตํต ๊ธฐ๋ฅ๋ค์ ์ธํฐํ์ด์ค๋ฅผ ํตํด์ ๋ฌถ์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
synchronized๋ ๋๊ธฐํํ ๋ ์ฌ์ฉ๋๋ ํค์๋์
๋๋ค.
synchronized ๋ธ๋ก์ ๋ง๋ค๊ฑฐ๋ ๋ฉ์๋์ ๋ถ์ฌ์ ์ฌ์ฉํ๋ฉฐ
์ด๋ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ํ ์ค๋ ๋๋ง ์ ๊ทผํ ์ ์์์ ๋ณด์ฅํด์ค๋๋ค.
synchronized(obj) {
// ์๊ณ ์์ญ
}
// ๋ ๋ค ๊ฐ์ ์ฝ๋
obj.intrinsicLock.lock();
try {
// ์๊ณ ์์ญ
} finally {
obj.intrinsicLock.unlock();
}
-
๋ฉ์๋์ ์ฌ์ฉํ ๊ฒฝ์ฐ๋ ์๋์ ๊ฐ๋ค
public synchronized void method() { // ... } // ๋ ๋ค ๊ฐ์ ์ฝ๋ public void method() { this.intrinsicLock.lock(); try { // ... } finally { this.intrinsicLock.unlock(); } }