[Become a Java-Masta๐Ÿ‘จโ€๐Ÿซ 6์ฃผ์ฐจ] ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ, Enum

18307 ๋‹จ์–ด TILJavaJava

๐ŸŽฏ ๋ชฉํ‘œ

์ž๋ฐ”์˜ ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ, Enum์— ๋Œ€ํ•ด ํ•™์Šตํ•˜๊ธฐ.

๐Ÿ“Œ ํ•™์Šตํ•  ๊ฒƒ

๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

Enum


๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๋จผ์ € Process ์™€ Thread์˜ ์ฐจ์ด์ ์„ ์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐ€์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

  • ํ”„๋กœ์„ธ์Šค(Process) : OS ๋‚ด์—์„œ ์‹คํ–‰์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ

  • ์“ฐ๋ ˆ๋“œ(Thread) : ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ์‹ค์ œ ์ž‘์—…์ด ์‹คํ–‰๋˜๋Š” ํ๋ฆ„์˜ ๋‹จ์œ„

๋”ฐ๋ผ์„œ ํ”„๋กœ์„ธ์Šค๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.


์ผ๋ฐ˜์ ์œผ๋กœ ํ•œ ํ”„๋กœ๊ทธ๋žจ(Process)์€ ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ, ํ”„๋กœ๊ทธ๋žจ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‘˜ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‹คํ–‰ ๋ฐฉ์‹์„ ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ(multithread)๋ผ๊ณ  ํ•œ๋‹ค.

๊ทผ๋ฐ ์™œ ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์Šค ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์•„๋‹ˆ๋ผ ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ• ๊นŒ?

๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์Šค์™€ ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ๋Š” ์–‘์ชฝ ๋ชจ๋‘ ์—ฌ๋Ÿฌ ํ๋ฆ„์ด ๋™์‹œ์— ์ง„ํ–‰๋œ๋‹ค๋Š” ๊ณตํ†ต์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์Šค์—์„œ ๊ฐ ํ”„๋กœ์„ธ์Šค๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ ๊ฐ๊ฐ ๋ณ„๊ฐœ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค ๋‚ด์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ํ”„๋กœ์„ธ์Šค ๊ฐ„์˜ ์ „ํ™˜์—๋Š” ๋งŽ์€ ๋น„์šฉ์ด ์†Œ๋ชจ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์†๋„์™€ ๋น„์šฉ ์ธก๋ฉด์—์„œ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์œ ๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

java์—์„œ๋Š” ์“ฐ๋ ˆ๋“œ๋ฅผ 2๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. Thread ํด๋ž˜์Šค๋ฅผ ์ƒ์†
  2. Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„

Thread ํด๋ž˜์Šค

Thread ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ์“ฐ๋ ˆ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด, Thread ํด๋ž˜์Šค ๋‚ด์˜ run ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜(Override) ํ•˜๋ฉด ๋œ๋‹ค.

public class ThreadByThread extends Thread {
    @Override
    public void run() {
        System.out.println("Run Thread By Thread");
    }
}
public class Main {
    public static void main(String[] args) {
        ThreadByThread thread =new ThreadByThread();
        thread.start();
    }
}

Thread ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ start ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•จ์œผ๋กœ์จ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.


Runnable ์ธํ„ฐํŽ˜์ด์Šค

Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์“ฐ๋ ˆ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด, run ๋ฉ”์„œ๋“œ ์•ˆ์— ์“ฐ๋ ˆ๋“œ๊ฐ€ ํ•  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

public class ThreadByRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("Run Thread By Runnable");
    }
}
public class Main {
    public static void main(String[] args) {
        Thread thread = new Thread(new ThreadByRunnable());
        thread.start();
    }
}

์—ฌ๊ธฐ์„œ Runnable ๊ฐ์ฒด๋Š” Thread๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ Thread ์ƒ์„ฑ์ž์— ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ธฐ์–ด Thread ํƒ€์ž…์œผ๋กœ ์ƒ์„ฑ ํ›„ start ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•จ์œผ๋กœ์จ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.


