공통
1. 인스턴스 생성이 불가능
2. 프로토타입만 있는 메소드를 가진다. (Abstract는 둘다 가실 수 있지만 .. )
3. 사용하기 위해서는 하위 클래스(자식 클래스)에서 extends, implements해서 써야한다.
차이점
1. 상속 키워드 다르다. extends, implements
2. Abstract의 경우에 일반함수와 Abstract 함수를 혼용할 수 있지만 Interface의 경우 무조건 Abstract 메소드로 선언해야한다.
예) Abstract
public abstract void abMethod();
public void realMethod(){System.out.println("Real!");}
3. interface는 다중 상속이 가능한다.
extends는 1개만, implements는 콤마(,)를 이용해서 여러개 선언 가능
interface를 사용하는 이유
규칙을 만들고 클래스간 결합도를 낮춘다.
모두 구현되어야 하기 때문에 코드가 복잡해지면 빠져먹을 수 있는 항목을 컴파일레벨에서 확인할 수 있다.
코드간의 결합도를 낮추는 부분이 가능 큰 장점
참조되는 클래스의 변경에 참조하는 클래스들이 자유도를 높이는 코드 관리의 측면에서 잇점이 있다.
Interface를 사용하는 가장 큰 이유는 Java에서 지원하지 않는 다중상속을 지원하기 위해서 사용하며, 다중상속이 가지는 단점 즉
상속이 중첩되면서 발생되는 복잡성과, 중첩 상속되면서 발생되는 메모리의 낭비를 없애고, 장점만을 가져오기 위하여 사용하는 것이다.
즉 grandfather를 father1, father2가 상속받고, son이 father1과 father2를 다중 상속받게 되면 결과적으로 해당 객체는 grandfather를 두번 상속받게 되고, father1의 grandfather인지 father2의 grandfather인지 모호하게 된다.
public class son extends grandfather implements father1, father2{...
그렇기에 interface를 사용하게 되면 상속받은 객체 grandfather는 그냥 사용하면 되고, father1과 father2는 interface로서 son에서 구현하게 됨으로 모호함을 없애게 된다.