활동/독서

[Do it! 점프 투 자바] 07.자바 심화학습 (Runnable 인터페이스는 run() 메서드를 오버라이드 해야한다)

ByeongJun 2023. 9. 18. 14:33
반응형

* 본 게시물은 이지스퍼블리싱 [Do it! 점프 투 자바] 서평단 미션 수행 및 학습 목적으로 작성하였습니다.
 

  모든 내용, 디자인, 이미지, 편집 구성의 저작권은 이지스퍼블리싱(주)와 지은이에게 있으며

  학습 목적으로 내용을 재구성하여 작성했음을 밝힙니다. 문제시 삭제하도록 하겠습니다.


 

[Do it! 점프 투 자바] 07.자바 심화학습 (스레드 구현 및 실행 메서드 start(), run(), join())

* 본 게시물은 이지스퍼블리싱 [Do it! 점프 투 자바] 서평단 미션 수행 및 학습 목적으로 작성하였습니다. 모든 내용, 디자인, 이미지, 편집 구성의 저작권은 이지스퍼블리싱(주)와 지은이에게 있

3mmmeee.tistory.com

 

 

 

 

 

Runnable

 

public class Sample extends Thread {}         // Thread 클래스 상속 예제는 이전 게시물 참고
public class Sample implements Runnable {}

Thread 객체를 만들 때 Thread 클래스를 상속하여 만들기도 하지만, 

주로 Runnable 인터페이스를 사용한다. 

 

그 이유는 Thread 클래스를 상속하면 Thread 클래스를 상속한 클래스가 다른 클래스를 상속할 수 없기 때문이다.

 

Java에서는 단일 상속만 허용하기 때문에 여러 클래스를 동시에 상속할 수 없는 없지만,

여러 개의 인터페이스를 사용해 다중 상속과 유사한 기능을 구현할 수 있다. 

 

// Runnable 인터페이스를 구현한 MyRunnable 클래스 정의
public class MyRunnable implements Runnable {
    
    // run 메서드를 오버라이드하여 스레드가 실행할 작업을 정의
    @Override
    public void run() {
        for (int i = 1; i <= 5; i++) {
            System.out.println("Count: " + i); // 현재 숫자 출력
            try {
                Thread.sleep(1000); // 1초 대기
            } catch (InterruptedException e) {
                e.printStackTrace(); // 예외 발생 시 에러 로그 출력
            }
        }
    }

    // main 메서드로 프로그램 시작
    public static void main(String[] args) {
        // Runnable 객체 생성
        MyRunnable myRunnable = new MyRunnable();

        // Runnable 객체를 이용하여 쓰레드 생성
        Thread thread = new Thread(myRunnable);

        // 스레드 시작
        thread.start();
    }
}

각 숫자는 1초 간격으로 출력된다.

 

MyRunnable 클래스의 run() 메서드에서  i <= 5;  1에서 5까지의 숫자를 출력하고 

 Thread.sleep(1000);  1초씩 대기하는 작업을 수행하다가 

 Count: 5 가 출력된 후 스레드가 종료된다. 

 

 

 

 

 

번외로, Runnable 인터페이스는 run 메서드를 구현하도록 강제한다.

문구가 교재에 적혀 있었는데 처음에는 'run() 메서드가 없어도 된다는 말이구나' 라며 전혀 다르게 이해했다.

 

 

 

run() 메서드는 스레드가 실행될 때 실제로 수행되는 코드를 포함하고 있어야 하는데 

"강제한다." 표현은 다음과 같은 의미를 가진다.

 

 

 

  1. Runnable 인터페이스를 구현하는 클래스는 run 메서드를 반드시 오버라이드(구현)해야 한다.
    (run 메서드를 정의하지 않으면 컴파일 오류가 발생한다.)
  2. 스레드를 생성할 때, 이 Runnable 인터페이스를 구현한 객체를 생성하고 해당 객체를 스레드에 넘겨주어야 한다.
    그리고 스레드가 시작되면 해당 객체의 run() 메서드가 실행된다.
public class MyRunnable implements Runnable {
    @Override
    public void run() {
        // 스레드가 실행할 작업을 정의
        System.out.println("스레드 실행 중");
    }

    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable(); // Runnable 객체 생성
        Thread thread = new Thread(myRunnable);   // Runnable 객체를 이용하여 스레드 생성
        thread.start();                            // 스레드 실행
    }
}

이런 식으로 run() 메서드를 구현한 클래스를 만들어 스레드가 실행할 작업을 정의하고 

해당 클래스의 인스턴스를 스레드에 전달하여 스레드를 실행하는 것을

 

Runnable 인터페이스가 run() 메서드를 구현하도록 강제한다고 한다.

 

반응형