자식 클래스가 여러 부모 클래스를 상속받는 다중상속을 자바에서는 지원하지 않습니다.
다중 상속의 이점은 버릴수가 없기때문에 인터페이스 라는것을 통해 지원합니다.
결론적으로 인터페이스란 기본이 되는 틀만 제공되는 일종의 추상 클래스 입니다.
접근제어자 interface 인터페이스명{
...
}
위와 같이 class 대신 interface 키워드를 사용하며 클래스와 달리
인터페이스의 모든 필드는 public static final 이어야하며 메서드는 추상메서드 여야합니다.
🧾그럼 추상클래스와 인터페이스는 뭐가 다른 걸까?
추상클래스는 is-a 개념 (~는 ~ 이다)
인터페이스는 has-a 개념(~는 ~ 를 할수있다)
<class 클래스이름 implemnets 인터페이스이름{ . . .}
// 인터페이스에 선언된 추상 메소드의 실제 메소드를 구현
위와 같이 implements 키워드를 넣고 인터페이이름을 명시해야합니다.
인터페이스 참조변수에 구현체를 할당하여서 , 다형성을 확보할수있다.
인터페이스의 참조 변수로 클래스의 인스턴스를 참조할수 있고 타입의 형변환도 가능합니다.
interface a = new class 형으로 구현 할수있고
(class) a.메서드() 도 가능합니다.
하지만 인터페이스에 선언된 메서드만 호출이 가능합니다.
위에서 말했듯이 자바는 다중상속이 불가능 하지만 인터페이스는 예외이다.
하나의 클래스는 여러개의 인터페이스를 받을 수 있습니다.
인터페이스의 조상은 인터페이스만 가능합니다(Objec가 최고조상이 아니에요!)
🎈 출처 : http://www.tcpschool.com/java/java_class_declaration
interface Animal { public abstract void cry(); }
interface Cat extends Animal { public abstract void cry(); }
interface Dog extends Animal { public abstract void cry(); }
class MyPet implements Cat, Dog {
public void cry() {
System.out.println("멍멍! 냐옹냐옹!");
}
}
public class Polymorphism05 {
public static void main(String[] args) {
MyPet p = new MyPet();
p.cry();
}
}
위처럼 인터페이스를 통해 다중상속을 할경우 메서드 호출의 모호성도 방지할수 있습니다.
java 8 에 추가된 문법입니다.
인터페이스에서 메서드 구현이 가능해졌습니다.
interface Animal {
default void cry(){
System.out.println("크앙");
}
}
추상메서드가 아닌 일반 메서드이기때문에 이를 구현한 클래스는 변경할 것이 없습니다.
위처럼 일반 메서드 처럼 구현부가 있어야 하고 접근제어자의 생략이 가능합니다.
위의 Animal 을 상속받은 자식클래스는 @Override 로 재정의 할 수 있습니다.
interface Animal {
static void cry(){
System.out.println("크앙");
}
}
위처럼 일반 메서드 처럼 구현부가 있어야 하고 접근제어자의 생략이 가능합니다.
하지만 default와 다르게 상속받은 자식클래스는 @Override 로 재정의 할 수 없습니다.
java 9 이후에 private 메서드 와 private static 메서드를 추가 할 수 있습니다.
구현 클래스와 인터페이스가 상속되지 않는다
인터페이스에서 다른 메서드를 호출 할 수 있습니다.
private 은 private / abstract / default / static 메서드를 호출 가능
private static 은 static 과 static private 만 호출 가능합니다.