극단적으로 동일한 목적 하에 동일한 기능을 보장하게 하기 위함. (쉽게 규격과 비슷한 개념❗️)
자바의 다향성을 이용하여 개발 코드 수정을 줄이고 유지보수성을 높힘.
인터페이스는 JAVA8 이전까지는 오로지 상수(Public static final), 추상메소드(public abstract)만 선언이 가능 했지만, JAVA8부터 디폴드메소드, 정적메소드가 추가되여 구현 강제성 안에 유연함을 더함.
클래스와 달리 인터페이스의 모든 필드는 'pubic static final' 및 제어자는 'public'으로 모든 인터페이스에 공통으로 적용되는 부분이므로 생략이 가능함. 이렇게 생략된 제어자는 컴파일 시 자바 컴파일러가 자동으로 추가해 줌.
접근제어자 interface 인터페이스이름{
(public static final) 타입 상수명 = 값;
(public) abstract 타입 메소드명(매개변수목록);
(public) default 타입 메소드명(매개변수목록){
// 구현부
}
(public) static 타입 메소드명(매개변수){
// 구현부
}
}
+) 추상클래스와 비교
추상 클래스: 없거나 하나 이상의 추상 메소드를 가지고 있는 클래스
추상 메소드: 아직 구현되어 있지 않은 abstract로 정의된 메소드
추상클래스와 인터페이스는 상속받는 클래스 혹은 구현하는 인터페이스 안에 있는 추상 메소드를 구현하도록 강제함.
추상 클래스는 추상 메소드뿐만 아니라 생성자, 필드, 일반 메소드도 포함 될 수 있으나 인터페이스는 상수, 추상메소드, 디폴드메소드, 정적메소드만을 추가할 수 있음.
❗️ 존재 목적이 다름
추상 클래스를 상속 받은 클래스는 슈퍼 클래스의 기능을 이용하거나 확장하기 위해서 사용되고, 다중 상속의 모호성 때문에 하나만 상속 가능함.
인터페이스는 해당 인터페이스의 구현을 강제함으로써 구현 객체의 같은 동작을 보장하기 위함.
인터페이스는 추상 클래스와 마찬가지로 자신이 직접 인스턴스를 생성할 수는 없음.
따라서 인터페이스가 포함하고 있는 추상 메소드를 구현해 줄 클래스를 작성해야 함.
class 클래스명 implements 인터페이스명{
}
자바에서는 다음과 같이 상속과 인터페이스 구현을 동시에 할 수 있음.
class 클래스명 extend 상위클래스명 implements 인터페이스명{
}
*인터페이스는 인터페이스로부터만 상속 받을 수 있으며, 여러 인터페이스를 상속받을 수 있음.
+) 클래스를 이용하여 다중 상속을 하면 메소드 출처의 모호성 등의 문제가 발생할 수 있음.
Ref.
Limky 삽질블로그, TCPSCHOOL.COM