인터페이스는 일종의 추상클래스이다. 인터페이스는 추상클래스처럼 추상메서드를 갖지만, 추상클래스보다 추상화 정도가 높아서 추상클래스와 달리 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다.
추상클래스를 부분적으로만 완성된 '미완성 설계도'라고 한다면, 인터페이스는 구현된 것은 아무 것도 없고 밑그림만 그려져 있는 '기본 설계도'라 할 수 있다.
interface에도 클래스터럼 접근제어자로 public 또는 default만 사용할 수 있다.
/*public default만 사용 가능*/
interface 인터페이스이름 {
public static fianl 타입 상수이름 = 값;
public abstract 메서드이름(매개변수목록);
}
- 모든 멤버변수는 public static final 이어야 하며, 이를 생략할 수 있다.
- 모든 메서드는 public abstract 이어야 하며, 이를 생략할 수 있다.
단, static메서드와 디폴트 메서드는 예외(JDK1.8부터)
인터페이스를 구현한 클래스에게 인터페이스는 조상이라 할 수 있으므로 해당 인터페이스 타입으로의 형변환이 가능하다.
Fightable 인터페이스를 구현한 Fighter 클래스가 있다고 가정했을 때,아래의 형식으로 형변환이 가능하다.
Fightable f = (Fightable)new Fighter();
Fightalbe f = new Fighter();
따라서 인터페이스는 메서드의 매개변수의 타입으로도 사용될 수 있다.
인터페이스 타입의 매개변수가 갖는 의미는 메서드 호출 시 해당 인터페이스를 구현한 클래스의 인스턴스를 매개변수로 제공해야 한다는 것이다.
class Fighter implements Fightable {
public void attack(Fightable f){ }
}
리턴타입으로 인터페이스를 지정하는 것도 가능하다.
리턴타입이 인터페이스라는 것은 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것을 의미한다.
개발시간을 단축시킬 수 있다.
인터페이스가 작성되면 이를 사용하여 프로그램을 작성하는 것이 가능하다. 메서드 호출 쪽에서 선언부만 알면 되기 때문이다.
다른 한쪽에서는 인터페이스를 구현하는 클래스를 작성하면 양쪽에서 동시에 개발을 진행할 수 있다.
표준화가 가능하다.
기본 틀을 인터페이스로 작성하여, 개발자들이 인터페이스를 구현하여 프로그램을 작성하도록 함으로 보다 일관되고 정형화된 프로그램의 개발이 가능하다.
서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.
아무런 관계도 없는 클래스들에게 하나의 인터페이스를 공통적으로 구현하도록 함으로써 관계를 맺어 줄 수 있다.

스타크레프트 게임의 예이다. 기계유닛인 SCV, Tank, Dropship은 수리할 수 있지만, 생체유닛인 Marine은 수리할 수 없다. 그렇기에 Dropship과 SCV, Tank 사이에 관계를 맺어주어야 한다.

Repairable 인터페이스를 만들어 관계가 없던 클래스 간에 관계를 맺어주었다.

그리고 repair메서드를 오버로딩할 필요 없이, 인터페이스를 매개변수로 사용하는 메서드를 만들어 주면 된다.
독립적인 프로그래밍이 가능하다.

클래스의 선언과 구현을 분리시킬 수 있다. 클래스간의 직접적인 관계를 인터페이스를 이용해서 간접적인 관계로 변경하면, 한 클래스의 변경이 관련된 다른 클래스에 영향을 미치지 않는 독립적인 프로그래밍이 가능하다.

위 자료를 보면 왼쪽에 A 와 B는 직접적으로 연결되어 B가 바뀐다면 A도 바뀌어야하는 강한 결합으로 연결되었다.
인터페이스를 사용하는 오른쪽은 A-I-B 형태로 A와 B가 직접적으로 연결되어 있지 않고 인터페이스를 거치게 되어 B가 바뀌어도 A를 바꾸지 않아도 되는 느슨한 결합으로 연결되어 있다.
이미지및 자료출처 : 자바의 정석 기초편 pdf
참고영상 및 자료 : 남궁성의 정석코딩-[자바의 정석 기초편] 인터페이스