
ํ๋ก๊ทธ๋จ ํ๋์์ ๋์์ ์ฌ๋ฌ ๊ฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋จ์๋ฅผ ์๋ฏธํ๋ค.
thread ๋ ์ฐ๋ฆฌ๊ฐ ํธ์ถํ๋ ๊ฒ์ด ์๋๋ค.
์ฃฝ์ thread๋ ์ฌํ์ฉํ ์ ์๋ค.
โ ์๋ฅผ ๋ค์ด ํ๋์ ๊ฒ์์์ ์ฌ๋ฌ ์ ์์๊ฐ ์๋ค๋ฉด ์ ์์ ํ ๋ช
ํ ๋ช
์ thread๋ผ ํ๋ค.
โ ๊ฐ์ ๋จธ์ (JVM)์ ํตํด ์ด๋ค ์ค๋ ๋(thread)๊ฐ ์คํ ๋ ์ง ์ ํด์ง๋ค.
โ ์ค๋ ๋๋ฅผ ํตํด ํ๋ก๊ทธ๋จ์ ๋ณ๋ ฌ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.

โ start๋ฅผ ํ๋ ์๊ฐ t1, t2, t3 ๋ JVM์ ๋ฝํ๊ธฐ ์ํ ๊ฒฝ์์ ํ๋ค.
1) ๋ณ๋ ฌ
โ H/W(ํ๋ ์จ์ด)์ ์ธ ๊ฐ๋
์ด๋ค.
(๋ฉํฐ ์ฝ์ด์์ ์ฌ์ฉ)
โ ์ค์ ๋ก ๋์์ ์ฌ๋ฌ ์์
์ด ์ผ์ด๋๋ ๊ฒ์ ์๋ฏธํ๋ค.
2) ๋ณํ
โ S/W(์ํํธ ์จ์ด)์ ์ธ ๊ฐ๋
์ด๋ค.
โ ์ฌ๋ฌ ์์
์ด ๋์์ ์งํ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋๋ก ํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
(์๋ฅผ ๋ค์ด ์๋ถํ ์์คํ
์ฒ๋ผ ์ฌ์ฉ์์๊ฒ ๋ณ๋ ฌ์ ์ธ ์คํ์ ๋๋ผ๊ฒ ํด์ค๋ค.)
โ ๋ฉํฐ ์ฝ์ด๊ฐ ์๋์๋ ๋ถ๊ตฌํ๊ณ ๋ฉํฐ ์ฝ์ด์ธ ๊ฒ์ฒ๋ผ ๋๋ผ๊ฒ ํด์ฃผ๋ ๊ฒ์ด ๋ชฉ์ ์ด๋ค.
(์๋ถํ ์์คํ
์ ์ฐ๋ ์ด์ ๊ฐ ๋ฉํฐ ํ์คํน์ ํ๊ธฐ ์ํด์์ด๋ค.)
โ ์๋ต์ฑ ๋์ด๊ธฐ ์ํด thread๋ฅผ ์ฌ์ฉํ๋ค.
(ํ๋ก๊ทธ๋จ์ด ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ฉด, ๊ฐ ์ค๋ ๋๋ ๋
๋ฆฝ์ ์ผ๋ก ์คํ๋์ด ๋ณํ์ฑ์ ์คํํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.)
thread ์ ์งํฉ์ ๋งํ๋ค.
โ ์ฌ์ฉ์๊ฐ ์์ฑํ ํ๋ก๊ทธ๋จ์ด ์ด์์ฒด๊ณ์ ์ํด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ ๋น๋ฐ์ ์คํ ์ค์ธ ๊ฒ์ ์๋ฏธํ๋ค.
โ ํ๋ก์ธ์ค๊ฐ ์คํํ๊ธฐ ์ํด์ ๋ฐ๋์ CPU ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํ๋ค.
โ ์ด์์ฒด๊ณ(O/S)๊ฐ ์คํ ํ ํน์ ํ๋ก์ธ์ค๋ฅผ ์ ํ๋ค.
โ ํ๋ก์ธ์ค ๊ด๋ฆฌ๋ ์ด์์ฒด๊ณ(O/S)๊ฐ ์ ํ๋ ์์์ ๋ฐ๋ผ ์ด๋ฃจ์ด์ง๋ค.
์ด๋ฅผ ์ค์ผ์ค๋ง ์ด๋ผ๊ณ ํ๋ค.

