Interface
인터페이스란?
- GUI - Graphic User Interface
- 프로그램과 사용자 사이의 접점
인터페이스 작성
- 최고 수준의 추상화 단계: 일반 메소드는 모두 abstract 형태
- 형태
- 클래스와 유사하게 interface 선언
- 멤버구성
- 모든 멤버변수는 public static final이며 생략 가능
- 모든 메서드는 public abstract이며 생략 가능
인터페이스 상속
- 클래스와 마찬가지로 인터페이스도 extends를 이용해 상속이 가능
- 클래스와 다른 점은 인터페이스는 다중 상속이 가능, 헷갈릴 메소드 구현 자체가 없다.
인터페이스 구현과 객체 참조
- 클래스에서 implements 키워드를 사용해서 interface 구현
- implements한 클래스 (강제성!!)
- 모든 abstract 메소드를 override해서 구현하거나
- 구현하지 않을 경우 abstract 클래스로 표시해야 함
- 여러개의 interface implements 가능
- 인터페이스도 하나의 타입 -> 다형성은 가능하다!
Interface의 필요성
인터페이스의 필요성
- 다중 상속을 지원하기 위해 나옴
- 다른 클래스에서 미완성의 메소드를 구현(완성)해 줘야 함: implements
- 구현의 강제로 표준화 처리
- abstract 메소드 사용
- 인터페이스를 통한 간접적인 클래스 사용으로 손쉬운 모듈 교체 지원
- 서로 상속의 관계가 없는 클래스들에게 인터페이스를 통한 관계 부여로 다형성 확장
- 모듈 간 독립적 프로그래밍 가능 -> 개발 기간 단축
ex) Money, Watch, Trash는 Thing을 상속받고있다.
pay라는 method가 Money와 Watch type만 받고싶을 때,
Valuable이라는 interface를 만들어 Money와 Watch의 implements에 추가해주면 된다!
default method
- 인터페이스에 선언 된 구현부가 있는 일반 메소드
- 메소드 선언부에 default modifier 추가 후 메소드 구현부 작성
- 접근제한자는 public으로 한정됨(생략 가능)
- 메소드 선언부에 default modifier 추가 후 메소드 구현부 작성
interface DefaultMethod(){
void abstractMethod();
default void defaultMethod(){
System.out.println("이것은 기본 메소드 입니다.");
}
}
- 필요성
- 기존에 interface 기반으로 동작하는 라이브러리의 interface에 추가해야 하는 기능이 발생
- 기존 방식으로라면 모든 구현체들이 추가되는 메소드를 override해야함
- default 메소드는 abstract가 아니므로 반드시 구현해야 할 필요는 없어짐
default method의 충돌
- JDK1.7 이하의 java에서는 interface method에 구현부가 없으므로 충돌이 없었음
- JDK1.8 부터 default method가 생기면서 동일한 이름을 갖는 구현부가 있는 메서드가 충돌
- method 우선순위
- super class의 method가 우선: super class가 구체적인 method를 갖는 경우 default method는 무시됨
- interface간의 충돌: 하나의 interface에서 default method를 제공하고 다른 interface에서도 같은 이름의 method(default 유무와 무관)가 있을 때 sub class는 반드시 override해서 충돌을 해결해야한다.
static method
- interface에 선언된 static method
- 일반 static method와 마찬가지로 별도의 객체가 필요 없음
- 구현체 클래스 없이 바로 인터페이스 이름으로 method에 접근해서 사용 가능
interface StaticMethodInterface{
static void staticMethod(){
System.out.println("Static method");
}
}
public class StaticMethodTest {
public static void main(String[] args){
StaticMethodInterface.staticMethod();
}
}