[TIL 22] JAVA - 멀티 스레드(Runnable 사용법)

nini·2025년 4월 24일

KB IT's Your Life

목록 보기
24/40

Java에서 implements Runnable은 반드시 필요한가?

Java에서 멀티 스레드를 다룰 때 Runnable 인터페이스를 구현하는 방법에 대한 궁금증🤔

Runnable을 사용하여 스레드를 실행하는 방식은 상황에 따라 다르게 선택할 수 있다.

Runnable 인터페이스? 스레드에서 실행할 작업을 정의하는 인터페이스
run() 메서드를 오버라이드하여 실행할 작업을 작성
Thread 클래스와 결합하여 멀티스레딩을 구현할 때 사용


1️⃣ implements Runnable 없이 스레드 실행하기

Runnable익명 클래스람다식으로 직접 정의하면 implements Runnable을 사용하지 않고도 스레드를 실행할 수 있다. 이를 통해 간단하게 작업을 정의할 수 있고, 코드가 간결해진다.

예시 1: 익명 클래스 사용

익명 클래스는 간단한 작업을 구현할 때 유용!
코드가 짧고 즉석에서 스레드 작업을 정의할 수 있다.

public class Main {
    public static void main(String[] args) {
    // 익명 클래스 사용하여 Runnable 정의
        // Thread 클래스의 생성자에 Runnable 인터페이스 구현체를 넘김
        // 여기서 Runnable 인터페이스를 익명 클래스(이름 없는 클래스)로 바로 구현하고 있음
        Thread thread = new Thread(new Runnable() {
            
            // Runnable 인터페이스의 유일한 추상 메서드 run()을 오버라이드
            // 이 메서드 안에 작성된 내용이 스레드가 실행할 작업이 됨
            @Override
            public void run() {
                // 실제 스레드가 수행할 작업 내용
                System.out.println("동영상을 재생합니다.");
            }
        });

        // thread.start()를 호출하면 새로운 스레드가 생성되고, run() 메서드의 작업이 수행됨
        thread.start(); // 스레드 실행
    }
}

예시 2: 람다식 (Java 8 이상)

Java 8 이상에서는 람다식을 사용하여 코드의 가독성을 높일 수 있다.
람다식은 함수형 프로그래밍의 장점을 활용할 수 있어 더욱 간결하고 직관적인 코드 작성이 가능하다.

public class Main {
    public static void main(String[] args) {
        // 람다식 사용하여 Runnable 정의
        Thread thread = new Thread(() -> {
            System.out.println("동영상을 재생합니다.");
        });
        thread.start(); // 스레드 실행
    }
}

Runnable은 스레드에서 실행할 작업을 정의하는 "틀"일 뿐!

  • 따라서 익명 클래스나 람다식을 사용하여 작업을 정의할 수 있기 때문에 implements Runnable을 반드시 사용할 필요는 없다.

2️⃣ 클래스를 만들어서 재사용하고 싶다면?

Runnable클래스로 정의하여 재사용하려면 implements Runnable을 사용해야 한다. 이렇게 하면 스레드 작업을 하나의 클래스에서 재사용할 수 있어 코드의 구조화가 가능하다. 복잡한 작업을 여러 번 사용할 때 유용하다.

예시: Runnable을 구현한 클래스

public class VideoPlayTask implements Runnable {
    @Override
    public void run() {
        System.out.println("동영상을 재생합니다.");
    }
}

public class Main {
    public static void main(String[] args) {
        // VideoPlayTask 객체를 스레드에 전달
        Thread thread = new Thread(new VideoPlayTask());
        thread.start(); // 스레드 실행
    }
}

VideoPlayTask 클래스는 Runnable을 구현하고, run() 메서드에서 실제 작업을 정의한다. 이렇게 작성하면 여러 곳에서 VideoPlayTask를 재사용할 수 있다.


implements Runnable을 사용할 때와 그렇지 않을 때

방식implements Runnable 필요 여부특징
Thread 클래스 직접 상속스레드 실행을 위한 작업 클래스 1개만 필요할 때
Runnable 직접 구현코드 재사용 및 구조화, 여러 작업을 클래스화할 때 유용
익명 클래스 / 람다식간단한 작업을 한 번만 사용할 때 간결하고 직관적

❗️ 결론

  • Runnable 인터페이스를 직접 구현할 필요는 없지만, 재사용이 필요한 경우 implements Runnable을 사용하여 클래스를 정의하는 것이 좋다.

  • 익명 클래스람다식을 사용하면 코드가 간결해지고, 한 번만 사용하려는 작업을 정의하는 데 유용하다.

  • 클래스화된 작업을 재사용하고 싶다면 implements Runnable을 사용하여 구조화된 코드로 작성하는 것이 좋다!



이제 'Runnable 사용법'을 상황에 맞게 유연하게 적용할 수 있다?!
멀티스레딩 작업을 깔끔하게 처리할 수 있길 바라며😊

profile
사용자를 고려한 디자인과 UX에 관심있는 개발자

0개의 댓글