public interface 인터페이스명 {
//상수(public static final 필수!!)
public static final 타입 = 값;
//추상메서드(public abstract 필수!)
타입 메서드명(매개변수..);
//디폴트메서드
default 타입메서드명(매개변수) {
~ 구현부 ~
}
//정적메서드
static 타입 메서드명(매개변수) {
~ 구현부 ~
}
상수 : 인터페이스에서 값을 정해주면 함부로 바꾸지말고 제공해주는 값만 참조(절대적)
추상메서드 : 가이드만 줄테니 추상메서드는 오버라이딩해서 재정의해라.(강제적)
디폴트메서드 : 인터페이스에서 기본적으로 제공해주지만, 맘에 안들면 각자 구현가능 (선택적)
정적메서드 : 인터페이스에서 제공해주는 것으로 무조건 사용(절대적)
public interface ProtocalA {
public abstract rule1();
} //슈퍼인터페이스
public interface ProtocalB extends ProtocalA {
public abstract rule2();
} //서브인터페이스
public class Myclass implement ProtocalB{
rule1();
rule2();
m1();
} // 클래스
Myclass obj = new Myclass();
obj.m1();
obj.rule1();
obj.rule2(); //모두 가능
ProtocalB obj2 = new ProtocalB();
obj2.m1(); //컴파일 오류!
obj2.rule1();
obj2.rule2();
ProtocalA obj3 = new ProtocalA();
obj3.m1(); //컴파일 오류!
obj3.rule1();
obj3.rule2(); //컴파일 오류!!
-인터페이스 간에 상속이 가능하다.
public interface ProtocalA {
public abstract rule0();
public abstract rule1();
}
public interface ProtocalB {
public abstract rule0();
public abstract rule2();
}
public interface ProtocalC extends ProtocalA, ProtocalB{
public abstract rule3();
}
Class Myclass extends ProtocalC{
rule3(){ ~ };
}
인터페이스 다중 상속은 중복이 되어도 상관이 없다.
=> 추상메서드이기 때문에! 어떤 인터페이스의 메서드를 상속 받더라도 결과는 같다!
다만 리턴 타입이 다르면 오버로딩 문법에 어긋나서 다중 상속이 불가능
=> 이런 경우 어떤 메서드를 상속 받는냐에 따라 동작이 달라짐.
=> 그래서 다중 상속을 허용하지 않음. 메서드 시그니처가 같아야함.
* 메서드 시그니처 : 메서드명, 메서드타입, 매개변수
public interface ProtocalA {
public abstract rule0();
public abstract rule1();
}
public interface ProtocalBP
public abstract rule0();
public abstract rule2();
}
public class Myclass() implement ProtocalA, ProtocalB {
rule0 () { ~ };
rule1 () { ~ };
rule2 () { ~ };
}
메서드 중복이 되더라도 상관이 없다.
=> 단, 두 메서드의 메서드 시그니처가 같아야함.