interface는 메서드와 변수들을 가진다. 그러나 interface에 선언된 메서드는 abstract 메서드다. 다시 말해, interface는 class가 무조건 해야 하는 것, 하지 말아야 하는 것을 정의한다.
c언어에서 소스 파일과 헤더 파일로 예를 든다면, java의 interface는 헤더 파일 속성에 가깝다.
어떤 한 class가 어떤 한 interface를 implemenets 하고 있는데 method의 body를 정의하지 않는다면, class는 반드시 abstract로 선언되어야 한다.
public interface Doable
{
public void doThis();
public int doThat();
public void doThis2 (double value, char ch);
public boolean doTheOther (int num);
}
interface는 위 예시와 같이 작성된다.
Java interface는 abstract 메서드의 집합이다. abstract 메서드는 body 없이 메서드의 header만을 선언한 것을 말한다.
abstract 메서드는 abstract 수정자를 사용하여 선언될 수 있지만, interface 내에서는 모든 메서드가abstract 메서드이기 때문에 보통 생략을 한다.
abstract class Animal {
public abstract void animalSound();//abstract method
public void sleep() { //regular method
System.out.println("Zzz");
}
}
abstract 메서드와 달리 abstract class의 경우 body가 정의된 메서드도 포함할 수 있다.
abstract class와 interface는 상속받는 class에게 abstract 메서드의 구현을 강제하는 것에 공통점이 있다. 그러나 abstract class의 목적은 상속을 받아 기능을 확장, 이용하는 데 있고 interface는 메서드 구현을 강제하는 것에 있다.
둘이 비슷한데 다른 개념으로써 존재하는 이유는 자바의 다중 상속때문이다. 만약 2가지 클래스를 상속받는데 둘 모두 demoMethod()를 가지고 있을 경우, 상속받은 클래스에서 demoMethod()를 실행할 때 어떤 메서드가 실행되어야 하는지 모호해진다. 때문에 자바는 다중 상속을 하지 못하게 했는데, 인터페이스는 이러한 다중 상속 문제점을 해결할 수가 있다.