클래스에서 특정 기능을 구현하도록 강제할 수 있는 기능입니다.
인터페이스의 특징
인터페이스는 interface라는 키워드를 사용하여 정의합니다.
상수와 추상메소드로 구성되어 있으며, 자바8부터 dafault 메소드와 static메소드가 사용가능해졌습니다.
인터페이스 안의 모든 상수는 public static final 타입입니다.
인터페이스 안의 모든 추상메소드는 abstract public타입입니다.
추상클래스와 마찬가지로 인스턴스를 생성할 수 없습니다.
인터페이스는 레퍼런스 변수의 인터페이스 타입으로 사용될 수 있습니다.
인터페이스는 다른 인터페이스를 extends키워드로 상속받을 수 있으며, 다중상속이 가능합니다.
클래스에서 인터페이스의 구현은 implements키워드를 사용하여 구현할 인터페이스를 지정 후, 추상메소드를 모두 오버라이드하여 내용을 완성해야합니다.
인터페이스가 여러곳에서 사용되고 있는 상황에서, 새로운 추상메소드를 추가할 경우, 해당 인터페이스를 implements한 모든 클래스에서 강제적으로 추상메소드를 구현해야하고, 구현하지 않을 시 전부 에러가 납니다.
하지만, 디폴트메소드를 정의하여 기본 구현부를 제공하고, 구현부가 마음에 들지 않으면 각자가 오버라이딩을 하여 재구현 할 수 있도록 선택적인 메소드를 가이드한다면 시스템 운영 유지보수성이 확보될 것 입니다.
따라서, JAVA8 이전까지는 상수, 추상메소드만 선언이 가능했지만, JAVA8부터 default 메소드와 static메소드가 추가되었습니다. 이는 디폴트메소드와 정적메소드를 통해 구현강제성 안에 유연성을 추가해주었음을 의미합니다.
즉, 더 쉽게 말 한다면 이미 운영되고 있는 시스템에서 추가요건으로 인해 불가피하게 반영해야할때 디폴트메소드 쓰면 효과적입니다.
public interface 인터페이스명 {
//상수
타입 상수명 = 값;
//추상 메소드
타입 메소드명(매개변수, ... );
//디폴트 메소드
default 타입 메소드명(매개변수, ... ){
//구현부
}
//정적 메소드
static 타입 메소드명(매개변수) {
//구현부
}
}
각각의 의미는 다음과 같습니다.
상수 : 인터페이스에서 값을 정해줄테니, 값을 바꾸지 말고 제공해주는 값만 참조해라(절대적)
추상메소드: 가이드만 줄테니 추상메소드를 오버라이딩해서 재구현해라(강제적)
디폴트 메소드: 인터페이스에서 기본적으로 제공해주지만, 맘에 안들면 각자 구현해서 써도됨(선택적)
정적메소드: 인터페이스에서 제공해주는 것으로 무조건 사용(절대적)