โ ์ ๊ทธ๋ฆผ์์ ์๋ถํ ์์คํ
์ ๋ํด ์ค๋ช
ํ ์ ์๋ค.
์๋ถํ ์์คํ : ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ๋ฒ๊ฐ์ ๊ฐ๋ฉด์ ์คํ๋๋ ์์คํ ์ด๋ค.
โ ์๋ถํ ์์คํ
์ ์ฌ์ค ์ ์๊ฐ ๋น ์คํ ์ค์ธ ํ๋ก์ธ์ค๊ฐ ํ๋๋ฐ์ ์๋ค.
(๋๋ฌด ๋น ๋ฅด๊ฒ ๋๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ๋๋ผ์ง ๋ชปํ ๋ฟ์ด๋ค.)
์ ๊ทธ๋ฆผ์์ ๋ณด๊ณ ๋ค์ ์ดํด๋ฅผ ํ์๋ฉด time1์ด๋ผ๋ ์๊ฐ ๋์ B๋ง ์คํ๋๊ณ ์๋๋ฐ ์ด๋ฅผ ์ด์ผ๊ธฐํ๋ค.
โ ์ฆ, ์๊ฐ์ ์ชผ๊ฐ์ ์๊ฐ๋ง๋ค ์คํํ ํ๋ก๊ทธ๋จ์ ์ ํด์ฃผ๋ ์ผ์ ํ๋ ๊ฒ์ด๋ค.
โ ๋ค๋ฅธ ์ฝ์ด์์ ๊ฐ์ ์๊ฐ์ ์คํ๋ ์ ์๋ค.
run( ) ์์๋ ๋ค๋ฅธ ์ค๋ ๋๋ฅผ ๋ง๋ค ์ ์๋ค.
(main ๋ฉ์๋๋ thread ์ธ๋ฐ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ๊ฒ์ฒ๋ผ)
1) ๋ฐฉ๋ฒ 1
class ExtendThread extends Thread{
// run() ๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ์ฌ ์ฌ์ ์
public void run() {
System.out.println("Thread ํด๋์ค๋ฅผ ์์ : " + Thread.currentThread().getName());
}
}
public class ExtendThreadTest {
public static void main(String[] args) {
ExtendThread et = new ExtendThread();
et.start();
System.out.println("end of main : " + Thread.currentThread().getName());
}
}
โ ์ค๋ ๋๋ฅผ ์์๋ฐ์ผ๋ฉด ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
โ start( ) : thread๊ฐ ์์๋๋ค.
์ด๋, ์์์ ๋ณด๋ฉด et ๋ผ๋ ์ค๋ ๋๊ฐ ์๊ธด๋ค.
์ค๋ ๋๊ฐ ์๊ธด ํ ๊ฐ์๋จธ์ ์ด ์ด๋ค ์ค๋ ๋๋ฅผ ์ฌ์ฉํ ์ง ์ ํด์ผ ํ๋ค.
โ ์ฆ, main ์ค๋ ๋ ์ et ์ค๋ ๋ 2๊ฐ๊ฐ ์๊ธฐ๊ณ ์ด๋ฅผ, ๋์ผ ์ค๋ ๋๋ผ๊ณ ํ๋ค.
โ ์ดํ ExtendThread ํด๋์ค์ run()์ด ์คํ๋๊ณ ์ข
๋ฃ๋๋ฉด ๋ฐ๋ก ExtendThread๊ฐ ์๋ฉธ๋๋ค.
โ currentThread( ) : ํ์ฌ ์ด ์ผ์ ์ํํ๋ ์ค๋ ๋ ๊ฐ์ฒด๋ฅผ ๊ตฌํ ์ ์๋ค.
2) ๋ฐฉ๋ฒ 2_1
public class RunnableThreadTest {
public static void main(String[] args) {
// Thread ์์ฑ์์ RunnableThread ์ธ์คํด์ค๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ
Thread t = new Thread(new RunnableThread());
t.start();
System.out.println("end of main");
}
}
class RunnableThread implements Runnable{
// run() ๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ์ฌ ์ฌ์ ์
@Override
public void run() {
System.out.println("Runnable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํ");
}
}
โ ์ธํฐํ์ด์ค Runnable ์ run( ) ๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ๋ค.
โ Runnable : ์ค๋ ๋๊ฐ ํ ์ผ์ ๋ํ๋ด๋ ๊ฐ์ฒด์ด๋ค.
๋ฐฉ๋ฒ1 ๋ณด๋ค Runnable์ด ๋ ์ข์ ์๋ ์๋ค.
์๋ฐ์์๋ ๋จ์ผ ์์๋ง ํ๋ฝํ๋๋ฐ ์ด๋ฏธ ๋ค๋ฅธ ๊ฒ์ ์์๋ฐ์ ๊ฒฝ์ฐ, Runnable์ ๊ตฌํํ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ๊ทธ ์ธ์คํด์ค๋ฅผ Thread ํด๋์ค์ ์์ฑ์์ ์ ๋ฌํ์ฌ Thread ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์คํํ ์ ์๋ค.
์ด๋ฌ๋ฉด ๋ ์ ์ฐํ ๊ด๋ฆฌ๋ฅผ ํ ์ ์๋ค.
2) ๋ฐฉ๋ฒ 2_2
class ThreadEx1 extends Thread{
public void run() {
for(int i=0; i<5; i++) {
System.out.println("t1 : " + getName());
}
}
}
class ThreadEx1_2 implements Runnable{
public void run() {
for(int i=0; i<5; i++) {
System.out.println("t2 : " + Thread.currentThread().getName());
}
}
}
public class CreateThread {
public static void main(String[] args) {
ThreadEx1 t1 = new ThreadEx1();
Runnable r = new ThreadEx1_2();
Thread t2 = new Thread(r);
t1.start();
t2.start();
System.out.println(Thread.currentThread().getName());
}
}

