앞에서 밝혔듯이 필자는 별로 좋아하지는 않지만 Thread를 사용해야할 때 Runnable객체

를 만들지않고,Thread 클래스를 이용해서도 같은 효과를 얻을 수 있습니다.

Thread 클래스가 Runnable인터페이스를 구현했기 때문에 Thread를 상속하게 되면 상속한 클래스의 객체는 당연히 Thread이기도하고 Runnable이기도 하겠지요.

Thread Thread로서의 삶을 시작될 때 수행하는 일은 (, 우리가 의미를 두고 설계해야하는 것) Runnable 객체의 public void run() 이므로 Thread를 상속한후에 public void

run()  반드시 적절하게 고쳐야 할 것입니다.

상속받은 클래스에서 기본 클래스에서 정의해놓은 메소드를 다시 정의하는 것을 메소드

오버라이딩(Method Overriding) 이라고 합니다.

만약 이를 적절하게 고치지 않는다면 Thread가 시작되어도 원하는 행동을 하지 않습니다.

 

public class AsiaThread extends Thread {      

    public void run() {                                                                         

        for(int i = 0; i < 10; i++)

            System.out.println("Tiger " + i );

    }

}

예제 7-10 AsiaThread.java

 

예제 7-10에서 AsiaThread클래스는 Thread 클래스를 상속(extends)했습니다.

그리고 AsiaThread Thread 클래스에서 구현되어 있는 public void run()을 새롭게 정의

하고 있습니다. , Thread클래스에서 정의되어 있는 public void run()을 사용하지 않고

AsiaThread에서 새롭게 정의한 public void run()을 사용하겠다는 뜻입니다.

이렇게 Runnable객체를 이용하지 않고 Thread를 상속해서 사용하려고 한다면 반드시

메소드 오버라이딩을 해야합니다.

 

 

예제 7-11 AfricaThread를 구현한 내용입니다.

AsiaThread와 마찬가지로 Thread를 상속했으며, public void run()메소드를 오버라이딩

했습니다.

 

public class AfricaThread extends Thread {

    public void run() {

        for(int i = 0; i < 10; i++)

            System.out.println("Zebra " + i );

    }

}

예제 7 - 11 AfricaThread.java

 

예제 7 - 12 Runnable객체를 사용하지 않고 Thread를 상속해서 같은 효과를 얻어내고

있습니다.

 

public class ExtendsThread {

    public static void main(String[] args ) {

        Thread africa = new AfricaThread();   

        africa.start();                                                                                                     

        AsiaThread asia = new AsiaThread();

        asia.start();

        System.out.println("main thread done");

    }

}

예제 7 - 12 ExtendsThread.java

 

예제 7 - 12의 경우는 Runnable객체와 Thread객체를 각각 이용한 것이 아니라

Thread를 상속하고 public void run()메소드를 오버라이딩한 Thread이면서 Runnable

AsiaThread, AfricaThread를 사용하고 있습니다.

예제 7 -12에서도 폴리모피즘을 사용하고 있는데 바로 이 부분입니다.

             Thread africa = new AfricaThread();

AfricaThread Thread이기 때문이지요.

예제 7 - 12에는 구체적인 Runnable객체를 생성하는 부분이 보이지 않는데,

이처럼 Thread클래스를 상속한후 public void run()을 오버라이딩 한 경우에는

별도의 Runnable객체가 필요하지 않고 AfricaThread에서 볼수있듯이 Thread객체를 만들고,

Thread 객체를 시작시키면 됩니다. 왜냐하면 그 객체가 Thread이기도 하고 Runnable객체

이기도 하기 때문입니다.

 

사용자 삽입 이미지

그림 7 - 2

 

Posted by
,