์“ฐ๋ ˆ๋“œ ์ƒํƒœ

์“ฐ๋ ˆ๋“œ ์Šค์ผ€์ค„๋ง: ์“ฐ๋ ˆ๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ฝ”์–ด(CPU)์˜ ์ˆ˜๋ณด๋‹ค ๋งŽ์„ ๊ฒฝ์šฐ, ์“ฐ๋ ˆ๋“œ๋ฅผ ์–ด๋–ค ์ˆœ์„œ์— ์˜ํ•ด concurrentํ•˜๊ฒŒ ์‹คํ–‰ํ•  ๊ฒƒ์ธ๊ฐ€๋ฅผ ์ •ํ•˜๋Š” ์ž‘์—…

์‹คํ–‰ ์ƒํƒœ: ์‹คํ–‰ ๋Œ€๊ธฐ ์ƒํƒœ์— ์žˆ๋Š” ์“ฐ๋ ˆ๋“œ ์ค‘์—์„œ ์“ฐ๋ ˆ๋“œ ์Šค์ผ€์ค„๋ง์œผ๋กœ ์„ ํƒ๋œ ์“ฐ๋ ˆ๋“œ๊ฐ€ CPU๋ฅผ ์ ์œ ํ•˜๊ณ  run()๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•œ ์ƒํƒœ

์“ฐ๋ ˆ๋“œ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” getState() ๋ฉ”์†Œ๋“œ๋Š” ์“ฐ๋ ˆ๋“œ ์ƒํƒœ์— ๋”ฐ๋ฅธ Thread.State ์—ด๊ฑฐ ์ƒ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

์ƒํƒœ์—ด๊ฑฐ ์ƒ์ˆ˜์„ค๋ช…
์ƒ์„ฑNEW์Šค๋ ˆ๋“œ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ ์ƒํƒœ. ์•„์ง start() ํ˜ธ์ถœ ์ „
๋Œ€๊ธฐRUNNABLE์‹คํ–‰๋  ์ค€๋น„(์Šค์ผ€์ค„๋Ÿฌ์— ์˜ํ•ด ์„ ํƒ ๋ฐ›๊ธฐ ์ „)๋ฅผ ๋งˆ์นœ ์ƒํƒœ. start() ํ˜ธ์ถœ ๋จ
์ •์ง€WAITING๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ์˜ค๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋Œ€๊ธฐํ•˜๋Š” ์ƒํƒœ
TIMED_WAITING์ฃผ์–ด์ง„ ์‹œ๊ฐ„ ๋™์•ˆ ๋Œ€๊ธฐํ•˜๋Š” ์ƒํƒœ
BLOCKED์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ์ฒด์˜ lock์ด ํ’€๋ฆด ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜๋Š” ์ƒํƒœ
์ข…๋ฃŒTERNINATED์‹คํ–‰์ด ๋‹ค ๋๋‚œ ์ƒํƒœ

NEW๋กœ ์“ฐ๋ ˆ๋“œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , start() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๊ณง๋ฐ”๋กœ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์‚ฌ์‹ค์€ ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋œ ๋Œ€๊ธฐ ์ƒํƒœ์ด๋‹ค.

์‹คํ–‰ ๋Œ€๊ธฐ ์ƒํƒœ์— ์žˆ๋Š” ์“ฐ๋ ˆ๋“œ ์ค‘์—์„œ ์“ฐ๋ ˆ๋“œ ์Šค์ผ€์ค„๋ง์œผ๋กœ ์„ ํƒ๋œ ์“ฐ๋ ˆ๋“œ๋งŒ์ด ์‹คํ–‰ ์ƒํƒœ๊ฐ€ ๋˜๊ณ , ์‹คํ–‰ ์ƒํƒœ์˜ ์“ฐ๋ ˆ๋“œ๋Š” run() ๋ฉ”์†Œ๋“œ๋ฅผ ๋ชจ๋‘ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์“ฐ๋ ˆ๋“œ ์Šค์ผ€์ค„๋ง์— ์˜ํ•ด ๋‹ค์‹œ ์‹คํ–‰ ๋Œ€๊ธฐ ์ƒํƒœ๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ๋‹ค(interrupt).

