인터페이스(interface)
인터페이스란?
객체의 사용 방법을 정의한 타입. 객체 사용 설명서.
객체의 교환성을 높여주어 다형성을 구현하는 매우 중요한 역할을 한다.
개발 코드와 객체가 서로 통신하는 접점 역할을 한다.
개발 코드가 인터페이스의 메소드를 호출하면, 인터페이스는 객체의 메소드를 호출시킨다.
개발 코드는 객체의 내부 구조를 알 필요가 없고 인터페이스의 메소드만 알고 있으면 된다.
왜 중간에 인터페이스를 두는지?
인터페이스는 하나의 객체가 아니라 여러 객체들과 사용이 가능하므로, 어떤 객체를 사용하느냐에 따라 실행 내용과 리턴값이 다를 수 있다.
즉,
1. 개발 코드를 수정하지 않고 사용하는 객체를 변경할 수 있게 된다.
2. 코드 변경 없이 실행 내용과 리턴값을 다양화할 수 있다.
인터페이스 선언
class 대신 interface 키워드를 사용한다.
[public] interface 인터페이스명 { }
인터페이스는 상수와 추상/디폴트/정적 메소드만을 구성 멤버로 가질 수 있다.
* 상수 필드
런타임 시 데이터가 바뀌지 않는 상수만 필드로 가질 수 있다.
무조건 public 이기 때문에 public final static을 붙여도 되고, 생략해도 컴파일러가 알아서 붙인다.
선언시에 반드시 초기값을 대입해야한다.
* 디폴트 메소드
디폴트 메소드는 접근제한자가 default인 메소드가 아니다.
인터페이스에 선언되지만 사실은 객체(구현 객체)가 가지고 있는 인스턴스 메소드라고 생각해야 한다.
객체는 디폴트 메소드를 재정의=오버라이딩할 수 있다.
무조건 public 이기 때문에 생략해도 된다. default는 생략 불가.
* 추상 메소드
구현 시 무조건 재정의 해야한다.
얘도 public 생략 가능
* 정적 메소드
구현하지 않고도 바로 사용 가능.
얘도 public 생략 가능
디폴트 메소드랑 헷갈리니까 static은 생략 불가.
인터페이스 구현(implement)
인터페이스에서 정의된 추상 메소드의 실체 메소드를 가진 실체 객체를, 인터페이스의 구현 객체라고 하고
구현 객체를 생성하는 클래스를 구현 클래스라고 한다.
인터페이스 구현 방법
implements 키워드를 붙인다.
public class 클래스명 implements 인터페이스명 {
//인터페이스에 선언된 추상 메소드의 실체 메소드 구현
}
*주의점 : 인터페이스에서는 public을 생략할 수 있기 때문에 구현할 때 public을 붙여준다.
만약 추상 메소드를 구현하지 않는다면 클래스는 저절로 추상 클래스가 된다.
이 때 클래스 앞에 abstract 키워드를 붙이지 않으면 컴파일 에러가 난다.
public abstract class Television implements RemoteControl {
//추상 메소드 구현 안 했을 경우
}
객체는 여러 인터페이스를 구현할 수 있지만, 여러 인터페이스를 구현하면 그 인터페이스들이 갖고 있는 추상 클래스를 모두 구현해야 한다. 만약 하나라도 없으면 추상 클래스로 선언해야 한다.
인터페이스 타입 변수에 구현 객체를 대입하면 저절로 인터페이스 타입으로 업캐스팅 된다.
이 경우 구현 객체는 무조건 인터페이스가 갖고 있는 멤버(필드, 메소드)만 사용 가능하다.
구현 객체가 추가로 갖고 있는 멤버를 사용하기 위해서는 다운캐스팅해야한다.
상속처럼 다운캐스팅은 이미 업캐스팅 된 구현 객체만 가능하다.
* 상속과 인터페이스의 개념적 차이
상속처럼 필드와 매개변수의 다양성을 위해 쓰이는 인터페이스. 둘에는 무슨 차이가 있을까.
상속 : 같은 종류의 하위 클래스를 만드는 기술
인터페이스 : 사용 방법이 동일한 클래스를 만드는 기술
익명 구현 객체
일회성의 구현 객체를 만들기 위해 소스 파일을 만들고 클래스를 선언하는 것은 비효율적이다.
자바에서는 소스 파일을 만들지 않고도 일회성 구현 객체를 만들 수 있는 방법을 제공한다.
익명 구현 객체 선언
인터페이스타입 변수명 = new 인터페이스() {
//인터페이스에 선언된 추상 메소드의 실체 메소드 선언
};
인터페이스 상속
인터페이스는 클래스와 달리 다중 상속이 가능하다.
부모 인터페이스의 디폴트 메소드를 상속 받았을 때 자식 인터페이스는...
1. 단순히 상속만 받는다.
2. 재정의 한다.
3. 추상 메소드로 재선언한다.