인터페이스 역할
: 두 객체를 연결해주는 역할
- 객체 A가 객체 B를 직접 사용하면 될텐데 인터페이스를 사용하는 이유?

- 만약 객체 B가 객체 C로 변경된다면, 객체 A는 인터페이스의 메소드만 사용하기에 관심이 없음
- 근데 A가 B를 직접 사용한다면 A의 코드를 B에서 C를 사용하도록 다 수정해줘야 할 것
-> 코드의 수정은 줄이고 재사용성은 높이기 위한 방안
구현 클래스 선언
- 객체 A가 인터페이스의 추상 메소드를 호출하면 인터페이스는 객체 B의 메소드 실행
- B는 인터페이스에 선언된 추상 메소드와 동일한 선언부를 가진(재정의된) 메소드를 가지고 있어야 함
- 객체 B : 인터페이스를 구현한 객체 (implements)
-> 인터페이스에 정의된 추상 메소드에 대한 실행 내용이 구현되어 있기 때문

변수 선언과 구현 객체 타입
: 인터페이스도 하나의 타입이므로 변수의 타입으로 사용할 수 있음
- 인터페이스는 참조 타입에 속하므로 인터페이스 변수에는 객체를 참조하고 있지 않다는 뜻으로 null을 대입할 수 있다.
- 인터페이스를 통해 구현 객체를 사용하려면 인터페이스 변수에 구현 객체의 주소를 대입해야 함
-> 인터페이스 변수를 통해 인터페이스의 추상 메소드를 호출할 수 있음
추상 메소드
: 인터페이스는 구현 클래스가 재정의해야 하는 public abstract 메소드를 멤버로 가질 수 있음
- {} 실행부가 없는 메소드
- 인터페이스 구현 객체는 인터페이스의 추상 메소드의 실행부를 갖는 재정의된 메소드가 있어야 함
default 메소드
: 인터페이스에 완전한 실행 코드를 가진 디폴트 메소드를 선언할 수 있음
- 실행부에는 상수 필드를 읽거나 추상 메소드를 호출하는 코드
- 추상 메소드와 마찬가지로 구현 객체가 필요함
-> 구현 객체는 자신에게 맞게 디폴트 메소드 또한 재정의할 수 있음
-> 재정의 시 public 필수 / default 없애야 함
[public] default 리턴타입 메소드명 ( ) { }
static 메소드
: static 메소드는 구현 객체가 없어도 인터페이스만으로 호출 가능
- static 메소드의 실행부 작성 시 추상 메소드 / 디폴트 메소드 / private 메소드 등 호출 불가
-> 이 메소드들은 구현 객체가 필요한 메소드이기 때문
private 메소드
: 인터페이스의 상수, 추상 메소드, 디폴트 메소드, static 메소드는 모두 public. 하지만 외부에서 접근할 수 없는 private 메소드 선언도 가능.
- private : 구현 객체가 필요한 메소드
-> 디폴트 메소드 안에서만 호출이 가능
- private static : 구현 객체가 필요 없는 메소드
-> 디폴트 메소드 + static 메소드 안에서도 호출 가능
다중 인터페이스
- 구현 클래스는 구현하는 모든 인터페이스의 추상 메소드를 재정의해야 함
public class 구현클래스 implements 인터페이스1, 인터페이스2 {
// 모든 추상 메소드 정의
}
인터페이스 상속
: 인터페이스는 클래스와 달리 다중 상속 허용
- 자식 인터페이스 구현 클래스는 자식 인터페이스 + 부모 인터페이스의 모든 메소드를 재정의해야 함
- 구현 객체는 자식 및 부모 인터페이스 변수에 대입 가능
-> 자식 인터페이스 변수에 대입 : 자식 및 부모 추상 메소드 모두 호출 가능
-> 부모 인터페이스 변수에 대입 : 부모 추상 메소드만 호출 가능
타입 변환
: 인터페이스 - 구현 클래스 간에 타입 변환
- 인터페이스 변수에 구현 객체 대입 : 구현 객체는 인터페이스 타입으로 자동 변환
- 인터페이스 타입을 구현 클래스 타입으로 강제 타입 변환
자동 타입 변환

- 부모 클래스가 인터페이스를 구현하고 있다면 자식 클래스도 인터페이스 타입으로 자동 타입 변환 가능
강제 타입 변환

- 구현 객체가 인터페이스 타입으로 자동 변환되면 인터페이스에 선언된 메소드만 사용 가능

- 자동 타입 변환 후에 Television의 setTime()과 record()를 호출하고 싶다면 캐스팅 하여 Television으로 강제 타입 변환해야 한다.
다형성
: 상속보다 인터페이스를 통해 다형성을 구현하는 경우가 더 많음
- 구현 객체 B와 C중 어떤 객체가 인터페이스에 대입되냐에 따라 객체 A의 실행 결과가 달라짐

- 인터페이스 또한 상속과 마찬가지로 '메소드 재정의와 자동 타입 변환'이 필요
-> 인터페이스 추상 메소드는 구현 클래스에서 재정의
-> 구현 객체는 인터페이스 타입으로 자동 타입 변환
-> 인터페이스 메소드 호출 시 구현 객체의 재정의된 추상 메소드 호출