작성
·
227
0
고민.1 chap 12 부터 이해가 안갔는데 threadA.start(),
threadB.start(); 이부분에서 그냥 출력하면 되지 굳이 왜 try catch를 써서 해주는지 궁금합니다. try catch는 예외 처리를 할떄 쓰는 것인데 예외 처리 할게 있는게 아닌데 왜쓰는건가요?고민 2.Runnable 인터페이스를 가져오려면 무조건 추상메소드 run을 정의해줘야하는게 아닌가요? ㅠㅠ
고민 3. Thread는 클래스고 Runnable은 인터페이스인데
이런식으로 쓰레드 객체를(?) 만들 떄 runnableA를 괄호안에 넣는 이유가 runnableA를 쓰레드화를 할려고 그런건 가요?
질문을 조금 두서 없이했지만 도와주시면 감사하겠습니다.
답변 1
0
안녕하세요! 질문해 주신 내용들을 하나씩 설명드려볼게요.
Runnable
Runnable 는 클래스가 아닌 인터페이스 입니다.
그리고 위 그림처럼 추상 매서드를 하나 가지고 있어요. (추상 매서드는 실제 매서드처럼 작동하기 위해서 반드시 재정의 되어야 하는, 실제 건물이 아닌 설계도 정도라고 생각하시면 좋을 것 같아요! 클래스가 객체의 설계도인것처럼요)
이 Runnable 인터페이스는 구상 매서드가 아닌 추상 실제 객체(인스턴스) 처럼 사용되기 위해서는 반드시 이 추상 매서드를 재정의 해야 합니다. 이 추상 매서드 그 자체로는 아무 역할도 할 수 없기 때문이에요!
그렇다면 제공해주신 사진을 한 번 볼게요
해당 사진에서 runnableA = () -> {} 형식으로 러너블 객체를 선언했어요. 이 형태를 람다라고 부릅니다.
이 람다식을 통해서 Runnable 인터페이스 run() 을
이렇게 재정의 하는 순간, 이 인터페이스를 객체처럼 사용 할 수 있게 된답니다. 아래 링크도 한번 보시면 좋을 것 같아요!
2.try-catch
이 부분을 말씀 해 주신 것 같아요! 이 부분에서 우리가 트라이-캐치 로 감싸고자 하는 매서드는 Thread 객체의 join() 매서드인데요, 이 매서드를 살펴보겠습니다.
이 부분인데요! 매서드의 선언부분에 throws InterruptedException { ... 이라고 되어 있는 부분을 봐주세요!
자바에서는 Exception 을 상속하는 예외를 체크드 익셉션, RuntimeException 을 상속하는 예외를 언체크드 익셉션이라고 부릅니다.
이 둘의 가장 큰 차이는 어느 시점에 발생하는가 에 있습니다. (체크드는 컴파일 타임, 언체크드는 런타임)
이 InterruptedException 은 Exception 을 상속하는 체크드 익셉션이기 때문에 우리가 컴파일 시점, 즉 코드를 작성하는 시점에 반드시 예외 처리를 해야하고, 하지 않으면 컴파일 에러가 발생하는 에러입니다!
이 에러를 핸들하기 위해서 try-catch 문을 사용한 것입니다.
Thread 를 선언하기 위해서 사용된 Runnable 인터페이스
Thread 의 생성자는 아래와 같이 되어있습니다.
이 생성자에서는 Runnable 타입의 객체를 필요로 하는데요, 이 Thread 객체가 생성되기 위해서 Runnable 타입을 가지는(혹은 상속, 구현하는) 어떠한 객체가 필요하다는 의미로 해석 해 주시면 좋을 것 같습니다!
도움이 되었으면 좋겠습니다. 감사합니다!
와... 친절하고 자세하고 꼼꼼한 답변 너무나 감사드립니다 😊