๐ง๐ป๐ป ๊ธ์ ์์ํ๊ธฐ์ ์์..
- ์ ์ ๊ฐ๋ฐ์ ์ธํฐ๋ทฐ์์ ์์ฃผ ๋์ค๋ ์ง๋ฌธ์ ๋ชจ์ ํ ๋ฒ์ ์ ๋ฆฌํ ํฌ์คํธ์ ๋๋ค.
- ์ ์ ๊ฐ๋ฐ์ ๊ธฐ์ ๋ฉด์ ์ ์ค๋นํ๋ ์ฌ๋์ผ๋ก, ์ ํํ์ง ์์ ์ ๋ณด๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค. ๋ ์ฌ๋ฐ๋ฅธ ๋ต์ ์๊ณ ์๋ค๋ฉด ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์๋ฉด ๋ฐ์ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
๐ง๐ป๐ป ์๋ฐ ๋ฉด์ ์ง๋ฌธ
๐ก Java์ ์ฅ๋จ์ ์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
- JVM ์์์ ์คํ๋๊ธฐ ๋๋ฌธ์ OS์ ์ข ์์ ์ด์ง ์๊ณ , ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋ ์ ์์ต๋๋ค.
- ๊ฐ์ฒด์งํฅ ์ธ์ด๋ก, ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ํด๋์ค๋ก๋์ ์ํด ๋์ ๋ก๋ฉ์ ์ง์ํฉ๋๋ค. ์คํ ์ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ, ํ์ํ ์์ ์ ํด๋์ค๋ฅผ ์์ฑํฉ๋๋ค.
- ๋ฐ์ดํธ์ฝ๋๋ก ๋ณํํ๊ณ , JVM์ ์ํด ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญ๋๋ฏ๋ก ํ ๋ฒ์ ์ปดํ์ผ๋ง์ ๊ฑฐ์น๋ ์ธ์ด์ ๋นํด์ ์กฐ๊ธ ๋๋ฆฝ๋๋ค.
๐ก JVM์ด ๋ฌด์์ธ์ง ์ค๋ช ํด์ฃผ์ธ์.
JVM์ Java Virtual Machine์ ์ค์๋ง๋ก, OS์ Java Application ์ฌ์ด๋ฅผ ์ค์ฌํด์ฃผ๋ ๊ฐ์ ๋จธ์ ์ ๋๋ค.
JVM์ ํฌ๊ฒ ์คํ์ ํ์ํ ํด๋์ค๋ฅผ Runtime Data Area๋ก ๋งํน ํ๊ณ ๋ก๋ฉ์ ํด์ฃผ๋ ClassLoader, ์ค์ ์คํ๊ณผ ๋ฒ์ญ์ ๋ด๋นํ๋ Execution Engine, ๋ณ๋์ ์ฐ๋ ๋๋ก์จ ํ ๋ฉ๋ชจ๋ฆฌ์ ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ์ญ์ ํ๋ Garbage Collector, ๊ฐ ๋ฉ๋ชจ๋ฆฌ ์์ญ ๋ฐ ์ฐ๋ ๋๊ฐ ๋ด๊ฒจ์๋ Runtime Data Area๋ก ๊ตฌ์ฑ์ด ๋์ด์์ต๋๋ค.
๐ก Java Application์ด JVM์์ ์คํ๋๋ ๊ณผ์ ์ ์ค๋ช ํด์ฃผ์ธ์.
1) JVM์ OS๋ก๋ถํฐ ์ ๋นํ ๋ฉ๋ชจ๋ฆฌ(Runtime Data Area)๋ฅผ ํ ๋น ๋ฐ์.
2) ์๋ฐ ์์ค ์ฝ๋(.java)๋ฅผ ์๋ฐ ์ปดํ์ผ๋ฌ(javac)์ ์ํด ๋ฐ์ดํธ์ฝ๋(.class)ํ์ผ๋ก ๋ณํ
3) Class Loader๋ฅผ ํตํด .class ํ์ผ์ Runtime Data Area๋ก ๋ก๋ฉ
4) ๋ก๋ฉ๋ class ํ์ผ์ Execution Engine์ ํตํด ํด์ ๋ฐ ์คํ
๐ก JVM์ ๋ฉ๋ชจ๋ฆฌ(Runtime Data Area)๊ตฌ์กฐ์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
- ๋ฉ์๋(static) ์์ญ
- ํด๋์ค๊ฐ ์ฌ์ฉ๋๋ฉด ํด๋น ํด๋์ค์ ํ์ผ(.class)์ ์ฝ์ด๋ค์ฌ, ํด๋์ค์ ๋ํ ์ ๋ณด(๋ฐ์ดํธ ์ฝ๋)๋ฅผ ๋ฉ์๋ ์์ญ์ ์ ์ฅ
- ํด๋์ค์ ์ธํฐํ์ด์ค, ๋ฉ์๋, ํ๋, static ๋ณ์, final ๋ณ์ ๋ฑ์ด ์ ์ฅ๋๋ ์์ญ์ ๋๋ค.
- JVM ์คํ ์์ญ
- ์ค๋ ๋๋ง๋ค ์กด์ฌํ์ฌ ์ค๋ ๋๊ฐ ์์ํ ๋๋ง๋ค ํ ๋น
- ์ง์ญ๋ณ์, ๋งค๊ฐ๋ณ์, ์ฐ์ฐ ์ค ๋ฐ์ํ๋ ์์ ๋ฐ์ดํฐ ์ ์ฅ
- ๋ฉ์๋ ํธ์ถ ์๋ง๋ค ๊ฐ๋ณ์ ์คํ ์์ฑ
- JVM ํ ์์ญ
- ๋ฐํ์ ์ ๋์ ์ผ๋ก ํ ๋นํ์ฌ ์ฌ์ฉํ๋ ์์ญ
- new ์ฐ์ฐ์๋ก ์์ฑ๋ ๊ฐ์ฒด์ ๋ฐฐ์ด ์ ์ฅ
- ์ฐธ์กฐ๊ฐ ์๋ ๊ฐ์ฒด๋ GC(๊ฐ๋น์ง ์ปฌ๋ ํฐ)์ ๋์
- pc register
- ์ฐ๋ ๋๊ฐ ํ์ฌ ์คํํ ์คํ ํ๋ ์์ ์ฃผ์๋ฅผ ์ ์ฅ
- Native Method Stack
- C/C++ ๋ฑ์ Low level ์ฝ๋๋ฅผ ์คํํ๋ ์คํ
๐ก Garbage Collector๊ฐ ๋ฌด์์ธ์ง, ์ด๋ป๊ฒ ๋์ํ๋์ง ์ค๋ช ํด์ฃผ์ธ์.
๋์ ์ผ๋ก ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ ์์ญ ์ค, ์ฌ์ฉํ์ง ์๋ ์์ญ์ ํ์งํด ํด์ ํ๋ ์ญํ ์ ํฉ๋๋ค.
Java์์ ๋์ ๋ณ์๋ฅผ ํ ๋นํ๋ ์์ญ์ Heap ์์ญ์ด๋ฏ๋ก, JVM์ GC์ ์๋ ๋์์ Heap ๋ฉ๋ชจ๋ฆฌ์ ๋๋ค.
๊ธฐ์กด์ ์ฐธ์กฐ ๋ณ์์ ์ฐธ์กฐ ๋ณ์๊ฐ ๊ฐ๋ฆฌํค๋ ๋์ ๋ณ์ ๊ด๊ณ์์ ์ฐธ์กฐ ๋ณ์๊ฐ ํจ์ ์ข ๋ฃ์ ์ํด pop๋๊ณ ๋๋ฉด ํ ์์ญ์ ๋์ ๋ณ์๋ง ๋จ๋๋ฐ, ์ด๋ฌํ ๋ณ์๋ฅผ Unreachable Object๋ผ๊ณ ํํํ๊ณ , ์ด ๋ณ์๊ฐ GC์ ๊ด๋ฆฌ ๋์์ด ๋ฉ๋๋ค.
GC๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฅ๋จ์ ์ด ์์ต๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐฉ์ง
- ํด์ ๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ํด ์ ๊ทผํ๋ ๊ฒ์ ๋ฐฉ์ง
- ํด์ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ค์ ํด์ ํ๋ ๊ฒ์ ๋ฐฉ์ง
- ๊ฐ๋ฐ์๊ฐ ์ผ์ผํ ๋์ ๋ณ์์ ์ ๊ฑฐ ์ ์ธ์ ํ์ง ์์๋ ๋จ
- ๊ทธ๋ฌ๋, ๊ฐ๋ฐ์๊ฐ GC๊ฐ ์ธ์ ์ํ๋๋์ง ์ ํํ๊ฒ ์ ์ ์์
- ์คํ ์ค์ธ ์์ ์ ์ค๋จํ๊ณ , ๋ฆฌ์์ค๋ฅผ GC ์์ ์ ๋ด์ค์ผ ํ๋ฏ๋ก ์ค๋ฒํค๋ ๋ฐ์
Java๋ Mark and Sweep ๋ฐฉ์์ผ๋ก GC๋ฅผ ์งํํฉ๋๋ค. (๊ทธ๋ฆผ์์ ๋์จ Root Space๋ GC์ ์์์ง๋ก Stack, native method stack, method area๋ฅผ ์๋ฏธํฉ๋๋ค.)
Stack์ ๋ชจ๋ ๋ณ์๋ฅผ ์ค์บํ๋ฉด์ ์ด๋ค ํ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋์ง ๋งํนํฉ๋๋ค. ๋งํนํ๊ณ ์๋ ๊ฐ์ฒด๊ฐ ์ฐธ์กฐํ๊ณ ์๋ ๊ฐ์ฒด ๋ํ ๋งํนํฉ๋๋ค. ๋งํนํ์ง ์์ ๊ฐ์ฒด๋ฅผ Heap์์ ์ ๊ฑฐํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
๐ก Java์์, ==์ equals์ ์ฐจ์ด๋ ๋ฌด์์ธ์ง ์๊ณ ๊ณ์๋์?
'==' ์ฐ์ฐ์ ์ฐธ์กฐ ๋น๊ต๋ก, ๋ ๊ฐ์ฒด๊ฐ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ฐ๋ฆฌํค๋ ์ง๋ฅผ ํ์ธํ๋ ์ฐ์ฐ์ ๋๋ค.
'equals' ์ฐ์ฐ์, ๋ ๊ฐ์ฒด์ ๋ด๋ถ ๊ฐ์ด ๊ฐ์ ์ง ๋ด์ฉ์ ๋น๊ตํฉ๋๋ค. ๊ธฐ๋ณธ ํ์ ์ ๋ํด์๋ ์ฌ์ฉํ ์ ์๊ณ , ๊ฐ์ฒด ๋น๊ต์ overrideํด์ ์ํ๋ ๋ฐฉ์์ผ๋ก ์์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
== : ๋ณธ์ง๊น์ง ๊ฐ์. (๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ด์ ๋ฐ์ดํฐ) / equals : ๊ฐ๋ง ๊ฐ์.
๐ก Java์ ์ ๊ทผ ์ ํ์์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
- public : ์ ๊ทผ์ ์ ํ์ด ์์
- private : ์๊ธฐ ์์ ํด๋์ค ๋ด์์๋ง ์ ๊ทผ ๊ฐ๋ฅ
- default : ๋์ผํ ํจํค์ง ๋ด์์๋ง ์ ๊ทผ ๊ฐ๋ฅ
- protected : ๋์ผํ ํจํค์ง ๋ด์์๋ง ์ ๊ทผ ๊ฐ๋ฅ + ์์์ ์ด์ฉํ ์ ๊ทผ ๊ฐ๋ฅ
๐ก Java์์์ ๋ฐ์ดํฐ ํ์ ์ ๋ฌด์์ด ์๋์?
- ์์์๋ฃํ ํ์
(Primitive Type)
- ๊ธฐ๋ณธ ํ์ ์ ํฌ๊ธฐ๊ฐ ์๊ณ ๊ณ ์ ์ ์ด๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ Stack ์์ญ ์ ์ ์ฅ๋ฉ๋๋ค.
- ์ ์ํ : byte, short, int, long
- ์ค์ํ : float, double
- ๋ ผ๋ฆฌํ : boolean
- ๋ฌธ์ํ : char
- ์ฐธ์กฐ ํ์
(Reference Type)
- ์์์๋ฃํ์ ์ ์ธํ๊ณ ๋ ๋ชจ๋ ์ฐธ์กฐํ์ด๋ค.
- String๊ณผ ๋ฐ์ฑ ํ์ ์ธ Integer ๋ฑ์ด ์์ต๋๋ค.
- ์ฐธ์กฐ ํ์ ์ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๊ฐ ๊ฐ๋ณ์ ์ด๊ณ , ๋์ ์ด๋ฏ๋ก Heap ์์ญ ์์ ๊ด๋ฆฌ๋ฉ๋๋ค.
- ๋ฐ์ดํฐ๋ Heap ์์ญ์์ ๊ด๋ฆฌ๋์ง๋ง ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์๊ฐ์ Stack ์์ญ์ ๋ด๊น๋๋ค.
- new ํค์๋๋ฅผ ์ด์ฉํด ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ๋ฐ์ดํฐ๊ฐ ์์ฑ๋ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๋ ํ์
- String๊ณผ ๋ฐฐ์ด์ ์ผ๋ฐ์ ์ธ ์ฐธ์กฐ ํ์ ๊ณผ ๋ฌ๋ฆฌ new ์์ด ์์ฑ ๊ฐ๋ฅํ์ง๋ง ์ฐธ์กฐํ์ ์ ๋๋ค.
- ๋ ์ด์ ์ฐธ์กฐํ๋ ๋ณ์๊ฐ ์์ ๋ GC์ ์ํด ์ญ์ ๋ฉ๋๋ค.
๐ก Java์ hashcode()์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
๋ ๊ฐ์ฒด๊ฐ ๋์ผํ ๊ฐ์ฒด์ธ์ง ๋น๊ตํ ๋ ์ฌ์ฉํ๊ณ , Heap ์์ญ์ ์ ์ฅ๋ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ฐํํฉ๋๋ค.
๐ก Java์ Wrapper Class์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
์์์๋ฃํ ํ์ ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด๋ก ์ทจ๊ธํด์ผ ํ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ ํด๋์ค๋ก, ๊ธฐ๋ณธ ํ์ ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด๋ก ๋ณํํด์ฃผ๋ ํด๋์ค์ ๋๋ค.
์ฐ์ ์ฐ์ฐ์ ์ํด ์ ์๋ ํด๋์ค๊ฐ ์๋๋ฏ๋ก, ์ธ์คํด์ค ๋ด์ ๊ฐ์ ๋ณ๊ฒฝํ ์๋ ์์ต๋๋ค.
์์์๋ฃํ | ๋ํผํด๋์ค |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
๐ก Boxing๊ณผ, UnBoxing์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
๊ธฐ๋ณธ ํ์ ์ ๋ณ์๋ฅผ ๋ํผํด๋์ค์ ์ธ์คํด์ค๋ก ๋ณ๊ฒฝํ๋ ๊ณผ์ ์ ๋ฐ์ฑ, ๋ํผํด๋์ค์ ์ธ์คํฐ์ค๋ฅผ ๋ค์ ๊ธฐ๋ณธ ํ์ ์ผ๋ก ๊บผ๋ด๋ ๊ณผ์ ์ ์ธ๋ฐ์ฑ์ด๋ผ๊ณ ํฉ๋๋ค.
- ๋ํผ ํด๋์ค ๋ด์ ๊ฐ์ ๋น๊ตํ ๊ฒฝ์ฐ์๋ ==์ ์ฌ์ฉํด์ผ ํ ๊น? equals๋ฅผ ์ฌ์ฉํด์ผ ํ ๊น?
== ์ ์ฌ์ฉํ๋ฉด ์ฐธ์กฐ ๋น๊ต๋ฅผ ์ํํด ๊ฐ์ ๋น๊ตํ์ง ์์ต๋๋ค. equals๋ฅผ ์ฌ์ฉํ๋ฉด ์ธ์คํด์ค ๋ด์ ๊ฐ์ ๋น๊ตํฉ๋๋ค.
public class Wrapper03 {
public static void main(String[] args) {
Integer num1 = new Integer(10);
Integer num2 = new Integer(20);
Integer num3 = new Integer(10);
System.out.println(num1 < num2); // true
System.out.println(num1 == num3); // false
System.out.println(num1.equals(num3)); // true
Integer num = new Integer(17); // ๋ฐ์ฑ
int n = num.intValue(); // ์ธ๋ฐ์ฑ
System.out.println(n); // ์ถ๋ ฅ ๊ฐ: 17
Character ch = 'X'; // Character ch = new Character('X'); : ์คํ ๋ฐ์ฑ
char c = ch; // char c = ch.charValue(); : ์คํ ์ธ๋ฐ์ฑ
System.out.println(c); // ์ถ๋ ฅ ๊ฐ: X
}
}
๐ก Java์ static ๋ณ์์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
ํด๋์ค๋น ํ๋๋ง ์์ฑ๋๊ณ , ๋์ผํ ํด๋์ค์ ๋ชจ๋ ๊ฐ์ฒด๋ค์ ์ํด ๊ณต์ ๋ฉ๋๋ค. ๋ค๋ฅธ ๊ฐ์ฒด๋ค์ด ์๊ธฐ๊ธฐ ์ ์ ์ด๋ฏธ ์์ฑ๋๊ณ , ํ๋ก๊ทธ๋จ ์ข ๋ฃ์์ ์ฌ๋ผ์ง๋๋ค.
๐ก Java์ main ๋ฉ์๋๊ฐ static์ธ ์ด์ ์ ๋ํด ์๊ณ ๊ณ์๋์? (public static void main(){String args[]})
static ๋ฉค๋ฒ๋ ํ๋ก๊ทธ๋จ ์์ ์, ํด๋์ค ๋ก๋์ ์ํด ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋๋์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์์๋ ํธ์ถ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
Runtime Data Area์์ Method Area(=Class Area, Static Area)๋ผ๊ณ ๋ถ๋ฆฌ๋ ์์ญ์ static ํค์๋๋ฅผ ๊ฐ์ง ๋ณ์, ๋ฉ์๋๊ฐ ์์ฑ๋ฉ๋๋ค. ๋ฐ๋ผ์ JVM์ ๋ณ๋๋ก ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์์๋, Method Area์ ๋ก๋๋ main()์ ์คํํ๊ฒ ๋ฉ๋๋ค.
๐ก final๊ณผ finally, finalize์ ์ฐจ์ด์ ๋ํด ์๊ณ ๊ณ์ ๋ค๋ฉด ์ค๋ช ๋ถํ๋๋ฆฝ๋๋ค.
- final ํค์๋
- ๋ณ์, ๋ฉ์๋ ํด๋์ค๊ฐ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ ํ๋๋ก ๋ง๋ ๋ค.
- ๊ธฐ๋ณธ ํ์
๋ณ์์ ์ ์ฉ ์
- ํด๋น ๋ณ์์ ๊ฐ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ๋ค.
- ์ฐธ์กฐ ๋ณ์์ ์ ์ฉ ์
- ์ฐธ์กฐ ๋ณ์๊ฐ ํ ๋ด์ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ๋ณ๊ฒฝํ ์ ์๋ค.
- ๋ฉ์๋์ ์ ์ฉ ์
- ํด๋น ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ ์ ์๋ค.(์ค๋ฒ๋ก๋ฉ์ ๊ฐ๋ฅ)
- ํด๋์ค์ ์ ์ฉ ์
- ํด๋น ํด๋์ค๋ฅผ ์์ ๋ฐ์์ ์ฌ์ฉํ ์ ์๋ค.
- finally ํค์๋
- try catch ๋ธ๋ก ๋ค์์ ํญ์ ์คํ๋ ์ฝ๋ ๋ธ๋ก์ ์ ์ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
- finalize ๋ฉ์๋
- ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ๋ ์ด์์ ์ฐธ์กฐ๊ฐ ์กด์ฌํ์ง ์๋ ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ์ญ์ ํ๊ฒ ๋ค๊ณ ๊ฒฐ์ ํ๋ ์๊ฐ ํธ์ถ๋๋ค.
๐ก try-catch-finally์ ๋จ์ ๊ณผ, ์ด๋ก ์ธํด ๋์จ ๊ตฌ๋ฌธ์ ๋ํด ์๊ณ ๊ณ์ ๋ค๋ฉด ์ค๋ช ํด์ฃผ์ธ์.
try-catch-finally ๊ตฌ๋ฌธ์์ ๋ฆฌ์์ค๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด, ์์ฑ์ try์์ ํ๊ณ ๋ฐ๋ฉ์ finally์์ ํ๋ค๋ณด๋ ์ค์์ ๋ฐ์ ์ฌ์ง๊ฐ ์์์ต๋๋ค. ๊ทธ๋์ ๋์จ ๊ตฌ๋ฌธ์ผ๋ก try-with-resources๊ฐ ์์ต๋๋ค. try ์์ ๊ดํธ๋ก ๋ฆฌ์์ค๋ฅผ ์์ฑํด์ฃผ๋ฉด, ๋ฐ๋ก ๋ฐ๋ฉ ์ฝ๋๋ฅผ ์์ฑํ์ง ์์๋ ์๋์ผ๋ก ๋ฆฌ์์ค๋ฅผ ๋ฐ๋ฉํฉ๋๋ค.
๐ก Java์ ์ ๋ค๋ฆญ์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
์ ๋ค๋ฆญ(Generic)์ ํด๋์ค ๋ด๋ถ์์ ํ์ ์ ์ง์ ํ๋ ๊ฒ์ด ์๋, ์ธ๋ถ์์ ์ฌ์ฉ์์ ์ํด ์ง์ ๋๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
ํน์ ํ์ (Specific)์ ๋ฏธ๋ฆฌ ์ง์ ํ๋ ๊ฒ์ด ์๋๋ผ, ํ์์ ์ํ ์ง์ ์ ๊ทธ๋ ๊ทธ๋ ํ ์ ์๋ ์ผ๋ฐ ํ์ (Generic)์ธ ๊ฒ ์ ๋๋ค.
- ์๋ชป๋ ํ์ ์ด ๋ค์ด์ค๋ ๊ฒ์ ์ปดํ์ผ ๋จ๊ณ์์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
- ํด๋์ค ์ธ๋ถ์์ ํ์ ์ ์ง์ ํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ํ์ ์ ์ฒดํฌํ๊ณ ๋ณํํ ํ์๊ฐ ์์ด ๊ด๋ฆฌํ๊ธฐ ์ฉ์ดํฉ๋๋ค.
- ๋น์ทํ ๊ธฐ๋ฅ์ ์ง์ํ๋ ๊ฒฝ์ฐ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ด ๋์์ง๋๋ค.
ํ์ | ์ค๋ช |
<T> | Type |
<E> | Element |
<K> | Key |
<V> | Value |
<N> | Number |
์ ํ์ ๋ช ์ธ๋ ์๋ฌต์ ์ธ ๊ท์น์ผ ๋ฟ, ๋ค๋ฅธ ๊ฐ์ ์ง์ด๋ฃ์ด๋ ์๋์ ์ ๋ฉ๋๋ค.
๐ก Java์ ์ง๋ ฌํ์ ์ญ์ง๋ ฌํ์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
- ์ง๋ ฌํ
- ์๋ฐ ์์คํ ๋ด๋ถ์์ ์ฌ์ฉ๋๋ ๊ฐ์ฒด ๋๋ ๋ฐ์ดํฐ๋ฅผ ์ธ๋ถ์ ์๋ฐ ์์คํ ์์๋ ์ฌ์ฉํ ์ ์๋๋ก ๋ฐ์ดํธ ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๋ ๊ธฐ์
- ์กฐ๊ฑด
- ์๋ฐ ๊ธฐ๋ณธ ํ์
- Serializable ์ธํฐํ์ด์ค ์์๋ฐ์ ๊ฐ์ฒด
- ObjectOutputStream ๊ฐ์ฒด๋ฅผ ์ด์ฉ
- ์ญ์ง๋ ฌํ
- ๋ฐ์ดํธ๋ก ๋ณํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๊ฐ์ฒด๋ก ๋ณํํ๋ ๊ธฐ์
- ObjectInputStream ๊ฐ์ฒด๋ฅผ ์ด์ฉ
๐ก ์ถ์ ํด๋์ค์ ์ธํฐํ์ด์ค์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
์ถ์ํด๋์ค๋, abstract ํค์๋๋ฅผ ์ฌ์ฉํด ์ ์ธํ ํด๋์ค๋ก, ์ถ์ ๋ฉ์๋๋ฅผ ์ต์ ํ ๊ฐ ์ด์ ํฌํจํ ํด๋์ค์ ๋๋ค.
์ถ์๋ฉ์๋๋, abstract ํค์๋๋ฅผ ์ฌ์ฉํด ์ํ๋ง ์ ์ธ๋๊ณ ๋ด๋ถ ์ฝ๋๋ ์์ฑํ์ง ์์ ๋ฉ์๋๋ฅผ ๋ปํฉ๋๋ค.
์ถ์ํด๋์ค ๋ด๋ถ์ ์ถ์๋ฉ์๋ ์ธ์ ๋ค๋ฅธ ๊ฒ๋ค๋ ์ถ๊ฐ๊ฐ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด ํน์ง์ด๊ณ , ์ถ์ํด๋์ค์ ์ฌ์ฉ ์ฃผ ๋ชฉ์ ์ ๊ด๋ จ์ฑ์ด ๋์ ํด๋์ค ๊ฐ์ ์ฝ๋๋ฅผ ๊ณต์ ํ๊ณ ํ์ฅํ๊ณ ์ถ์ ๋ชฉ์ ์ ๋๋ค.
์ธํฐํ์ด์ค๋, interface ํค์๋๋ฅผ ์ฌ์ฉํด ์ ์ธํ๋ฉฐ default์ static์ ์ ์ธํ๊ณ ๋ ์ถ์ ๋ฉ์๋์ ์์๋ง์ ํฌํจํฉ๋๋ค.
interface ๋ด๋ถ์ ๋ชจ๋ ๋ฉ์๋๋ ์ถ์ ๋ฉ์๋๋ก, abstract public์ด ์๋ต๋์ด ์๋ ์ํ์ ๋๋ค.
์์ ํ๋๋ public static final์ด ์๋ต๋์ด ์์ต๋๋ค.
์ธํฐํ์ด์ค๋ ๋ค์ค ์์์ด ๊ฐ๋ฅํ๋ฉฐ ๊ด๋ จ์ฑ์ด ์๋ ํด๋์ค๋ค์ ๋ ผ๋ฆฌ์ ์ผ๋ก ๊ฐ์ ๊ธฐ๋ฅ์ ์์ ์ ๋ง๊ฒ ๊ตฌํ์ ๊ฐ์ ํ๋๋ฐ์ ๋ชฉ์ ์ ๊ฐ์ต๋๋ค.
๐ก Error์ Exception์ ์ฐจ์ด์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
Error | Exception | |
ํจํค์ง | java.lang.error | java.lang.exception |
๋ฐ์์์ | ๋ฐํ์์์ ๋ฐ์, ์ปดํ์ผ ์์ ์์ ์ ์ ์๋ค. | Checked Exception์ ์ปดํ์ผ ์์ ์, Unchcked Exception์ ๋ฐํ์ ์์ ์ ์ ์ ์๋ค. |
๋ณต๊ตฌ | ์๋ฌ๋ ๋ณต๊ตฌ ๋ถ๊ฐ๋ฅ | try-catch์ ์ด์ฉํ์ฌ ๋ณต๊ตฌ ๊ฐ๋ฅ |
ํ์ | ๋ชจ๋ Error๋ Unchecked Type | checked Type, Unchecked Type์ผ๋ก ๋ถ๋ฅ |
์์ | OutOfMemory, StackOverFlow | checked Exception, unchecked Exception |
๐ก String๊ณผ StringBuilder, StringBuffer์ ์ฐจ์ด์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
1) String
์๋ก์ด ๊ฐ์ ํ ๋นํ ๋๋ง๋ค ์๋ก์ด ๋์ ๋ณ์(์ธ์คํด์ค)๊ฐ ์์ฑ๋ฉ๋๋ค. String์ ์ ์ฅ๋ ๋ฌธ์์ด์, ๋ด๋ถ์ ์ผ๋ก private final char[] ํํ์ด๋ฏ๋ก ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. String์ ๋ํ ์ฐ๊ฒฐ ์ฐ์ฐ์ผ๋ก '+'๋ฅผ ์ฌ์ฉํ๋ฉด, ๋ String์ ์ฐ๊ฒฐํ ์๋ก์ด ๊ฐ์ฒด๊ฐ ์์ฑ๋ฉ๋๋ค. ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ํธ์ถ๋๊ธฐ ์ ๊น์ง ์์ฑ๋ String ๊ฐ์ฒด๋ค์ Heap์ ๊ณ์ํด์ ๋จธ๋ฌผ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ธก๋ฉด์์ ์น๋ช ์ ์ ๋๋ค.
2) StringBuilder
String๊ณผ ๋ค๋ฅด๊ฒ ๊ฐ๋ณ์ฑ์ ๊ฐ์ง๋ ํด๋์ค์ ๋๋ค. append(), delete()๋ฑ์ method๋ฅผ ์ฌ์ฉํด ๋์ผ ๊ฐ์ฒด ๋ด์์ ๋ฌธ์์ด์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค. ๋๊ธฐํ๋ฅผ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์, ๋ฉํฐ ์ฐ๋ ๋ ํ๊ฒฝ์์ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํฉํ์ง ์์ง๋ง, ๋๊ธฐํ๋ฅผ ๊ณ ๋ คํ์ง ์๋ ๋งํผ ๋จ์ผ์ฐ๋ ๋์์์ ์ฑ๋ฅ์ StringBuffer๋ณด๋ค ๋ฐ์ด๋ฉ๋๋ค.
3) StringBuffer
String๊ณผ ๋ค๋ฅด๊ฒ ๊ฐ๋ณ์ฑ์ ๊ฐ์ง๋ ํด๋์ค์ ๋๋ค. append(), delete()๋ฑ์ method๋ฅผ ์ฌ์ฉํด ๋์ผ ๊ฐ์ฒด ๋ด์์ ๋ฌธ์์ด์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค. ๋๊ธฐํ๋ฅผ ์ง์ํ๊ธฐ ๋๋ฌธ์ ๋ฉํฐ ์ฐ๋ ๋ ํ๊ฒฝ์์ thread-safeํฉ๋๋ค.
๐ก new String("")์ ""์ ์ฐจ์ด์ ๋ํด ๋ฉ๋ชจ๋ฆฌ์ ๊ด์ ์์ ์ค๋ช ํด์ฃผ์ธ์.
""์ผ๋ก ๋ฌธ์์ด์ ์ด๊ธฐํ ํ๊ฒ ๋๋ฉด, Java Heap ๋ฉ๋ชจ๋ฆฌ์ String Pool์ ์ ์ฅ์ด ๋ฉ๋๋ค.
String msg1 = "hello";
String msg2 = "hello";
์์ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด, "hello"๋ Java Heap ๋ฉ๋ชจ๋ฆฌ์ String Pool์ ์ ์ฅ๋๊ณ , msg1๊ณผ msg2๋ ๊ฐ์ String pool ๋ด์ "hello"๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ฉด์, new String("")์ ์กฐ๊ธ ๋ค๋ฆ ๋๋ค.
String msg3 = new String("hello");
String msg4 = new String("hello");
new ํค์๋๋ฅผ ์ฌ์ฉํด ์๋ก์ด ์์ฑํ๊ธฐ ๋๋ฌธ์, String Pool์ด ์๋, ๊ทธ๋ฅ Heap ์์ญ์ ๊ฐ๊ฐ ์์ฑ๋ฉ๋๋ค. ๋ฐ๋ผ์ msg3์ msg4๋ ์๋ก ๋ค๋ฅธ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ ์ํ์ ๋๋ค. msg3.intern() ๋ฉ์๋๋ฅผ ํ์ฉํ๋ฉด string pool์ ๋ฑ๋กํ ์ ์์ต๋๋ค.
๊ตณ์ด ๊ฐ์ฒด๋ก ๋ง๋ค์ด GC ๋์์ด ๋๋ ๊ฒ๋ณด๋ค, String Pool๋ก ๋ง๋ค์ด ํ์ฉํ๋ ๊ฒ์ด ๋ฉ๋ชจ๋ฆฌ ํจ์จ ์ธก๋ฉด์์ ๋์ฑ ์ ๋ฆฌํ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.
๐ก Java ๋ฆฌํ๋ ์ ์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
์ปดํ์ผ ์๊ฐ์ด ์๋, ๋ฐํ์ ์๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ ํด๋์ค๋ ๋ฉ์๋์ ์ ์๋ฅผ ๋์ ์ผ๋ก ์ฐพ์์ ์กฐ์ํ ์ ์๋ ๊ธฐ์ ์ ์๋ฏธํฉ๋๋ค.
์์ฑ์ ์ฐพ๊ธฐ(getDeclaredConstructor()), ๋ฉ์๋ ์ฐพ๊ธฐ(getDeclaredMethods()), ํ๋ ์ฐพ๊ณ ํ๋ ๋ณ๊ฒฝ(getDeclaredFields, set) ๋ฑ ๋ฐํ์ ์๊ฐ์ ๋์ ์ผ๋ก ํด๋น ๋ช ๋ น์ ์ํํ ์ ์๋๋ก ๋์์ค๋๋ค.
- ๋ฐํ์ ์์ ์ ์ฌ์ฉํ instance๋ฅผ ์ ํํ๊ณ ๋์์ํฌ ์ ์์ด ์ ์ฐํฉ๋๋ค.
- ์ปดํ์ผ ์์ ์ด ์๋๋ผ ๋ฐํ์ ์์ ์์ ์ค๋ฅ๋ฅผ ์ก๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ ํ์์ ์ค๋ฅ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
- ์ ๊ทผ ์ ์ด์๋ก ์บก์ํ๋ ํ๋๋ ๋ฉ์๋์ ์ ๊ทผ ๊ฐ๋ฅํ๋ฏ๋ก ๊ธฐ์กด ๋์๋ฐฉ์์ ๋ฌด์ํ๊ณ ๊นจ๋จ๋ฆด ์ ์์ด ์ํ์์๊ฐ ์์ต๋๋ค.
- ๋ฐํ์ ์์ ์ ๋ค๋ฅธ ํด๋์ค๋ฅผ ๋์ ์ผ๋ก ๋ก๋ฉํ์ฌ ์ ๊ทผํ ๋ ์ฌ์ฉ
- ํด๋์ค์ ๋ฉค๋ฒ ํ๋, ๋ฉ์๋ ๋ฑ์ ๊ดํ ์ ๋ณด๋ฅผ ์ป์ด์ผ ํ ๋ ์ฌ์ฉ
Annotation ๊ฐ๋ ๊ณผ ํจ๊ป ๋์ค๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
Spring ์ปจํ ์ด๋์์ ๊ฐ์ฒด๊ฐ ํธ์ถ๋์ด ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ์์ฑํ ๊ฒฝ์ฐ ํ์ํ๊ฒ ๋ฉ๋๋ค.
๐ก Java์ Stream API์ ๋ํด ์๊ณ ๊ณ์๋์? ์๋ค๋ฉด ์๋๋๋ก ์ค๋ช ํด์ฃผ์ธ์.
Collections Type์ ๋ฐ์ดํฐ๋ฅผ Stream ๋ฉ์๋๋ก ๋ด๋ถ ๋ฐ๋ณต์ ํตํด ์ ๋ ฌ ํน์ ํํฐ๋ง์ ์ง์ํด์ฃผ๋ API ์ ๋๋ค.
- parallel ๋ฉ์๋ ์ ๊ณต์ ํตํด ๋ณ๋ ฌ์ฒ๋ฆฌ ๊ฐ ๊ฐ๋ฅ
- ๊ฐ ์ค๋ ๋๊ฐ ๊ฐ๋ณ ํ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ๋๊ณ ์๋ ์ค๋ ๋๊ฐ ์์ผ๋ฉด ์ผํ๋ ์ค๋ ๋์ ์์ ์ ๊ฐ์ ธ์ ์ํ
- ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์๋๋ค(Immutable)
- ์๋ณธ๋ฐ์ดํฐ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ๋ง ํ ๋ฟ, ์๋ณธ๋ฐ์ดํฐ ์์ฒด๋ฅผ ๋ณ๊ฒฝํ์ง ์๋๋ค.
- ์์ ์ ๋ด๋ถ ๋ฐ๋ณต์ผ๋ก ์ฒ๋ฆฌํ๋ฏ๋ก ๋ถํ์ํ ์ฝ๋ฉ์ ์ค์ผ ์ ์๋ค.
- ์ต์ข ์ฐ์ฐ ํ stream์ด ๋ซํ๋ฏ๋ก ์ผํ์ฉ ์ด๋ค.
์ฐ์ฐ์ ๊ตฌ์กฐ๋ Stream ์์ฑ → ์ค๊ฐ์ฐ์ฐ → ์ต์ข ์ฐ์ฐ ์์๋ก ์ด์ด์ง๋๋ค.
์ค๊ฐ์ฐ์ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ๋ ๊ณผ์ ์ผ๋ก ํํฐ๋ง, ๋ณํ, ์ ํ, ์ ๋ ฌ, ์ฐ์ฐ ์ค๊ฐ ๊ฒฐ๊ณผ ํ์ธ ๋ฑ์ด ์์ต๋๋ค.
์ต์ข ์ฐ์ฐ์ Stream ์์ ๋ฐ์ดํฐ๋ฅผ ๋ชจ์์ ๋ฐํํ๋ ์ญํ ๋ก์จ, ์ถ๋ ฅ, ์๋ชจ, ๊ฒ์, ๊ฒ์ฌ, ํต๊ณ, ์ฐ์ฐ, ์์ง ๋ฑ์ ์ง์ํฉ๋๋ค.
์ค๊ฐ ์ฐ์ฐ ์์ ์ ๋ฐ๋ก ์คํ๋๋ ๊ฒ์ด ์๋๋ผ, ์ข ๊ฒฐ์ฒ๋ฆฌ์ ์คํ์ด ํ์ํ ๋ ๋น๋ก์ ์ค๊ฐ ์ฒ๋ฆฌ๊ฐ ์คํ๋ฉ๋๋ค. (Lazy Evaluation)
๐ก Java์ Fork-Join Pool์ด ๋ฌด์์ธ์ง ์ค๋ช ํด์ฃผ์ธ์.
Task(์ ๋ฌด)๋ฅผ Fork(๋ถํ )์ ํตํด ์์ ์ ๋ฌด๋ก ๋๋ ๋ฐฐ๋ถํด์ ์ผ์ ํ ํ์ ๋ค์ Join(์ทจํฉ)ํ๋ ํํ์ ์ฐ๋ ๋ ํ์ ๋๋ค.
Fork-Join Pool๋ ๋ด๋ถ์ inbound queue๊ฐ ์๋๋ฐ, ์ด inbound queue๋ ๊ฐ ์ ๋ฌด(Task)๊ฐ ์ ์ฅ๋๊ณ , ๊ฐ ์ฐ๋ ๋๊ฐ ๊ฐ์ ธ๊ฐ ์ ๋ฌด๋ฅผ ํ๊ฒ ๋ฉ๋๋ค.
์ผ์ชฝ์์ ์ ๋ฌด๋ฅผ ์ ์ถํ๋ฉด, ํ๋์ inbound queue์ ๋์ ๋๊ณ , A์ B ์ฐ๋ ๋๋ ํด๋น ์ ๋ฌด๋ฅผ ๊ฐ์ ธ๋ค๊ฐ ์ผ์ ์์ํฉ๋๋ค.
A์ B๋ ๊ฐ์ ์ ๋ฌด๋ฅผ ๊ด๋ฆฌํ๋ queue๊ฐ ์์ผ๋ฉฐ, ์์ ์ ํ์ ์ ๋ฌด๊ฐ ์์ผ๋ฉด ์๋๋ฐฉ์ ํ์์ ์ ๋ฌด๋ฅผ ๊ฐ์ ธ์์(steal) ์ฒ๋ฆฌํฉ๋๋ค.
์ต๋ํ ๋๊ณ ์๋ Thread๋ฅผ ์ค์ด๋ ๋ฐฉ๋ฒ์ผ๋ก ์ค๊ณ๋์์ต๋๋ค.
๐ก Java์ Optional์ด ๋ฌด์์ธ์ง ์ค๋ช ํด์ฃผ์ธ์.
NullPointerException(NPE)๋ฅผ ํผํ๊ธฐ ์ํด null ์ฌ๋ถ ๊ฒ์ฌ๋ฅผ ํ๊ฒ ๋๋๋ฐ, ๊ฒ์ฌ๋ฅผ ํด์ผ ํ๋ ๋ณ์๊ฐ ๋ง์ ์๋ก ์ฝ๋๊ฐ ๋ฒ๊ฑฐ๋กญ์ต๋๋ค. ๋ฐ๋ผ์ Optional<T> ํด๋์ค๋ฅผ ์ฌ์ฉํด NPE ๋ฐ์์ ๋ฐฉ์งํ๋๋ก ๋์์ค๋๋ค. null์ด ์ฌ ์ ์๋ ๊ฐ์ ๊ฐ์ธ๋ Wrapper ํด๋์ค๋ก, ์ฐธ์กฐํ๋๋ผ๋ NPE๊ฐ ๋ฐ์ํ์ง ์๋๋ก ๋์์ค๋๋ค.
๐ก Java์์์ MultiThread ํ๋ก๊ทธ๋๋ฐ์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
- ์ค๋ ๋ ์์ฑ ๋ฐฉ๋ฒ
- ๋ฐฉ๋ฒ 1: Thread ํด๋์ค๋ฅผ ์์๋ฐ์์ run์ ์ค๋ฒ๋ผ์ด๋ํด์ ์ ์ํ๋ค.
- ๋ฐฉ๋ฒ 2: Runnable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ Thread ์์ฑ์์ ์ธ์๋ก ๋๊ธด๋ค.
- ๋ฐฉ๋ฒ 3: Callable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ FutureTask์ ํ๋ฒ ๊ฐ์ธ์ Thread์ ์ธ์๋ก ๋๊ธด๋ค.
- Runnable์ Exception์ด ์๊ณ ๋ฆฌํด๊ฐ๋ ์์ผ๋ Callable์ ๋ฆฌํด๊ฐ์ด ์๊ณ Exception์ ๋ฐ์์ํฌ ์ ์๋ค.
- ์ค๋ ๋ ์คํ ๋ฐฉ๋ฒ
- ๋ณดํต start() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ํธ์ถํ๋๋ฐ start ํ๋ค๊ณ ํด์ ๋ฐ๋ก ์คํ๋๋ ๊ฒ์ ์๋๊ณ ์คํ ๋๊ธฐ์ด์ ์ ์ฅ๋ ํ ์ฐจ๋ก๊ฐ ์ค๋ฉด ์คํ๋๋ค.
- ์ ํํ๊ฒ ๋งํ์๋ฉด, start๋ ์๋ก์ด ์ค๋ ๋๊ฐ ์์ ์ ์คํํ๋๋ฐ ํ์ํ ์๋ก์ด ํธ์ถ ์คํ์ ์์ฑํด์ ๊ทธ๊ณณ์ run ๋ฉ์๋๋ฅผ ์ฌ๋ ค๋๋ค. ์ดํ ๊ทธ๊ณณ์์ run ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ ์ค๋ ๋๊ฐ ๋ณ๊ฐ์ ์์ ์ ์ํํ๊ฒ ๋๋ค.
์ด์ ์์๋ ExecutorService์ Executors๋ฅผ ์ด์ฉํด ์ค๋ ๋ํ์ ์์ฑ ํ์ฌ ๋ณ๋ ฌ์ฒ๋ฆฌํฉ๋๋ค.
๐ก ๋๊ธฐํ๊ฐ ๋ฌด์์ธ์ง, Java์์ ๋๊ธฐํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
์๋ฐ์์ ๋์์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๋ฐ 3๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
- synchronized : ์์ ํ๊ฒ ๋์์ฑ์ ๋ณด์ฅํ ์ ์์ต๋๋ค. ํ์ง๋ง ๋น์ฉ์ด ๊ฐ์ฅ ํฝ๋๋ค.
- volatile : ํค์๋๊ฐ ๋ถ์ ์์์ ํ๋์ thread๋ง์ด writeํ๊ณ ๋๋จธ์ง๋ ์ค๋ ๋๋ read๋ง ํ๋ค๋ ์ ์ ํ์๋ง ๋์์ฑ์ ๋ณด์ฅํฉ๋๋ค.
- volatile ํค์๋๋ฅผ ๋ถ์ธ ์์์ read, write ์์ ์ด CPU Cache Memory๊ฐ ์๋ Main Memory์์ ์ด๋ค์ง๋๋ค.
- ์ฆ, ์์์ ์ ์ฅํ๋ ๋ฉ๋ชจ๋ฆฌ๋ ํ๋๊ฐ ๋๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๊ณต์ ์์์ ๋ํด ๊ฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ณ๋ก ๋ค๋ฅธ ๊ฐ์ ๊ฐ์ง๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
- ํ์ง๋ง ์ฌ๋ฌ ์ค๋ ๋์์ Main Memory์ ์๋ ๊ณต์ ์์์ ๋์์ ์ ๊ทผํ ์ ์์ผ๋ฏ๋ก ์ฌ๋ฌ ์ค๋ ๋์์ ์์ ํ๊ฒ ๋๋ฉด, ๊ณ์ฐ๊ฐ์ด ๋ฎ์ด์์์ง๊ฒ ๋๋ฏ๋ก ๋์ ์ ๊ทผ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
- ์ ๋ฆฌํ๋ฉด, ๊ฐ์์ฑ ๋ฌธ์ ๋ ํด๊ฒฐํ ์ ์์ง๋ง, ๋์ ์ ๊ทผ ๋ฌธ์ ๋ ํด๊ฒฐํ ์ ์์ต๋๋ค.
- Atomic ํด๋์ค๋ CAS(compare-and-swap)๋ฅผ ์ด์ฉํ์ฌ ๋์์ฑ์ ํ๋ฏ๋ก ์ฌ๋ฌ ์ฐ๋ ๋์์ ๋ฐ์ดํฐ๋ฅผ writeํด๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. synchronized ๋ณด๋ค ์ ์ ๋น์ฉ์ผ๋ก ๋์์ฑ์ ๋ณด์ฅํ ์ ์์ต๋๋ค.
- CAS ์๊ณ ๋ฆฌ์ฆ์ด๋ ํ์ฌ ์ค๋ ๋๊ฐ ์กด์ฌํ๋ CPU์ CacheMemory์ MainMemory์ ์ ์ฅ๋ ๊ฐ์ ๋น๊ตํ์ฌ, ์ผ์นํ๋ ๊ฒฝ์ฐ ์๋ก์ด ๊ฐ์ผ๋ก ๊ต์ฒดํ๊ณ , ์ผ์นํ์ง ์์ ๊ฒฝ์ฐ ๊ธฐ์กด ๊ต์ฒด๊ฐ ์คํจ๋๊ณ , ์ด์ ๋ํด ๊ณ์ ์ฌ์๋ํ๋ ๋ฐฉ์์ ๋๋ค.
- CPU๊ฐ MainMemory์ ์์์ CPU Cache Memory๋ก ๊ฐ์ ธ์ ์ฐ์ฐ์ ์ํํ๋ ๋์ ๋ค๋ฅธ ์ค๋ ๋์์ ์ฐ์ฐ์ด ์ํ๋์ด MainMemory์ ์์ ๊ฐ์ด ๋ฐ๋์์ ๊ฒฝ์ฐ ๊ธฐ์กด ์ฐ์ฐ์ ์คํจ์ฒ๋ฆฌํ๊ณ , ์๋ก ๋ฐ๋ MainMemory ๊ฐ์ผ๋ก ์ฌ์ํํ๋ ๋ฐฉ์์ ๋๋ค.
๐โ๏ธ ๋ค๋ฅธ ์ง๋ฌธ ๋๋น ์๋ฃ
[๐ ์ ์ ์ธํฐ๋ทฐ ์ค๋น] - [๋ฉด์ ์ด์ ๋ฆฌ] ์ ์ ๊ฐ๋ฐ์ ์ธํฐ๋ทฐ ๋๋น ์ด์ ๋ฆฌ ์๋ฃ - โ ์๋ฃ๊ตฌ์กฐ
[๐ ์ ์ ์ธํฐ๋ทฐ ์ค๋น] - [๋ฉด์ ์ด์ ๋ฆฌ] ์ ์ ๊ฐ๋ฐ์ ์ธํฐ๋ทฐ ๋๋น ์ด์ ๋ฆฌ ์๋ฃ - โก ์๊ณ ๋ฆฌ์ฆ
[๐ ์ ์ ์ธํฐ๋ทฐ ์ค๋น] - [๋ฉด์ ์ด์ ๋ฆฌ] ์ ์ ๊ฐ๋ฐ์ ์ธํฐ๋ทฐ ๋๋น ์ด์ ๋ฆฌ ์๋ฃ - โข ๋ฐ์ดํฐ๋ฒ ์ด์ค
[๐ ์ ์ ์ธํฐ๋ทฐ ์ค๋น] - [๋ฉด์ ์ด์ ๋ฆฌ] ์ ์ ๊ฐ๋ฐ์ ์ธํฐ๋ทฐ ๋๋น ์ด์ ๋ฆฌ ์๋ฃ - โฃ ๋คํธ์ํฌ
[๐ ์ ์ ์ธํฐ๋ทฐ ์ค๋น] - [๋ฉด์ ์ด์ ๋ฆฌ] ์ ์ ๊ฐ๋ฐ์ ์ธํฐ๋ทฐ ๋๋น ์ด์ ๋ฆฌ ์๋ฃ - โค ์ด์์ฒด์
[๐ ์ ์ ์ธํฐ๋ทฐ ์ค๋น] - [๋ฉด์ ์ด์ ๋ฆฌ] ์ ์ ๊ฐ๋ฐ์ ์ธํฐ๋ทฐ ๋๋น ์ด์ ๋ฆฌ ์๋ฃ - โฅ ์๋ฐ(Java)
[๐ ์ ์ ์ธํฐ๋ทฐ ์ค๋น] - [๋ฉด์ ์ด์ ๋ฆฌ] ์ ์ ๊ฐ๋ฐ์ ์ธํฐ๋ทฐ ๋๋น ์ด์ ๋ฆฌ ์๋ฃ - โฆ ๋ฐฑ์๋(Java Spring ๊ธฐ๋ฐ)
[๐ ์ ์ ์ธํฐ๋ทฐ ์ค๋น] - [๋ฉด์ ์ด์ ๋ฆฌ] ์ ์ ๊ฐ๋ฐ์ ์ธํฐ๋ทฐ ๋๋น ์ด์ ๋ฆฌ ์๋ฃ - โง ๊ฐ๋ฐ๊ณตํต / ์ธ์ฑ๋ฉด์