“implements Runnable” 랑 “extends Thread” 둘중 뭐가 더 좋나요


발생하는 문제 및 실행환경

자바에서 쓰레드 생성하는 방법을 보는데 Runnable이랑 Thread랑 두가지 방법이 있더라고요!

소스코드

    public class ThreadA implements Runnable {
        public void run() {
            //Code
        }
    }
    //Started with a "new Thread(threadA).start()" call

이건 runnable예제고

    public class ThreadB extends Thread {
        public ThreadB() {
            super("ThreadB");
        }
        public void run() {
            //Code
        }
    }
    //Started with a "threadB.start()" call

이건 Thread예젠데 두 방법의 차이가 있나요??

  • 2016년 01월 05일에 작성됨

조회수 570


1 답변


좋아요
0
싫어요
채택취소하기

implements와 extends의 차인데 자바는 다중상속이 안되잖아요. 위의 예에선 ThreadB가 A라는 클래스를 상속받는다면 extends Thread는 불가능하고 그럴땐 implements Runnable을 쓰겠죠. 그런의미에서 implements Runnable을 더 많이 사용해요.


extends와 implements의 차이는 http://gdthink.blogspot.kr/2006/06/extends%EC%99%80-implements%EC%9D%98-%EC%B0%A8%EC%9D%B4.html 우선, extends는 일반 클래스와 abstract클래스 상속에 사용되고, implement는 interface상속에 사용됩니다.

그럼, 상속이라는것은? 나의 부모가 부자라면, 내가 부모로부터 상속 받는 다면 나도 부자가 됩니다. 결국, 다른것으로부터 그들의 기능을 빌려다 쓴다고 생각하시면 됩니다. 자바에서의 상속은 2가지 형태가 있습니다. 하나는 extends 이고, 다른 하나는 implements인데, 첫번째는 순수 상속으로 앞에 설명 드린것처럼, 부모로부터 모든 권한과 재산과 능력을 가져 옵니다. 다른 하나는 구현상속, 이라고 합니다. 구현상속 ==> 인터페이스라고 흔히 하죠. 상속이라기 보단. 인터페이스만을 얻어 오는 겁니다. 쉽게 얘기해서, 무언가로 부터 상속은 받되, 그 상속 내용이 란게 비어 있고, 그 비어 있는 것을 내가 꼭 채워서 써야 하는 것을 의미합니다. [소스2]는 childclass2 가 TestInterface을 상속받아서 implement 했다고 생각하시면 됩니다.

다른 비유로 설명한다면, implement(구현 상속)은 조언자로 부터 조언자가 잡은 고기를 얻는게 아니라, 고기를 잡는 방법을 얻어 온다고 생각하시면 됩니다.

그럼 실례로 들어서 생각해 봅시다. 누군가가 나에게 사용자가 입력한 내용을 파일로 저장하는 모듈을 만들어 달라고 했습니다. 파일 저장형식은 1) 엑셀, 2)html, 3)텍스트 세가지의 형식으로 저장 가능하도록 해야 한다고 할때, 개발자는 3가지의 기능이 각기 서로 상이 하므로 서로다른 3개의 모듈을 만들것 입니다. 하지만, 이 모듈을 정작 사용하는 입장에서는 3개의 모듈이 모두 같은 인터페이스를 제공 해주길 바랄것입니다. 결국 자바 클래스관점에서 본다면, 서로 다른 모듈이 하나의 인터페이스로 부터 구현 상속을 받아 야 할것 입니다. 그러면, 사용자는 그 하나의 인터페이스만 보고, 코딩을 하면 될테니까요.

더 쉽게 설명 드리면, extends: 부모로 부터 상속, implements: 조언자로 부터 상속이라고 보시면 됩니다.

세상의 모든 자식들은 하나의 부모만을 가집니다. 결국, extends을 사용해서, 차일드는 단하나의 부모로 부터 상속 받을 수 있다는거죠. 그럼, 조언자는요? 세상을 살아가는 데 여러 조언자를 만날수 있습니다. 그들은 고기 잡는 법만 알려주죠. 그들이 조언한 방식을 내나름대로 실천하는 게 바로 구현상속(implements)가 되는거죠. 결국, implements을 사용해서, 차일드는 여러 조언자를 만날수 있습니다. 그리고, 조언자는 차일드 윈도우에게 뭔가를 주는 입장이 아니므로, 모두들 interface클래스 이어야 합니다. 즉 방법만 있고, 내용이 없는 거죠.

[소스1]

public interface TestInterface {
public static int num = 8;
public void func1();
public void func2();
}
public class Test {
public void func2() {
System.out.println("func2");
}
}

[소스2]

class childclass1 extends Test{

public void func1() {
System.out.println("fun1.");
}

}

class childclass2 implements TestInterface {
public void func1() {
System.out.println("Class Test1");
}
public void func2() {
System.out.println("Class Test2");
}
}
  • 2016년 01월 05일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close