โ ๋ค์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด Thread๊ฐ ์์๋๋ก ์๋๋์ง ์์์ ์ ์ ์๋ค.
โ ๊ทธ๋ฆฌ๊ณ ์ค๋ ๋๊ฐ ํ ์ผ์ด ์์ง ๋๋์ง ์์๋ค๋ฉด ํ๋ก๊ทธ๋จ์ ์ข
๋ฃ๋์ง ์๋๋ค.
1) NEW
2) RUNNABLE
3) BLOCK
4) WAITING
5) TIMED_WATING
6) TERMINATED

public class NormalProcess{
public static void main(String[] args) throws Exception{
String input = JOptionPane.showInputDialog(
"์๋ฌด ๊ฐ์ด๋ ์
๋ ฅํ์ธ์."
);
//์๊ฐ ์คํ๋๋ ๋์ ๋ฐ์ ์ฝ๋๊ฐ ์คํ๋์ง ์๋๊ฒ ๋ธ๋กํน์ด๋ค.
System.out.println("์
๋ ฅํ์ ๊ฐ์ " + input + "์
๋๋ค.");
for(int i=10; i>0; i--) {
System.out.println(i);
try {
Thread.sleep(1000);
} catch (Exception e) {
}
}
}
}
โ ์ ์ฝ๋์์ ์ฌ์ฉ์์๊ฒ ๊ฐ์ ์
๋ ฅ ๋ฐ์ผ๋ฉด for๋ฌธ์ ๋๋ฉด์ ์ซ์๋ฅผ ์ถ๋ ฅํ๊ณ Thread.sleep(1000) ์ ํตํด 1์ด ๋์ ์ผ์ ์ ์ง๊ฐ ๋๊ณ ๋ค์ ์ซ์๋ฅผ ์ถ๋ ฅํ๋ค.
โ JOptionPane์ด ์คํ๋๋ ๋์ ๋ฐ์ ์ฝ๋๋ค์ ์คํ๋์ง ์๋๋ฐ ์ด๋ฅผ ์
์ถ๋ ฅ ๋ธ๋กํน์ด๋ผ๊ณ ํ๋ค.
โ Thread.sleep(millisecond) : 1/1000 ์ด ๋์ ์ค๋ ๋๋ฅผ ์ ๋ค๊ฒ ํ๋ค.(์ผ์ ์ ์ง ์ํจ๋ค.)
์ ๊ทธ๋ฆผ์์ ๋ณธ๋ค๋ฉด NOT RUNNABLE ์์ ์๋์ผ๋ก ํ๋ ค์ RUNNABLE๋ก ๊ฐ๋ค.
class ThreadEx extends Thread{
public void run() {
for(int i=10; i>0; i--) {
System.out.println(i);
try {
sleep(1000);
} catch (Exception e) {
}
}
}
}
public class UsingThread {
public static void main(String[] args) throws Exception{
ThreadEx th1 = new ThreadEx();
th1.start();
String input = JOptionPane.showInputDialog(
"์๋ฌด ๊ฐ์ด๋ ์
๋ ฅํ์ธ์."
);
System.out.println("์
๋ ฅํ์ ๊ฐ์ " + input + "์
๋๋ค.");
}
}

โ ์์ ์ฝ๋์ ๋น์ทํ์ง๋ง ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅด๊ฒ ๋์จ๋ค.
์์์๋ ์
์ถ๋ ฅ ๋ธ๋กํน์ด ๊ฑธ๋ ค์์ง๋ง ์ง๊ธ ์ฝ๋๋ ์
์ถ๋ ฅ ๋ธ๋กํน์ด ์์ด ์คํํ๋ฉด ๋ฐ๋ก ์ซ์๋ฅผ ์
์ ์๋ค.
โ ๋ค๋ฅด๊ฒ ๋ํ๋๋ ์ด์ ๋ ์ง๊ธ ์ฝ๋์์๋ th1์ ์ค๋ ๋๊ฐ main ์ค๋ ๋์ ๋ฐ๋ก ์ผ์ ์ํํ๊ธฐ ๋๋ฌธ์ด๋ค.
main์ค๋ ๋๊ฐ ์คํ ๋ถ๊ฐ ์ํ๊ฐ ๋์ด๋ th1์ ๋๊ธฐ์ด์ ์๋ค๊ฐ RUNNABLE ์ํ๊ฐ ๋๊ธฐ์ ์ซ์๊ฐ ์ถ๋ ฅ๋๋ ๊ฒ์ด๋ค.
public class NormalProcess{
public static void main(String[] args) throws Exception{
long startTime = System.currentTimeMillis();
for(int i=0; i<300; i++) {
System.out.print("-");
}
System.out.println("์์์๊ฐ1 : " + (System.currentTimeMillis() - startTime));
for(int i=0; i<300; i++) {
System.out.print("l");
}
System.out.println("์์์๊ฐ2 : " + (System.currentTimeMillis() - startTime));
}
}
class ThreadEx extends Thread{
public void run() {
for(int i=0; i<300; i++) {
System.out.print("l");
}
System.out.println("์์์๊ฐ2 : " + (System.currentTimeMillis() - UsingThreadProcess.startTime));
}
}
public class UsingThreadProcess {
static long startTime = 0;
public static void main(String[] args) {
ThreadEx th1 = new ThreadEx();
startTime = System.currentTimeMillis();
th1.start();
for(int i=0; i<300; i++) {
System.out.print("-");
}
System.out.println("์์์๊ฐ1 : " + (System.currentTimeMillis() - UsingThreadProcess.startTime));
}
}
โ 2๊ฐ์ ์ฝ๋๋ฅผ ์คํํด๋ณด๋ฉด ์ค๋ ๋๋ฅผ ์ฐ์ง ์๋ ๊ฒ ๋ ๋น ๋ฅธ๋ฐ ์ ์ฐ๋ฆฌ๋ ์ค๋ ๋๋ฅผ ์ฐ๋ ์ง ์๊ฐํด๋ด์ผ ํ๋ค.
์ด์ ๋ฅผ ์ค๋ช
ํ ์ ์๋ ๊ฒ์ด ๋ฐ๋ก '๋ฌธ๋งฅ ๊ตํ' ์ด๋ค.

โ ์ ๊ทธ๋ฆผ์ ์ฐธ๊ณ ํ๋ฉด, A,B์ฒ๋ผ 1๊ฐ์ main thread๋ง ๊ฐ์ง๊ณ ์๋ค๋ฉด A๊ฐ ์ผ์ ํ๋ ๋์ B๋ ์ผ์ ํ์ง ๋ชปํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋์ผ thread ๊ฐ ์๋ ๊ฒฝ์ฐ, ๊ตํํ๋ฉด์ ์คํํ๋๋ฐ ์คํํ ๋ถ๋ถ๊น์ง ์ ์ฅํด์ค์ผ ํ๋ค.
์ ์ฅ ํ ๋ค์ ์ฝ์ด์ฃผ๋ ์ผ๋ ํด์ผํ๋๋ฐ, ์ด์ ๊ฐ์ด ์ ์ฅํ๊ณ ์ฝ๋ ๊ฒ์ ๋ฌธ๋งฅ๊ตํ ์ด๋ผ๊ณ ํ๋ค.
๋ฌธ๋งฅ๊ตํ์ ํ๋ฉด ๋น์ฉ๋ ๋ง์ด ๋ค๊ณ ์๊ฐ๋ ์ค๋ ๊ฑธ๋ฆฌ์ง๋ง ์๋ต์ฑ์ด ์ข๊ธฐ์ ์ฌ์ฉํ๋ค.
(๋น ๋ฅด๊ฒ ๊ต๋๋ฅผ ํด์ ๋์์ ์ผ์ด ์งํ๋๋ค๊ณ ์ฌ์ฉ์๊ฐ ๋๋ผ๊ธฐ ๋๋ฌธ์ด๋ค.)
DaemonThread : ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ๋๋ thread์ด๋ค.
์ฌ์ฉ์๊ฐ ๋๋ผ์ง ๋ชปํ๋ ์์ (๋ฐฑ๊ทธ๋ผ์ด๋ ์์ )์ ์ฌ์ฉํ๋ค.
<thread์ ์ข
๋ฅ>
1) ์ผ๋ฐ thread
2) DaemonThread
public class DaemonThreadTest {
public static void main(String[] args) {
// thread ์์ฑ
Thread t = new Thread() {
public void run() {
try {
System.out.println("MyThread์์");
// 5์ด๊ฐ ๋ฉ์ถค
Thread.sleep(5000);
// thread ์ข
๋ฃ ๋ฉ์ธ์ง
System.out.println("MyThread์ข
๋ฃ");
} catch(Exception e) {
// ๋ฌด์..
}
}
};
// ๋ฐ๋ชฌ ์ค๋ ๋๋ก ์ค์ ..
t.setDaemon(true);
// thread ์์
t.start();
// main ๋ฉ์๋ ์ข
๋ฃ ๋ฉ์ธ์ง
System.out.println("main() ์ข
๋ฃ");
}
}

โ ํ๋ก๊ทธ๋จ์ ๋ชจ๋ thread ๊ฐ ๋ค ๋๋์ผ ์ข
๋ฃ๊ฐ ๋๋ค.
ํ๋ก๊ทธ๋จ์์ ๋ณด์กฐ์์
๊ฐ์ ๊ฒฝ์ฐ, ์ฌ์ฉ์๊ฐ ์ธ์งํ์ง ๋ชปํ์ง๋ง ๊ณ์ ๋์ํ๊ณ ์์ ๋๋ ์๋ค. (= ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๊ณ์ ๋์ํ๊ณ ์๋ค.)
์ด๋ก ์ธํด ํ๋ก๊ทธ๋จ์ด ์ข
๋ฃ๊ฐ ์ ๋ ์๋ ์์ผ๋ฉฐ, ์ด๋ฐ ์ ๋ค์ DaemonThread๋ก ๋ง๋ค์ด ์ฃผ๋ฉด ๋๋ค.
DaemonThread๋ก ๋ง๋ค๋ฉด ์ผ๋ฐ thread๊ฐ ๋๋๋ฉด ๊ฐ์ด ๋๋๊ฒ ๋๋ค.
setDaemon()์ ํตํด DaemonThread๋ก ๋ณ๊ฒฝํ๋ค.(๋จ, start() ์ ์ ํด์ค์ผ ํ๋ค.)
public class DemonThreadTest2 {
public static void main(String[] args) {
Thread t = new Thread() {
public void run() {
try {
System.out.println("MyThread ์์");
Thread.sleep(100000);
System.out.println("MyThread ์ข
๋ฃ");
} catch (Exception e) {}
}
};
t.setDaemon(true);
t.start();
Thread t2 = new Thread() {
@Override
public void run() {
try {
Thread.sleep(3000);
System.out.println("t2์ข
๋ฃ");
} catch(Exception e) {}
}
};
t2.start();
System.out.println("main() ์ข
๋ฃ");
}
}

โ ์ ์ฝ๋๋ฅผ ์คํํ๋ฉด, ์์ ์ฌ์ง๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋๋ฐ t2๋ DaemonThread๊ฐ ์๋๋ผ์ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
class SomeThread extends Thread {
public SomeThread(String name) {
super(name);
}
@Override
public void run() {
String name = this.getName();
for(int i=0; i<10; i++) {
System.out.println(name + " is working");
}
}
}
public class RunningTest {
// main thread๋ ์ฐ์ ์์๊ฐ NORM_PRIORITY(5)์ด๋ค. 1~10
public static void main(String[] args) {
SomeThread t1 = new SomeThread("A");
SomeThread t2 = new SomeThread("B");
SomeThread t3 = new SomeThread("C");
/*
* thread์ ์ฐ์ ์์ ์ค์
* thread์ฐ์ ์์ ๋ฐ๊พธ๋๊ฑฐ ํ์ง๋ง๊ธฐ.
*/
// ํด์ฒด ํ ์คํ ๊ฒฐ๊ณผ ๋น๊ตํด ๋ณผ๊ฒ
t1.setPriority(Thread.MIN_PRIORITY);
t2.setPriority(Thread.NORM_PRIORITY);
t3.setPriority(Thread.MAX_PRIORITY);
System.out.println(t1.getPriority());
System.out.println(t2.getPriority());
System.out.println(t3.getPriority());
t1.start();
t2.start();
t3.start();
}
}

โ ์ ์ฝ๋๋ฅผ ์คํ์ํค๋ฉด ์ ์ฌ์ง๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์๋ค.
๊ฒฐ๊ณผ์์ ์ ์ ์๋ฏ์ด ์ฐ์ ์์๋ฅผ ๋ถ์ฌํ๋ค๊ณ ํด์ ๋ฌด์กฐ๊ฑด ๋จผ์ ์คํ๋๋ ๊ฒ์ ์๋๋ค.
๋จ์ง, ํ๋ฅ ๋ง ์กฐ๊ธ ๋์ฌ์ค ๋ฟ์ด๋ค.
<์ฐ์ ์์๊ฐ 100% ๊ฐ ์๋ ์ด์ >
โ 100%๋ฅผ ์ฃผ๋ฉด ์ฐ์ ์์๊ฐ ๋ฎ์ ์ ๋ค์ ๊ธฐํ๋ฅผ ์ป์ง ๋ชปํ ์๋ ์๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์ฐ์ ์์ ๋ง๊ณ ๋ค๋ฅธ ๋ฐฉ์์ ์ฃผ๋ ๊ฒ์ ์ถ์ฒํ๋ค.