본문 바로가기

심오한 세상/Java; Java FX;

자바에서interface와abstract에관해

1. 공통점:
우선 아래 소스1을 보시면, 전형적인 interface,와 abstract 클래스를 나타내고 있습니다.
1) abstract와 interface는 그자체가 instance화 될수가 없습니다.
즉, TestInterface t = new TestInterface(), TestAbstract a = new TestAbstract();
둘다 컴파일을 해보면, 에러를 발생시킵니다.

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

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

[소스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");
     }
}

[소스2]
class childclass1 extends TestAbstract {
     // Abstrace Method을 오버라이딩했습니다.
     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) Prototye만 있고 Body가 없는 메소드 즉 abstract메소드라고 하는데, Abstract 클래스는 abstract메소드와 일반 메소드를 혼용해서, 가질수 있습니다. 즉, 일반메소드 + abstrace메소드 형태를 유지한다는 겁니다.
하지만, interface는 모든 메소드들이 abstract 메소드로 존재 해야 합니다. 소스 1에서 보는봐와 같이 func1(), func2()는 모두 Body(내용) 이 없이 Prototype(선언만) 이 존재합니다.

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

3) 다중상속 가능유무 입니다.
보통 자바에서는 일반 클래스에서는 다중상속을 지원하지 않습니다. 즉 2개이상의 클래스를 상속 받지 못하게 되어 있죠. 하지만, interface의 경우에는 다중상속이 가능합니다.

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

결국 큰범주에서 보면, abstract method로만 이루어진 abstract class가 interface 인셈이죠.