๐ท ์ฐ๋ ๋(์ผ๊พผ)
ํ๋ก์ธ์ค์ ์ฐ๋ ๋
๐ ํ๋ก์ธ์ค vs ์ฐ๋ ๋
ํ๋ก์ธ์ค : ์ด์์ฒด์ ๋ก๋ถํฐ ์์์ ํ ๋น๋ฐ๋ ์์ ์ ๋จ์
- ์ฐ๋ ๋ : ํ๋ก์ธ์ค๊ฐ ํ ๋น๋ฐ์ ์์์ ์ด์ฉํ๋ ์คํ์ ๋จ์
ํ๋ก์ธ์ค
- ์คํ์ค์ธ ํ๋ก๊ทธ๋จ์ ์๋ฏธ
- OS ์์์ ์คํ๋๋ ๋ชจ๋ ํ๋ก๊ทธ๋จ์ OS๊ฐ ๋ง๋ค์ด์ค ํ๋ก์ธ์ค์์ ์คํ๋จํ๋ก์ธ์ค
- ๊ตฌ์กฐ
- OS๊ฐ ํ๋ก๊ทธ๋จ ์คํ์ ์ํ ํ๋ก์ธ์ค๋ฅผ ํ ๋นํด์ค๋ ํ๋ก์ธ์ค ์์ ํ๋ก๊ทธ๋จ code์ data ๊ทธ๋ฆฌ๊ณ ๋ฉ๋ชจ๋ฆฌ ์์ญ(stack, heap)์ ํจ๊ป ํ ๋น
- code ๋ java main ๋ฉ์๋์ ๊ฐ์ ์ฝ๋๋ฅผ ์๋ฏธ
- data๋ ํ๋ก๊ทธ๋จ์ด ์คํ ์ค ์ ์ฅํ ์ ์๋ ์ ์ฅ ๊ณต๊ฐ์ ์๋ฏธ
- ์ ์ญ ๋ณ์, ์ ์ ๋ณ์(static), ๋ฐฐ์ด ๋ฑ ์ด๊ธฐํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ณต๊ฐ
- memory
- stack : ์ง์ญ ๋ณ์, ๋งค๊ฐ๋ณ์, ๋ฆฌํด ๋ณ์๋ฅผ ์ ์ฅํ๋ ๊ณต๊ฐ
- heap : ํ๋ก๊ทธ๋จ์ด ๋์ ์ผ๋ก ํ์ํ ๋ณ์๋ฅผ ์ ์ฅํ๋ ๊ณต๊ฐ(new(), malloc())
์ฐ๋ ๋
- ํ๋ก์ธ์ค ๋ด์์ ์ผํ๋ ์ผ๊พผ (์ฝ๋ ์คํ์ ํ๋ฆ)
- ์์ฑ
- ํ๋ก์ธ์ค๊ฐ ์์ ์ค์ธ ํ๋ก๊ทธ๋จ์์ ์คํ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์ฐ๋ ๋๋ฅผ ๋ง๋ค์ด ๋ช ๋ น์ ์ฒ๋ฆฌํ๋๋ก ํจ
- ์์
- ํ๋ก์ธ์ค ์์๋ ์ฌ๋ฌ ์ฐ๋ ๋๊ฐ ์๊ณ , ์ฐ๋ ๋๋ค์ ์คํ์ ์ํ ํ๋ก์ธ์ค ๋ด ์ฃผ์ ๊ณต๊ฐ์ด๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ(heap)์ ๊ณต์ ๋ฐ์
- ๊ฐ๊ฐ ๋ช ๋ น ์ฒ๋ฆฌ๋ฅผ ์ํ ์์ ๋ง์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ(stack)๋ ํ ๋น ๋ฐ์
- ํ๋ก์ธ์ค ์์๋ ์ฌ๋ฌ ์ฐ๋ ๋๊ฐ ์๊ณ , ์ฐ๋ ๋๋ค์ ์คํ์ ์ํ ํ๋ก์ธ์ค ๋ด ์ฃผ์ ๊ณต๊ฐ์ด๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ(heap)์ ๊ณต์ ๋ฐ์
- java ์ฐ๋ ๋
- ์ผ๋ฐ ์ฐ๋ ๋์ ๋์ผํ๋ฉฐ JVM ํ๋ก์ธ์ค ์์์ ์คํ๋๋ ์ฐ๋ ๋
- Java ํ๋ก๊ทธ๋จ ์ฐ๋ ๋๋ java Main ์ฐ๋ ๋๋ถํฐ ์คํ๋๋ฉฐ JVM์ ์ํด ์คํ๋จ
๋ฉํฐ ์ฐ๋ ๋
java๋ ๋ฉ์ธ ์ฐ๋ ๋๊ฐ main() ๋ฉ์๋๋ฅผ ์คํ์ํค๋ฉด์ ์์๋จ
- ๋ฉ์ธ ์ฐ๋ ๋๋ ํ์์ ๋ฐ๋ผ์ ์์ ์ฐ๋ ๋๋ค์ ์์ฑํด์ ๋ณ๋ ฌ๋ก ์ฝ๋๋ฅผ ์คํ์ํฌ ์ ์์
- ์ฆ, java๋ ๋ฉํฐ ์ฐ๋ ๋๋ฅผ ์ง์
- ์ฑ๊ธ ์ฐ๋ ๋
- ํ๋ก์ธ์ค ์์์ ํ๋์ ์ฐ๋ ๋๋ง ์คํ๋๋ ๊ฒ
- ๋ฉํฐ ์ฐ๋ ๋
- ํ๋ก์ธ์ค ์์์ ์ฌ๋ฌ ๊ฐ์ ์ฐ๋ ๋๊ฐ ์คํ๋๋ ๊ฒ
- ํ๋์ ํ๋ก์ธ์ค๋ ์ฌ๋ฌ ๊ฐ์ ์คํ ๋จ์(์ฐ๋ ๋)๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฉฐ, ์ด ์ฐ๋ ๋๋ค์ ํ๋ก์ธ์ค์ ์์์ ๊ณต์ ํจ
- ์ฅ์
- ์ฌ๋ฌ ๊ฐ์ ์ฐ๋ ๋(์คํ ํ๋ฆ)์ ํตํด ์ฌ๋ฌ ๊ฐ์ ์์ ์ ๋์์ ํ ์ ์์ด์ ์ฑ๋ฅ์ด ์ข์์ง
- ์คํ์ ์ ์ธํ ๋ชจ๋ ์์ญ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ ์์์ ๋ณด๋ค ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์
- ์๋ต ์ฐ๋ ๋์ ์์
์ฐ๋ ๋๋ฅผ ๋ถ๋ฆฌํ์ฌ ๋น ๋ฅด๊ฒ ์๋ต์ ํด์ค ์ ์์ =>
๋น๋๊ธฐ
- ๋จ์
- ๋๊ธฐํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ => ํ๋ก์ธ์ค์ ์์์ ๊ณต์ ํ๋ฉด์ ์์ ์ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์์์ ์๋ก ์ฌ์ฉํ๋ ค๊ณ ํ๋ ์ถฉ๋์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ๋ฅผ ์๋ฏธ
- ๊ต์ฐฉ ์ํ(๋ฐ๋๋ฝ)์ด ๋ฐ์ํ ์ ์์ => ๋ ์ด์์ ์ฐ๋ ๋๊ฐ ์๋ก์ ์์์ ์ํ๋ ์ํ๊ฐ ๋์์ ๋ ์๋ก ์์ ์ด ์ข ๋ฃ๋๊ธฐ๋ง์ ๊ธฐ๋ค๋ฆฌ๋ฉฐ ์์ ์ ๋ ์ด์ ์งํํ์ง ๋ชปํ๊ฒ ๋๋ ์ํ
Thread์ Runnable
public class Main {
public static void main(String[] args) {
Runnable run = new TestRunnable();
Thread thread = new Thread(run);
thread.start();
}
}
class TestRunnable implements Runnable {
@Override
public void run() {
for (int i = 0; i <100; i++) {
System.out.print("$");
}
}
}
- ๐โ๏ธ Thread๋ฅผ ์ง์ ์์๋ฐ์ ์ฌ์ฉํ์ง ์๊ณ Runnable ์ฌ์ฉ?
- java๋ ๋ค์ค ์์์ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์, ์ธํฐํ์ด์ค์ธ Runnable์ ์ฌ์ฉํ๋ ๊ฒ์ด ํ์ฅ์ฑ์ ๋งค์ฐ ์ ๋ฆฌ !!
๋ฐ๋ชฌ ์ฐ๋ ๋์ ์ฌ์ฉ์ ์ฐ๋ ๋
- ๋ฐ๋ชฌ ์ฐ๋ ๋
- ๋ณด์ด์ง ์๋ ๊ณณ(background)์์ ์คํ๋๋ ๋ฎ์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง ์ฐ๋ ๋
- ๋ณด์กฐ์ ์ธ ์ญํ ์ ๋ด๋นํ๋ฉฐ ๋ํ์ ์ผ๋ก๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ(GC)๊ฐ ์์
- ์ฌ์ฉ์ ์ฐ๋ ๋
- ๋ณด์ด๋ ๊ณณ(foreground)์์ ์คํ๋๋ ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง ์ฐ๋ ๋
- ํ๋ก๊ทธ๋จ ๊ธฐ๋ฅ์ ๋ด๋นํ๋ฉฐ ๋ํ์ ์ผ๋ก๋ ๋ฉ์ธ ์ฐ๋ ๋๊ฐ ์์
์ฐ๋ ๋ ์ํ์ ์ ์ด
์ํ | Enum | ์ค๋ช |
---|---|---|
๊ฐ์ฒด ์์ฑ | NEW | ์ฐ๋ ๋ ๊ฐ์ฒด ์์ฑ, ์์ง start() ๋ฉ์๋ ํธ์ถ ์ ์ ์ํ |
์คํ ๋๊ธฐ | RUNNABLE | ์คํ ์ํ๋ก ์ธ์ ๋ ์ง ๊ฐ ์ ์๋ ์ํ |
์ผ์์ ์ง | WAITING | ๋ค๋ฅธ ์ฐ๋ ๋๊ฐ ํต์ง(notify)ํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ์ํ |
์ผ์์ ์ง | TIMED_WAITING | ์ฃผ์ด์ง ์๊ฐ ๋์ ๊ธฐ๋ค๋ฆฌ๋ ์ํ |
์ผ์์ ์ง | BLOCKED | ์ฌ์ฉํ๊ณ ์ ํ๋ ๊ฐ์ฒด์ Lock์ด ํ๋ฆด ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ์ํ |
์ข ๋ฃ | TERMINATED | ์ฐ๋ ๋์ ์์ ์ด ์ข ๋ฃ๋ ์ํ |
- ์ ์ด
sleep()
Thread.sleep(ms);
: ms(๋ฐ๋ฆฌ์ด)๋จ์๋ก ์ค์ ๋จ- ์์ธ์ฒ๋ฆฌ ํ์ => sleep ์ํ์ ์๋ ๋์
interrupt()
๋ฅผ ๋ง๋๋ฉด ๋ค์ ์คํ๋๊ธฐ ๋๋ฌธ์ InterruptException์ด ๋ฐ์ํ ์ ์์ - ํน์ ์ฐ๋ ๋๋ฅผ ์ง๋ชฉํด์ ๋ฉ์ถ๊ฒํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅ
interrupt()
- Thread ํด๋์ค ๋ด๋ถ์ interrupted ๋์๋์ง๋ฅผ ์ฒดํฌํ๋ boolean ๋ณ์๊ฐ ์กด์ฌ
- ์ฐ๋ ๋๊ฐ
start()
๋ ํ ๋์ํ๋คinterrupt()
๋ฅผ ๋ง๋ ์คํํ๋ฉด interrupted ์ํ๊ฐ true๊ฐ ๋จ isInterrupted()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ํ๊ฐ์ ํ์ธ ๊ฐ๋ฅ
join()
- ์ ํด์ง ์๊ฐ๋์ ์ง์ ํ ์ฐ๋ ๋๊ฐ ์์ ํ๋ ๊ฒ์ ๊ธฐ๋ค๋ฆผ
- ์๊ฐ์ ์ง์ ํ์ง ์์์ ๋๋ ์ง์ ํ ์ฐ๋ ๋์ ์์ ์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆผ
yield()
- ๋จ์ ์๊ฐ์ ๋ค์ ์ฐ๋ ๋์๊ฒ ์๋ณดํ๊ณ ์ฐ๋ ๋ ์์ ์ ์คํ๋๊ธฐ ์ํ๊ฐ ๋จ
synchronized
๋ฉํฐ ์ฐ๋ ๋์ ๊ฒฝ์ฐ ์ฌ๋ฌ ์ฐ๋ ๋๊ฐ ํ ํ๋ก์ธ์ค์ ์์์ ๊ณต์ ํด์ ์์ ํ๊ธฐ ๋๋ฌธ์ ์๋ก์๊ฒ ์ํฅ์ ์ค ์ ์์
์ด๋ก ์ธํด ์ฅ์ ๋ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ ์ ์์
- ์ด๋ฌํ ์ผ์ ๋ฐฉ์งํ๊ธฐ ์ํด ํ ์ฐ๋ ๋๊ฐ ์งํ์ค์ธ ์์ ์ ๋ค๋ฅธ ์ฐ๋ ๋๊ฐ ์นจ๋ฒํ์ง ๋ชปํ๋๋ก ๋ง๋ ๊ฒ์
์ฐ๋ ๋ ๋๊ธฐํ(synchronized)
๋ผ๊ณ ํจ- ๋๊ธฐํ๋ฅผ ํ๋ ค๋ฉด ๋ค๋ฅธ ์ฐ๋ ๋์ ์นจ๋ฒ์ ๋ง์์ผํ๋ ์ฝ๋๋ฅผ
์๊ณ์์ญ
์ผ๋ก ์ค์ ํ๋ฉด ๋จ- ์๊ณ ์์ญ์์ lock์ ๊ฐ์ง ๋จ ํ๋์ ์ฐ๋ ๋๋ง ์ถ์ ์ด ๊ฐ๋ฅ => ์ฆ, ์๊ณ ์์ญ์ ํ ๋ฒ์ ํ ์ฐ๋ ๋๋ง ์ฌ์ฉ ๊ฐ๋ฅ
wait()
,notify()
wait()
: ์คํ ์ค์ด๋ ์ฐ๋ ๋๋ ํด๋น ๊ฐ์ฒด์ ๋๊ธฐ์ค(waiting pool)์์ ํต์ง๋ฅผ ๊ธฐ๋ค๋ฆผnotify()
: ํด๋น ๊ฐ์ฒด์ ๋๊ธฐ์ค(waiting pool)์ ์๋ ๋ชจ๋ ์ฐ๋ ๋ ์ค์์ ์์์ ์ฐ๋ ๋๋ง ํต์ง๋ฅผ ๋ฐ์
์นจ๋ฒ์ ๋ง์ ์ฝ๋๋ฅผ ์ํํ๋ค๊ฐ ์์ ์ ๋ ์ด์ ์งํํ ์ํฉ์ด ์๋๋ฉด, wait()์ ํธ์ถํ์ฌ ์ฐ๋ ๋๊ฐ lock์ ๋ฐ๋ฉํ๊ณ ๊ธฐ๋ค๋ฆฌ๊ฒ ํ ์ ์์
- ๊ทธ๋ผ ๋ค๋ฅธ ์ฐ๋ ๋๊ฐ ๋ฝ์ ์ป์ด ํด๋น ๊ฐ์ฒด์ ๋ํ ์์ ์ ์ํํ ์ ์๊ณ ,
- ์ถํ์ ์์ ์ ์งํํ ์ ์๋ ์ํฉ์ด ๋๋ฉด `notify()`๋ฅผ ํธ์ถํด์,
- ์์ ์ ์ค๋จํ๋ ์ฐ๋ ๋๊ฐ ๋ค์ lock์ ์ป์ด ์งํํ ์ ์๊ฒ ๋จ
Lock
- synchronized ๋ธ๋ญ์ผ๋ก ๋๊ธฐํํ๋ฉด ์๋์ ์ผ๋ก lock ๊ฑธ๋ฆฌ๊ณ ํ๋ฆฌ์ง๋ง, ๊ฐ์ ๋ฉ์๋๋ด์์๋ง lock์ ๊ฑธ ์ ์๋ค๋ ์ ์ฝ์ด ์์
- ์ด๋ฐ ์ ์ฝ์ ํด๊ฒฐํ๊ธฐ ์ํด lock ํด๋์ค๋ฅผ ์ฌ์ฉํจ
ReentrantLock
- ์ฌ์ง์ ๊ฐ๋ฅํ lock, ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฐํ lock
- ํน์ ์กฐ๊ฑด์์ lock์ ๊ฑธ๊ณ , ๋์ค์ ๋ค์ lock์ ์ป์ด ์๊ณ์์ญ์ผ๋ก ์ง์ ์ด ๊ฐ๋ฅ
public class MyClass { private Object lock1 = new Object(); private Object lock2 = new Object(); public void methodA() { synchronized (lock1) { methodB(); } } public void methodB() { synchronized (lock2) { // do something methodA(); } } } - methodA๋ lock1์ ๊ฐ์ง๊ณ , methodB๋ lock2๋ฅผ ๊ฐ์ง - methodB์์ methodA๋ฅผ ํธ์ถํ๊ณ ์์ผ๋ฏ๋ก, methodB์์ lock2๋ฅผ ๊ฐ์ง ์ํ์์ methodA๋ฅผ ํธ์ถํ๋ฉด lock1์ ๊ฐ์ง๋ ค๊ณ ํ ๊ฒ - ๊ทธ๋ฌ๋ ์ด๋, methodA์์ ์ด๋ฏธ lock1์ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก lock2๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ์ํ๊ฐ ๋์ด ๋ฐ๋๋ฝ์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ ์์ - ํ์ง๋ง, ReetrantLock์ ์ฌ์ฉํ๋ฉด, ๊ฐ์ ์ค๋ ๋๊ฐ ์ด๋ฏธ ๋ฝ์ ๊ฐ์ง๊ณ ์๋๋ผ๋ ๋ฝ์ ์ ์งํ๋ฉฐ ๊ณ์ ์คํํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋๋ฝ์ด ๋ฐ์ํ์ง ์์ - ์ฆ, ReetrantLock์ ์ฌ์ฉํ๋ฉด ์ฝ๋์ ์ ์ฐ์ฑ์ ๋์ผ ์ ์์
ReetrantReadWriteLock
- ์ฝ๊ธฐ๋ฅผ ์ํ lock๊ณผ ์ฐ๊ธฐ๋ฅผ ์ํ lock์ ๋ฐ๋ก ์ ๊ณต
- ์ฝ๊ธฐ์๋ ๊ณต์ ์ ์ด๊ณ , ์ฐ๊ธฐ์๋ ๋ฐฐํ์ ์ธ Lock
- ์ฝ๊ธฐ lock์ด ๊ฑธ๋ ค์์ผ๋ฉด ๋ค๋ฅธ ์ค๋ ๋๋ค๋ ์ฝ๊ธฐ lock์ ์ค๋ณต์ผ๋ก ๊ฑธ๊ณ ์ฝ๊ธฐ๋ฅผ ์ํํ ์ ์์(read-only)
- ์ฝ๊ธฐ lock์ด ๊ฑธ๋ ค์๋ ์ํ์์ ์ฐ๊ธฐ lock์ ๊ฑฐ๋ ๊ฒ์ ํ์ฉ๋์ง ์์(๋ฐ์ดํฐ ๋ณ๊ฒฝ ๋ฐฉ์ง)
StampedLock
ReetrantReadWriteLock
์ ๋๊ด์ ์ธ lock์ ๊ธฐ๋ฅ์ ์ถ๊ฐํจ- ๋๊ด์ ์ธ lock : ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ ์ lock์ ๊ฑธ์ง ์๋ ๊ฒ. ๋๊ด์ ์ธ ๋ฝ์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ํ ๋ ์ถฉ๋์ด ์ผ์ด๋ ๊ฐ๋ฅ์ฑ์ด ์ ์ ์ํฉ์์ ์ฌ์ฉํจ
- ๋๊ด์ ์ธ ๋ฝ์ ์ฌ์ฉํ๋ฉด ์ฝ๊ธฐ์ ์ฐ๊ธฐ ์์ ๋ชจ๋๊ฐ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌ๋จ. ์ฐ๊ธฐ ์์ ์ด ๋ฐ์ํ์ ๋ ๋ฐ์ดํฐ๊ฐ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ๋ค์ ์ฝ๊ธฐ ์์ ์ ์ํํ์ฌ ์๋ก์ด ๊ฐ์ ์ฝ์ด๋ค์ด๊ณ , ๋ณ๊ฒฝ ์์ ์ ๋ค์ ์ํํจ. ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์ฐ๊ธฐ ์์ ์ด ๋น๋ฒํ์ง ์์ ๊ฒฝ์ฐ์๋ ๋๊ด์ ์ธ ๋ฝ์ ์ฌ์ฉํ์ฌ ๋ ๋น ๋ฅธ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํจ
- ๋๊ด์ ์ธ ์ฝ๊ธฐ lock์ ์ฐ๊ธฐ lock์ ์ํด ๋ฐ๋ก ํด์ ๊ฐ๋ฅํจ
- ๋ฌด์กฐ๊ฑด ์ฝ๊ธฐ lock์ ๊ฑธ์ง ์๊ณ , ์ฐ๊ธฐ์ ์ฝ๊ธฐ๊ฐ ์ถฉ๋ํ ๋๋ง ์ฐ๊ธฐ ํ ์ฝ๊ธฐ lock์ ๊ฒ
Condition
wait()
¬ify()
๋์ Condition์await()
&signal()
์ ์ฌ์ฉํจ
wait() & notify() ์ ๋ฌธ์ ์ ์ธ waiting pool ๋ด ์ค๋ ๋๋ฅผ ๊ตฌ๋ถํ์ง ๋ชปํ๋ค๋ ์ ์ ํด๊ฒฐํ๋ ๊ฒ
'๋ด์ผ๋ฐฐ์์บ ํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring ์ ๋ฌธ 1์ฃผ์ฐจ: ์น ๋์๋ฐฉ์ ์ดํดํ๊ธฐ (1) | 2023.10.31 |
---|---|
JAVA: static ์ถ๊ฐ ์ ๋ฆฌ (0) | 2023.10.29 |
JAVA 4์ฃผ์ฐจ: ์ ๋ค๋ฆญ (0) | 2023.10.23 |
JAVA 4์ฃผ์ฐจ: ์์ธ์ฒ๋ฆฌ (1) | 2023.10.19 |
JAVA 3์ฃผ์ฐจ: ํด๋์ค, ์์, ์ธํฐํ์ด์ค (1) | 2023.10.18 |