Runnable 인터페이스는 누가 주인인가? 기술

최근 메일링 리스트에서 누군가 한 말인데


"Runnable도 쓰레드와 함께 사용하지 않으면 굳이 구현할 의미가 없습니다. 직접 함수 호출하면 되지요.”


이 발언은 아마도 Runnable의  소유주를 Thread라고 생각해서 나온 발언으로 보이는데..


과연 Runnable는 쓰래드와 함께가 아니면 필요없을까?  정말 저 Runnable은 Thread가 소유하는 걸까?



물론 아니다. 



메커니즘을 제공하는 프레임워크와 문맥을 제공하는 인터페이스를  만들다 보면 추상화의 과정을 거쳐 의존성 역전이 이루어지는 순간이 있다. 


로버트 C 마틴 의 소프트웨어 개발의 지혜를 보면 버튼이 램프를 켜는 예가 나오는데 버튼이 램프를 사용하는 디자인을 개선 해 나가다 보면


Version 1

Button -(use)-> Lamp 


Version 2

Button -(use) -> <<interface>> ButtonServer <-(implements) Lamp



Version 3

Button -(use)->  <<Interface>> SwitchableDevice <-(implements) Lamp



이런 순간이 바로 의존성 역전이 이루어진 부분이다. 


여기에서 SwitchableDevice는 누가 소유 하는가? 

분명 Button이  사용하고, Lamp가 구현하고 있다. 하지만 SwitchableDevice 자체는 이 두 클래스와 상관이 없다. 아무도 이 인터페이스를 소유하지 않는다. 이 SwitchableDevice인터페이스는 여러 클라이언트가 사용할수 있고, 여러 서버가 구현할수 있는 인터페이스이며 심지어는 어플리케이션의 경계도 넘을수 있는 인터페이스이다. 


물론, 자바에서는 클래스파일이 물리적인 패키지에 따르는 구조이기 때문에 결국 특정 패키지가 이 클래스를 소유해야 한다. Runnable은 java.lang에 속해 있다. 


하지만 Runnable을 java.lang.Thread만 쓰는건 아니지 않은가.


SwingUtility.invokeLater(new Runnable(){ public void run(){okButtok.setEnabled(true);}});



처럼 실행가능한 코드(Code Block, Closure)를 담아야 하는 문맥에서는 여기저기에서 사용되고 있는 인터페이스이다. 



따라서 이런 Runnable 처럼 잘 추상화되고 의존성 역전된 인터페이스는  주인이 없다.