Interface
사용자와 세부 구현을 나눠줘서, 사용자로 하여금 사용법만 익혀도 되도록 도와준다.
구현
최고 수준의 추상화 단계
일반 메서드는 모두 abstract 형태(그러나, JDK8에서 default method와 static method가 추가됨)
class 에 interface 키워드를 추가하여 선언
모든 멤버변수는 public static final이며 생략 가능
모든 메서드는 public abstract이며 생략 가능
public interface Face{
int HAIR_CNT = 100 // public static final이 붙어있음
void smile(); // public abstract이 붙어있음
}
인터페이스 상속
인터페이스 또한 extends를 통한 상속이 가능
차이점은 인터페이스는 다중 상속이 가능하다.(메서드 구현부가 없으므로 헷갈릴 일이 없다)
변수명이 겹칠 경우 조금 복잡해진다
- 겹치지 않을 경우 : 변수명으로 바로 접근 가능
- 서로 다른 인터페이스에서 겹칠 경우 : interface.variable로 접근해야함
- 겹치긴 하지만 상속받을 경우 : 변수명 = 자식 클래스 변수로 덮어 씌워진다.
인터페이스 구현과 객체 참조
클래스에서 implements 키워드를 사용해서 인터페이스 구현
여러 개의 interface implements가 가능하다.
모든 abstract 메서드를 오버라이드하거나, 구현하지 않을 경우 abstract 클래스로 표현해야함
다형성은 interface에도 적용된다
interface와의 관계도 is a 관계지만, 좀 더 세부적으로는 is able to(serializable, cloneable, comparable)라고도 한다
abstract 클래스와의 차이점
일반 메서드 보유 가능 여부 : 인터페이스에도 default method와 같은 메서드를 가질 수는 있지만, 기본적으로 abstract 메서드만 가질 수 있다
상속의 비용 : 다중 상속을 통해 다형성에서 큰 이점을 갖는다
인터페이스의 필요성
구현의 강제를 통한 표준화 처리 -> 간접적인 클래스 사용으로 손쉬운 모듈 교체 지원
서로 상속의 관계가 없는 클래스들에게 인터페이스를 통한 관계 부여로 다형성 확장
모듈간 독립적 프로그래밍 가능 -> 개발기간 단축
default method
인터페이스에 선언 된 구현부가 있는 일반 메서드
선언부에 default 선언 후 구현부 작성
접근 제한자는 public으로 한정됨(생략가능)
interface {
void abstractMethod();
default void defaultMethod(){
System.out.println("구현가능");
}
}
기존 interface 기반으로 동작하는 라이브러리의 interface에 추가해야하는 기능이 발생했을때,
해당 인터페이스를 상속받는 클래스들이 모두 추가된 abstract method를 구현해야하므로,
새로운 method를 추가하기 위해 필요
static method
default method의 static 버전
단, 인터페이스의 static method는 객체.staticMethod()로 접근이 불가능하다
default method의 충돌
인터페이스에 default method가 생기며, 다시 메소드의 충돌 문제가 생김
-> 이에 따라 우선 순위 부여
super class의 메소드가 default method보다 우선
interface간에 충돌이 있을 경우 반드시 override해서 해결
static method는 클래스 명으로 접근하므로 메서드 명이 같아도 충돌하지 않는다