인터페이스는 기능에 대한 선언만 가능하기 때문에, 실제 코드를 구현한 로직은 포함될 수 없습니다. 하지만 자바8에서 이러한 룰을 깨트리는 기능이 나오게 되었는 데 그것이 Default Method(디폴트 메소드) 입니다. 메소드 선언 시에 default를 명시하게 되면 인터페이스 내부에서도 로직이 포함된 메소드를 선언할 수 있습니다.
접근제어자에서 사용하는 default와 같은 키워드이지만, 접근제어자는 아무것도 명시하지 않은 접근 제어자를 default라고 하며 인터페이스의 default method는 'default'라는 키워드를 명시해야 합니다.
interface MyInterface {
default void printHello() {
System.out.println("Hello World");
}
}
interface MyInterface {
default void printHello() {
System.out.println("Hello World");
}
}
class MyClass implements MyInterface {}
public class DefaultMethod {
public static void main(String[] args) {
MyClass myClass = new MyClass();
myClass.printHello(); //실행결과 Hello World 출력
}
}
-> 사용하는 이유: 분류하는 작업을 통해 중복을 줄이고 규모가 큰 프로젝트에서 유지보수를 용이하게 하기 위해서 추상 클래스를 사용한다.
-> 인터페이스를 이용하면 결합도가 낮은 코드를 만들어 협업과 유지보수가 용이해진다. 일반적으로 부모 클래스의 내부 구현을 자식 클래스들이 상속받아 공유할 필요가 있으면 추상클래스를 사용하고 공유할 내부 구현이 없다면 더 추상적인 인터펭스를 사용한다. (의존 대상이 구체적이기보단 추상적일수록 더 좋다. 그렇기 때문에 추상클래스보다 더 추상적인 인터페이스는 객체지향적인 코딩을 하기에 꼭 필요한 유용한 방법이다.)
| 인터페이스 | 추상클래스 |
|---|---|
| 구현 객체의 같은 동작을 보장하기 위함 | 추상클래스를 상속받아 기능을 이용, 확장하기 위함 |
| 다중 상속 가능 | 다중 상속 불가능 |
| 추상메소드만 사용 가능 | 일반메소드와 추상메소드 모두 사용 가능 |
| 생성자와 일반변수를 가질 수 없음 | 생성자와 일반변수 모두 가질 수 있음 |
| 메소드 선언만 가능 | 메소드의 부분적인 구현 가능 |
| 상속받은 클래스는 반드시 인터페이스에 있는 메소드를 모두 다 구현해야함 | 상속받는 클래스는 추상메소드만 구현해도 됨 |
| Implements 사용 | extends 사용 |