๊ทธ๋ฆฌ๊ณ  ์‹คํ–‰ ๋Œ€๊ธฐ ์ƒํƒœ์— ์žˆ๋Š” ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์„ ํƒ(scheduler dispatch)๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์“ฐ๋ ˆ๋“œ ์Šค์ผ€์ค„๋ง์ด ์ด๋ฃจ์–ด ์ง„๋‹ค.

์•„๋ž˜ ํ‘œ๋Š” ์“ฐ๋ ˆ๋“œ์˜ ์ƒํƒœ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค.

๋ฉ”์†Œ๋“œ์„ค๋ช…
static void yield()ํ˜„์žฌ ์“ฐ๋ ˆ๋“œ๊ฐ€ ํ”„๋กœ์„ธ์„œ์˜ ํ˜„์žฌ ์‚ฌ์šฉ์„ ์–‘๋ณด(yield) ํ•  ์˜์‚ฌ๊ฐ€ ์žˆ๋‹ค๋Š” ์Šค์ผ€์ค„๋Ÿฌ์— ๋Œ€ํ•œ ํžŒํŠธ์ด๋‹ค.
static void sleep(long millis)ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ง€์ •๋œ ๋ฐ€๋ฆฌ ์ดˆ ๋™์•ˆ ์ผ์‹œ์ ์œผ๋กœ ์‹คํ–‰ ์ค‘์ง€ ๋˜๋„๋ก ํ•œ๋‹ค. ์ฆ‰, TIMED_WAITING ์ƒํƒœ๋กœ ๋งŒ๋“ ๋‹ค.
void join(long millis)์ด ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ž‘์—…์ด ์™„๋ฃŒ ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
void interrupt()์ด ์“ฐ๋ ˆ๋“œ์˜ interrupted ์ƒํƒœ๋ฅผ true๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

์“ฐ๋ ˆ๋“œ ์šฐ์„ ์ˆœ์œ„

์“ฐ๋ ˆ๋“œ์— ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•จ์œผ๋กœ์จ ํ•ด๋‹น ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋จผ์ € ๋ ๋‚  ํ™•๋ฅ ์„ ๋†’์—ฌ์ค€๋‹ค.

ํ•˜์ง€๋งŒ, ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’๋‹ค๊ณ  ํ•ด์„œ ๋ฌด์กฐ๊ฑด ๋จผ์ € ๋๋‚˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.


java์—์„œ ์“ฐ๋ ˆ๋“œ์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ setPriority(int weight) ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์„ค์ • ํ•  ์ˆ˜ ์žˆ๋‹ค.

weight ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ˆซ์ž๊ฐ€ ํด์ˆ˜๋ก ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€๊ฒƒ์ด๋ฉฐ, ์„ค์ • ๋ฒ”์œ„๋Š” 1๋ถ€ํ„ฐ 10๊นŒ์ง€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋””ํดํŠธ weight๋Š” ์ค‘๊ฐ„๊ฐ’์ธ 5๊ฐ€ ์„ค์ •๋œ๋‹ค.


Main ์“ฐ๋ ˆ๋“œ

Main ์“ฐ๋ ˆ๋“œ๋Š” ๋ชจ๋“  ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹œ์ž‘์ ์ด๋‹ค.

Main ์“ฐ๋ ˆ๋“œ๋กœ ํ”„๋กœ๊ทธ๋žจ์ด ์‹œ์ž‘๋˜์–ด ์‹คํ–‰์„ ๋˜๊ณ , ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ๋Š” ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ์ธ Main ์“ฐ๋ ˆ๋“œ์—์„œ๋ถ€ํ„ฐ ํŒŒ์ƒ๋˜์–ด ์ƒ์„ฑ๋œ ์“ฐ๋ ˆ๋“œ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฐธ๊ณ ๋กœ, ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” Main ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋”๋ผ๋„ ์ž์‹ ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š์œผ๋ฉด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ข…๋ฃŒ๋˜์ง€ ์•Š๋Š”๋‹ค.

