Gentle Breeze

[JAVA] Interface vs Abstract Class 본문

⑥ PreSTC/JAVA

[JAVA] Interface vs Abstract Class

재령 2008. 7. 22. 22:09

1. Interface 와 abstract


* 공통점

1) abstract와 interface는 그자체가 instance화 될수가 없다.
즉, TestInterface t = new TestInterface(), TestAbstract a = new TestAbstract();
둘 다 컴파일을 해보면, 에러를 발생시킨다.


2) Prototype만 있고 Body가 없는 메소드를 멤버함수로 가진다.
소스1에서 보는 바와 같이 TestInterface, TestAbstract 는 함수 선언부는 존재하지만, 내용이 없는 함수들을 포함하고 있다.


[소스1]
public interface TestInterface {
   public static int num = 8;
   public void func1();
   public void func2();
}
public abstract class TestAbstract {
   public abstract void func1() ;


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


3) abstract, interface 클래스를 사용하려면, abstract, interface 위 클래스를 상속받아서, 새로운 클래스를 생성한 후, instance화 할 수 있다.
소스2 에서 보는바와 같이 상속을 받은후, 사용해야 한다.
즉, childclass c = new childclass(); 는 컴파일시 에러가 발생하지 않는다.


[소스2]
class childclass1 extends TestAbstract {
    // Abstrace Method Overriding
   public void func1() {
      System.out.println("상속 받아서, Body를 채워줌");
   }
}

class childclass2 implements TestInterface {
   public void func1() {
      System.out.println("Class Test1");
   }
   public void func2() {
      System.out.println("Class Test2");
   }
}


* 차이점

1) Prototype만 있고 Body가 없는 메소드 즉, abstract 메소드라고 하는데, Abstract 클래스는 abstract 메소드와 일반 메소드를 혼용해서 가질수 있다. 즉, 일반메소드 + abstract 메소드 형태를 유지한다.
하지만, interface는 모든 메소드들이 abstract 메소드로 존재 해야 한다. 소스 1에서 보는봐와 같이 func1(), func2()는 모두 Body(내용) 이 없이 Prototype(선언만) 이 존재한다.


2) interface와 abstrace클래스를 상속받을때, 상속받는 키워드 가 다르다.
abstract클래스는 소스2처럼 extends를 사용하고, interface클래스는 implements 을 사용한다.


3) 다중상속 가능유무
JAVA에서는 일반 클래스에서는 다중상속을 지원하지 않는다. 즉 2개이상의 클래스를 상속 받지 못하게 되어 있다. 하지만 interface의 경우에는 다중상속이 가능하다.

4) 클래스 시작 키워드가 다르다.
abstract클래스는 abstract class.. 형태로 시작하고, 인터페이스 클래스는 interface..로 시작한다.



2. 상속자와 조언자


우선, extends는 일반 클래스와 abstract 클래스 상속에 사용되고, implement는 interface상속에 사용된다.

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

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

더 쉽게 설명하면,

extends: 부모로부터 상속
implements: 조언자로부터 상속

세상의 모든 자식들은 하나의 부모만을 가진다. 결국, extends을 사용해서, child는 단 하나의 부모로 부터 상속 받을 수 있다.

조언자는? 세상을 살아가는 데 여러 조언자를 만날수 있다. 그들은 고기 잡는 법만 알려준다. 그들이 조언한 방식을 내 나름대로 실천하는 게 바로 구현상속(implements)이다. 결국, implements을 사용해서, child는 여러 조언자를 만날 수 있다. 그리고, 조언자는 child 윈도우에게 뭔가를 주는 입장이 아니므로, 모두 interface 클래스 이어야 한다. 즉 방법만 있고, 내용이 없다.

'⑥ PreSTC > JAVA' 카테고리의 다른 글

[JAVA] JDBC <2>  (0) 2008.07.23
[JAVA] JDBC <1>  (0) 2008.07.22
[JAVA] I/O  (0) 2008.07.22
[JAVA] 정리 <2>  (0) 2008.07.22
[JAVA] Interface  (0) 2008.07.22
Comments