인터페이스(Interface)는 사전적인 의미로 두 장치를 연결하는 접속기를 말한다.
다형성 구현의 주된 기술
객체 A는 인터페이스를 통해 객체 B를 사용할 수 있다.
→ 객체 A가 객체 B의 메소드를 직접 호출하면 간단할텐데 왜 중간 인터페이스를 거치도록 하는 걸까?
객체 A는 인터페이스의 메소드만 사용하므로 객체 B가 객체 C로 변경된 것에는 관심이 없다. 만약 인터페이스 없이 객체 A가 객체 B를 직접 사용한다면 객체 A의 소스 코드를 객체 B에서 객체 C로 변경하는 작업이 추가로 필요해진다.
✅ 객체 A가 인터페이스 메소드 호출 → 객체 B 혹은 객체 C의 메소드 실행
이때, 객체 B의 실행 결과와 C의 결과가 다르다면, 객체 A는 객체 교체로 인해 다른 결과를 얻게 된다.
interface 인터페이스명 { ... } // default 접근 제한
public interface 인터페이스명 { ... } // public 접근 제한
public interface 인터페이스명 {
// public 상수 필드
// public 추상 메소드
// public 디폴트 메소드
// public 정적 메소드
// private 메소드
// private 정적 메소드
}
그림 1에서 객체 A가 인터페이스의 추상 메소드를 호출하면 인터페이스는 객체 B의 메소드를 실행한다. 그렇다면 객체 B는 인터페이스에 선언된 추상 메소드와 동일한 선언부를 가진 메소드를 가지고 있어야 한다.
✅ 여기서, 객체 B를 인터페이스를 구현한 (Implement) 객체라고 한다.
왜? 인터페이스에 정의된 추상 메소드에 대한 실행 내용이 구현(작성)되어 있기 때문이다.
public class B implements 인터페이스명 { ... }
인터페이스 ← 하나의 타입이기 때문에 변수의 타입으로 사용할 수 있다.
인터페이스는 참조 타입에 속하므로, 인터페이스 변수에는 null을 대입할 수 있다.
RemoteControl rc = null; // 가능
rc = new Television();
[public static final] 타입 상수명 = 값;
인터페이스에 선언된 필드는 모두 [public static final] 특성을 갖기 때문에, 이를 생략하더라도 자동적으로 컴파일 과정에서 붙게 된다.
상수명은 대문자로 작성하되, 서로 다른 단어로 구성되어 있을 경우에는 언더바로 연결하는 것이 관례이다.
[public abstract] 리턴타입 메소드명(매개변수, ...):
인터페이스는 구현 클래스가 재정의해야 하는 public 추상 메소드(abstract method)를 멤버로 가질 수 있다.
인터페이스의 구현 객체는 추상 메소드의 실행부를 갖는 재정의된 메소드가 있어야한다.
완전한 실행 코드를 가진 메소드
[public] default 리턴타입 메소드명(매개변수, ...) { ... }
리턴 타입 앞에, default를 적어줘야 한다. (안 적으면 오류남)
디폴트 메소드의 실행부에는 상수 필드를 읽거나 추상 메소드를 호출하는 코드를 사용할 수 있다.
구현 클래스는 디폴트 메소드를 재정의해서 자신에게 맞게 수정할 수도 있다. 이때, public 접근자를 반드시 붙여야 하고, default 키워드를 생략해야 한다.
구현 객체는 여러 개의 인터페이스를 implements 할 수 있다.

구현 클래스는 인터페이스 A와 인터페이스 B를 implements 뒤에 쉼표로 구분해서 작성해, 모든 인터페이스가 가진 추상 메소드를 재정의해야 한다.
public class 구현클래스명 implements 인터페이스A, 인터페이스B {
// 모든 추상 메소드 재정의
}
인터페이스도 다른 인터페이스를 상속할 수 있으며, 클래스와는 달리 다중 상속을 허용한다.
public interface 자식인터페이스 extends 부모인터페이스1, 부모인터페이스2 { ... }
구현 객체가 자식 인터페이스 변수에 대입되면 자식 및 부모 인터페이스의 추상 메소드를 모두 호출할 수 있으나, 부모 인터페이스 변수에 대입되면 부모 인터페이스에 선언된 추상 메소드만 호출 가능하다.
인터페이스 변수 = 구현객체;
구현 객체가 인터페이스 변수로 자동 타입 변환 된다.
캐스팅 기호를 사용해서 인터페이스 타입을 구현 클래스 타입으로 변환시키는 것
구현클래스 변수 = (구현클래스) 인터페이스변수;
구현 객체가 인터페이스 타입으로 자동 변한되면, 인터페이스에 선언된 메소드만 사용 가능하다.