public static void main(String[] args) { // ๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ 
      Thread thread = new Thread(new ThreadByRunnable());  // ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ์ƒ์„ฑ
      thread.start();
}

๋™๊ธฐํ™”

๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๊ฐ€ ํ•œ ํ”„๋กœ์„ธ์Šค๋‚ด ์ž์›์„ ๊ณต์œ ํ•˜๋ฏ€๋กœ ํ•œ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ง„ํ–‰์ค‘์ธ ์ž‘์—…์„ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ ์ชฝ์—์„œ ์‚ฌ์šฉ, ๋ณ€๊ฒฝํ•˜๋Š” ์ผ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐ ํ•˜๊ธฐ์œ„ํ•ด ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ๋งŒ ์˜์—ญ ๋‚ด์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ์“ฐ๋ ˆ๋“œ ๋™๊ธฐํ™”๋ฅผํ•œ๋‹ค.

java์—์„œ 2๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋™๊ธฐํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. synchronized ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ
  2. java.lang.Object ํด๋ž˜์Šค์˜ wait(), notify(), notifyAll() ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ

1. synchronized ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ

synchronized ํ‚ค์›Œ๋“œ๋กœ ์‹คํ–‰ ๋ธ”๋ก์ด๋‚˜, ๋ฉ”์†Œ๋“œ๋ฅผ ์ž„๊ณ„ ๊ตฌ์—ญ์œผ๋กœ ๋งŒ๋“ค์–ด ๋™๊ธฐํ™” ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

๋™๊ธฐํ™” ๋ธ”๋ก

synchronized(์“ฐ๋ ˆ๋“œ ๊ฐ์ฒด){
     // ๋™๊ธฐํ™” ์‹œํ‚ฌ ์ฝ”๋“œ
}

๋™๊ธฐํ™” ๋ฉ”์†Œ๋“œ

public static synchronized void syncMethod(){
   		// ๋™๊ธฐํ™” ์‹œํ‚ฌ ์ฝ”๋“œ
}

ํ•ด๋‹น ๋™๊ธฐํ™” ๋ธ”๋ก์ด๋‚˜, ๋ฉ”์†Œ๋“œ๋Š” ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ๋งŒ์ด ์ง„์ž…๋  ์ˆ˜ ์žˆ๋‹ค.

java.lang.Object ํด๋ž˜์Šค์˜ wait(), notify(), notifyAll() ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ

์•„๋ž˜ ํ‘œ์˜ ๋ฉ”์†Œ๋“œ๋“ค์€ ์ž„๊ณ„ ๊ตฌ์—ญ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋ฉ”์†Œ๋“œ์„ค๋ช…
wait()๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ notify()๋กœ ๋ถˆ๋Ÿฌ์ค„ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•œ๋‹ค.
notify()๋ฌด์ž‘์œ„๋กœ ๋Œ€๊ธฐ ์ค‘์ธ ์Šค๋ ˆ๋“œ๋ฅผ ๊นจ์›Œ RUNNABLE ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ, 2๊ฐœ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋Œ€๊ธฐ ์ค‘์ด๋ผ๋„ ์˜ค์ง ํ•œ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋งŒ ๊นจ์›Œ RUNNABLE ์ƒํƒœ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.
notifyAll()๋Œ€๊ธฐ ์ค‘์ธ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋ฅผ ๊นจ์šฐ๊ณ  ๋ชจ๋‘ RUNNABLE ์ƒํƒœ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

๋ฐ๋“œ๋ฝ

๋ฐ๋“œ๋ฝ์€, ๋‘ ๊ฐœ ์ด์ƒ์˜ ์“ฐ๋ ˆ๋“œ๋“ค์ด ๊ฐ์ž ์ž์›์„ ์ ์œ ํ•œ ์ƒํƒœ์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ์˜ ์ž์›์„ ์š”๊ตฌํ•˜๋ฉฐ ๋ชจ๋‘ ๋ฌดํ•œ์ • ๋Œ€๊ธฐ์ค‘์ธ ์ƒํƒœ๋ฅผ ๋งํ•œ๋‹ค.

