7.2 인터페이스
•하드웨어에서의 인터페이스
: 서로 다른 장치들이 연결되어서 상호 데이터를 주고받는 규격
자바 인터페이스 정의
: 여러 프로그래머들이 독립적으로 작성한 클래스를 한데 모아 하나의 소프트웨어를 완성하기 위한 상황에서,
클래스끼리의 상호작용을 기술하기 위한 일종의 규격.
1) 다형성
2) 확장성
여러 구현 클래스(다중 상속)의 존재로 채택 범위가 넓어짐.
•추상화
: 인터페이스는 메소드 몸체(세부 구현)가 없는 메소드 시그니처만 저장함.
메소드 시그니처만 공개하는 것은 사용자에게 메소드 구현을 숨김으로써 추상화를 이루는 데 도움을 줌.
> •다중 상속
: 다중 클래스 상속이 필요한 경우, 기존 방식은 심각한 모호성을 초래하므로 다중 상속 불가능.
(=다이아몬드 문제)
인터페이스는 필드의 정의가 금지되므로, 이러한 문제를 해결할 수 있음.
•느슨한 결합
: 인터페이스를 사용하면, 메소드와 메소드 시그니처를 따로 정의할 수 있어서 클래스들이 완전히 독립적인 상태에서 느슨한 결합을 이룰 수 있음.
*결합이란 하나의 클래스가 다른 클래스에 얼마나 종속되느냐이다.
< 인터페이스의 필요성과 예 >
ex) 홈 네트워크 시스템
가정에서 쓰이는 모든 가전 제품들이 유무선 하나의 시스템으로 연결, 쌍방향 통신이 가능한 미래형 가정 시스템을 말함.

-> 인터페이스가 디자인되면, 각 클래스들은 별도읭 팀에 의해 병렬적으로 작성될 수 있음.
public interface RemoteControl {
// 추상 메소드 정의
public void turnOn();
public void turnOff();
}
-인터페이스는 추상 메소드들과 디폴트 메소드들로 이루어진다.
-인터페이스 안에서 필드(변수)는 선언될 수 없다.
상수는 정의 가능하다.
•특징
(1) 이름과 매개변수만 존재(몸체X)
(2) 세미콜론으로 종료
(3) 인터페이스 내부의 메소드들은 모두 묵시적으로
public abstract이다. (생략 가능)
RemoteControl r = new RemoteControl(); // 컴파일 오류
-> 인터페이스만으로는 객체를 생성할 수 없다.
내부에 구현되지 않은 메소드가 존재하기 때문.
이는 인터페이스를 다른 클래스에 의하여 구현하는 방법으로 해결 가능하다. (=추상메소드의 몸체 정의)
•implement 키워드
인터페이스 -> 클래스
•extends 키워드
인터페이스 -> 인터페이스
•추상클래스
-관련된 클래스들 사이에서 코드를 공유하고 싶은 경우
-공통 필드나 메소드의 수가 많은 경우
-public 이외의 접근 지정자를 사용해야 하는 경우
•인터페이스
-관련 없는 클래스들이 동일한 동작을 구현하기를 원하는 경우
-특정한 자료형의 동작을 지정하고 싶지만 누가 구현하든 신경쓸 필요가 없는 경우
-다중 상속이 필요한 경우
*인터페이스는 클래스가 아니므로
new 연산자는 사용불가하다.
ex) RemoteControl obj = new RemoteControl();
& 인터페이스를 정의하는 것은 새로운 자료형을 정의하는 것과 마찬가지.
=> 인터페이스 이름을 자료형처럼 사용 가능.
참조 변수를 정의하는 데 사용하는 경우
해당되는 인터페이스를 구현한 객체라면 어떤 것이라도 이 참조 변수에 대입 가능.
Ex)
RemoteControl obj = new Television();
obj.turnOn();
obj.turnOff();