인터페이스의 특징
- 인터페이스의 형을 대상으로 참조변수의 선언이 가능하다.
- 인터페이스의 추상메소드와 이를 구현하는 메소드 사이에 오버라이딩 관계가 성립한다.
어노테이션 @Override의 선언이 가능하다.
- 인터페이스에 선언되는 메소드
-> 인터페이스의 모든 메소드는 public이 선언된 것으로 간주한다.
- 인터페이스 내에 선언되는 변수 ( 상수 )
-> 반드시 선언과 동시에 값으로 초기화를 해야 한다.
-> 모든 변수는 public, static, final이 선언된 것으로 간주한다.
interface Printable {
int DOC_WIDTH = 270;
int DOC_HEIGHT = 120;
void print(String doc);
}
※ 인터페이스를 구현하는 클래스는 인터페이스에 존재하는 모든 추상 메소드를 구현해야한다.
하나라도 구현하지 않으면 해당 클래스를 대상으로는 인스턴스 생성이 불가능하다.
※ 인터페이스 간에도 상속이 가능하다.
※ 클래스에서 인터페이스를 구현하려면 implements 키워드를 사용한다.
※ 인터페이스에서도 상속을 지원한다.
인터페이스의 디폴트 메소드
- 기능 보강을 위해 모든 인터페이스에 추상 메소드를 추가해야 하는 상황이 생겼을 때,
이 문제를 인터페이스의 상속으로 처리하면 인터페이스의 수는 엄청나게 늘어나게 된다.
인터페이스의 수가 늘어나면 사용자가 알아야 할 인터페이스가 많아져 개발에 불편을 초래한다.
이런 상황을 해결하기 위해 인터페이스에서 디폴트 메소드를 지원한다.
디폴트 메소드의 특징
- 인터페이스에 추상 메소드를 추가해야 하는 상황에서, 이전에 개발해 놓은 코드에 영향을 미치지
않기 위해 등장한 문법이다.
- 인터페이스 내에 정의되어 있지만 그 자체로 완전한 메소드이다.
따라서 해당 인터페이스를 구현하는 클래스가 디폴트 메소드를 오버라이딩 하지 않아도 된다.
interface Printable {
void print(String doc);
default void printCMYK(String doc) {
...
...
...
}
}
※ 처음 인터페이스를 설계하는 과정에서 디폴트 메소드를 사용하는 것은 디폴트 메소드를 잘못 이해하고 잘못 사용하고 있는 것이다.
※ 인터페이스에 디폴트 메소드가 사용되었다면, 구현하는 모든 클래스들이 해당 디폴트 메소드를 사용할 수 있기 때문에 특정 기능을 특정한 클래스에만 추가하려면 인터페이스의 디폴트 메소드가 아닌 추상클래스를 사용해야 한다.
인터페이스의 static 메소드(클래스 메소드)
- 자바 8부터 인터페이스에도 static 메소드를 사용 가능하다.
- 인터페이스의 static 메소드 호출 방법은 클래스의 static 메소드 호출 방법과 같다.
interface Printable {
static void printLog(String log) {
System.out.println(log);
}
default void print(String doc) {
printLog(doc); // 인터페이스의 static 메소드 호출
}
}
인터페이스의 또 다른 사용 용도 : Marker Interface
- 인터페이스는 클래스에 특별한 표식을 다는 용도로도 사용이 된다.
이렇게 사용되는 인터페이스를 “마커 인터페이스”라 한다.
- 마커 인터페이스에는 아무런 메소드도 존재하지 않는 경우가 많다.
예) 인터페이스 Printable을 구현한 클래스의 인스턴스만 printContents 메소드의 인자가 될 수 있다.
- public void printContents( Printable doc ) { . . . }
[참고자료]
윤성우의 열혈 Java 프로그래밍
'Java > 기본' 카테고리의 다른 글
자바(Java) - 예외처리 (0) | 2020.03.01 |
---|---|
자바(Java) - 추상 클래스 (0) | 2020.02.29 |
자바(Java) - 인스턴스 접근 가능 멤버 결정 규칙 (0) | 2020.02.27 |
자바(Java) - 상속 (0) | 2020.02.26 |
자바(Java) - 다차원 배열 (0) | 2020.02.26 |