์ฆ‰, ์“ฐ๋ ˆ๋“œ1์ด ์ž์›1์„ ์ ์œ ํ•˜์˜€๊ณ , ์“ฐ๋ ˆ๋“œ2๊ฐ€ ์ž์›2๋ฅผ ์ ์œ ํ•œ ์ƒํƒœ์—์„œ ์“ฐ๋ ˆ๋“œ1์ด ์ž์›2๋ฅผ ์š”์ฒญํ•˜๋Š”๋ฐ ์“ฐ๋ ˆ๋“œ2๋„ ์ž์› 1์„ ์š”์ฒญํ•˜์—ฌ ์„œ๋กœ ์ž์›์„ ์ ์œ ํ•œ ์ฑ„ ์š”์ฒญ๋งŒ ํ•˜๋ฉฐ ์–‘๋ณดํ•˜์ง€ ์•Š๊ณ  ๋ฒ„ํ‹ฐ๋Š” ์ƒํ™ฉ์ด๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— yield()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–‘๋ณด๋ฅผ ํ•˜๊ธฐ๋„ ํ•œ๋‹ค.


Enum

enum ์ด๋ž€ ๊ด€๋ จ์ด ์žˆ๋Š” "์ƒ์ˆ˜"์˜ ์ง‘ํ•ฉ์„ ์ •์˜ํ•˜๋Š” ํƒ€์ž…์œผ๋กœ ํด๋ž˜์Šค์˜ ํŠน์ˆ˜ํ•œ ํ˜•์‹์ด๋‹ค.

์ž๋ฐ”5๋ถ€ํ„ฐ enum ํƒ€์ž…์ด ๋„์ž…๋˜์—ˆ๊ณ , ๋ณ€์ˆ˜, ๋ฉ”์†Œ๋“œ, ์ƒ์„ฑ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

enum ํƒ€์ž…์€ ์—ฌ๋Ÿฌ ํŠน์„ฑ๋“ค์ด ์กด์žฌํ•œ๋‹ค.

  1. java.lang.Enum ํด๋ž˜์Šค(์ถ”์ƒ ํด๋ž˜์Šค)๋ฅผ ์ƒ์†ํ•œ ์™„์ „ํ•œ ํด๋ž˜์Šค์ด๋ฏ€๋กœ ํ•„๋“œ์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์—†๋‹ค.
  2. public static final ํƒ€์ž…์œผ๋กœ ๊ณต๊ฐœ๋˜๋ฉฐ ์ƒ์ˆ˜์™€ ๋™์ผํ•˜๊ฒŒ ๋ช…์นญ์„ ์ „๋ถ€ ๋Œ€๋ฌธ์ž๋กœ ์ •์˜ํ•œ๋‹ค.
  3. ๊ณ ์ •๋œ ์ƒ์ˆ˜๋“ค์˜ ์ง‘ํ•ฉ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋Ÿฐํƒ€์ž„์ด ์•„๋‹Œ ์ปดํŒŒ์ผํƒ€์ž„์— ๋ชจ๋“  ๊ฐ’์„ ์•Œ๊ณ ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ ์ƒ์„ฑ์ž์˜ ์ ‘๊ทผ์ง€์ •์ž๊ฐ€ private๋กœ ๋™์ ์œผ๋กœ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์ƒ์„ฑํ•˜๋ฉด ์•ˆ๋œ๋‹ค.
  4. singleton ํŒจํ„ด์ด ์ ์šฉ๋˜์–ด ํ•„๋“œ์— ์กด์žฌํ•˜๋Š” ์ƒ์ˆ˜ ํ•˜๋‚˜๋‹น ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋œ๋‹ค.
  5. ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ์กด์žฌํ•˜๋ฏ€๋กœ ๊ฐ์ฒด๋ฅผ equals() ๋ฉ”์†Œ๋“œ๊ฐ€ ์•„๋‹Œ == ๋กœ ๋น„๊ต๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

