자바는 순수 추상 클래스를 더 편하게 사용할 수 있는
인터페이스를 제공한다
public abstract class Animal {
public abstract void sound();
}
public interface Animal {
void sound();
}
인터페이스는 순수 추상 클래스와 같지만
약간의 편의 기능이 추가된다
클래스 상속 관계는 UML 에서 실선을 사용하지만
인터페이스 구현 관계는 점선을 사용한다
public class Dog implements Animal {
@Override
public void sound() {
System.out.println('멍');
}
}
인터페이스도 클래스와 마찬가지로
인터페이스를 구현한 자식 클래스 생성 시 함께 메모리에 생성되어
클래스와 같이 동작한다
추상 클래스와 순수 추상 클래스, 인터페이스 모두 편의 기능과 제한에 차이가 있을 뿐
프로그램 코드, 메모리 구조상에서는 같다
인터페이스도 모두 자바에서는 .class 로 다루어진다
인터페이스는 순수 추상 클래스에 편의 기능과 제한이 추가된 것으로 생각하면 된다
인터페이스는 메서드의 이름만 있는 설계도이고
이 설계도가 어떻게 작동할지는 하위 클래스에서 모두 구현해야 한다
그래서 인터페이스는 구현한다고 표현한다
상속과 구현은 표현이 다르지만 자바 입장에서는 똑같다
일반 상속 구조와 동일하게 작동한다
모든 메서드가 추상 메서드인 경우 순수 추상 클래스를 만들어도 되지만
다음과 같은 중요한 기능이 추가되어 있기 때문에 인터페이스를 사용하는 편이 좋다
클래스가 다중 상속을 지원하지 않는 이유는 다이아몬드 문제가 발생하기 때문이다
다중 상속을 허용하면 양 부모중 어떤 곳의 메서드를 사용해야할지 불분명해지는 문제가 발생한다
인터페이스는 모두 추상 메서드로만 이루어져 있기 때문에
모든 메서드를 오버라이딩 해야한다
오버라이딩 된 함수의 경우 자식의 메서드가 호출된다
다중 구현을 허용해도 다이아몬드 문제가 발생하지 않는다
다중 구현을 하면 구현을 제공한 모든 인터페이스가
자식과 함께 메모리에 생성된다