implements Runnable은 반드시 필요한가?Java에서 멀티 스레드를 다룰 때 Runnable 인터페이스를 구현하는 방법에 대한 궁금증🤔
Runnable을 사용하여 스레드를 실행하는 방식은 상황에 따라 다르게 선택할 수 있다.
Runnable 인터페이스? 스레드에서 실행할 작업을 정의하는 인터페이스
run()메서드를 오버라이드하여 실행할 작업을 작성
Thread클래스와 결합하여 멀티스레딩을 구현할 때 사용
implements Runnable 없이 스레드 실행하기Runnable을 익명 클래스나 람다식으로 직접 정의하면 implements Runnable을 사용하지 않고도 스레드를 실행할 수 있다. 이를 통해 간단하게 작업을 정의할 수 있고, 코드가 간결해진다.
익명 클래스는 간단한 작업을 구현할 때 유용!
코드가 짧고 즉석에서 스레드 작업을 정의할 수 있다.
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(); // 스레드 실행
}
}
Java 8 이상에서는 람다식을 사용하여 코드의 가독성을 높일 수 있다.
람다식은 함수형 프로그래밍의 장점을 활용할 수 있어 더욱 간결하고 직관적인 코드 작성이 가능하다.
public class Main {
public static void main(String[] args) {
// 람다식 사용하여 Runnable 정의
Thread thread = new Thread(() -> {
System.out.println("동영상을 재생합니다.");
});
thread.start(); // 스레드 실행
}
}
Runnable은 스레드에서 실행할 작업을 정의하는 "틀"일 뿐!
- 따라서 익명 클래스나 람다식을 사용하여 작업을 정의할 수 있기 때문에
implements Runnable을 반드시 사용할 필요는 없다.
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 사용법'을 상황에 맞게 유연하게 적용할 수 있다?!
멀티스레딩 작업을 깔끔하게 처리할 수 있길 바라며😊