enum ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•

public enum CHICEKN {
    [public static final] BBQ("BBQ์น˜ํ‚จ"),  //CHICEKN.BBQ๋กœ ์ ‘๊ทผ
    [public static final] PURADAK("ํ‘ธ๋‹ค๋ฝ์น˜ํ‚จ"), // ;๊ฐ€ ์•„๋‹Œ ,
    [public static final] GOOBNE("๊ตฝ๋„ค์น˜ํ‚จ"); // ๋‚ด๋ถ€์ ์œผ๋กœ new๋กœ ์ƒ์„ฑํ•œ ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.

    private final String name; // ํ•„๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ

    [private] CHICEKN(String name) { // private ์ƒ๋žต
        this.name = name;
    }

    public String getName() { // ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ
        return name;
    }
}

enum์ด ์ œ๊ณตํ•˜๋Š” ๋ฉ”์†Œ๋“œ

enum ํƒ€์ž…์€ java.lang.Enum ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๋ฏ€๋กœ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ,

๋Œ€ํ‘œ์ ์ธ ๋ฉ”์†Œ๋“œ๋กœ๋Š” values(), valueOf(), ordinal()์ด ์žˆ๋‹ค.

๋ฉ”์†Œ๋“œ์„ค๋ช…
values()๋ชจ๋“  enum ์š”์†Œ๋“ค์„ enum ํƒ€์ž… ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜
valueOf()ํŠน์ • ๋ฌธ์ž์—ด์ด enum ํƒ€์ž…์œผ๋กœ ์กด์žฌํ•˜๋ฉด ๋ฐ˜ํ™˜(์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด exception ๋ฐœ์ƒ)
ordinal()ํ•ด๋‹น enum ์š”์†Œ์˜ index๋ฅผ ๋ฐ˜ํ™˜

EnumSet

์ด๋ฆ„ ๊ทธ๋Œ€๋กœ Set์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ enum ํƒ€์ž… ์š”์†Œ๋“ค์„ ๋‹ค๋ฃฐ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

enum์€ ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์˜ ๋‹จ์ผ ๊ฐ์ฒด์ž„์„ ๋ณด์žฅ ํ•จ์œผ๋กœ ํ•ด์‹ฑ์ž‘์—…์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— EnumSet์€ enum์˜ ์š”์†Œ ๊ฐฏ์ˆ˜๊ฐ€ 64๊ฐœ๋ฅผ ๋„˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋‚ด๋ถ€์ ์œผ๋กœ long ๋ฐ์ดํ„ฐํ˜•์˜ 64๋น„ํŠธ ํ•„๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ค€๋‹ค.

๋Œ€ํ‘œ์ ์ธ EnumSet์˜ ๋ฉ”์†Œ๋“œ๋กœ๋Š” .allOf(enum.class), EnumSet.of(enum1, enum2...), EnumSet.complementOf(enum of EnumSet), EnumSet.range(enum1, enum4) ๊ฐ€ ์žˆ๋‹ค.

๋ฉ”์†Œ๋“œ์„ค๋ช…
.allOf(enum.class)enum ํƒ€์ž…์˜ ๋ชจ๋“  ์š”์†Œ๋“ค์„ ๊ฐ€์ ธ์˜ค๊ธฐ
EnumSet.of(enum1, enum2...)ํŠน์ • enum์š”์†Œ๋“ค์„ ๊ฐ€์ ธ์˜ค๊ธฐ
EnumSet.complementOf(enum of EnumSet)ํŠน์ •ํ•œ enum์š”์†Œ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๊ฐ€์ ธ์˜ค๊ธฐ
EnumSet.range(enum1, enum4)๋ฒ”์œ„๋กœ ์š”์†Œ๋“ค ๊ฐ€์ ธ์˜ค๊ธฐ

์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