인터페이스(interface)는 서로 다른 두 개의 시스템, 장치 사이에서 정보나 신호를 주고받는 경우의 접점이나 경계면이다.
자바에서 인터페이스는 상수와 추상메서드로 이루어져 있고, 구현되지 않은 메서드들은 인터페이스를 구현하는 다른 클래스에서 완성하여 사용한다. 이렇게 인터페이스는 메서드의 선언부만 있고 내용은 구현 되지 않은 껍데기이다.
인터페이스를 보고 메서드의 세부내용을 알 수는 없지만, 선언부를 보고 이 메서드가 어떤 용도이고, 어떤 매개변수가 필요하고, 어떤 것을 리턴하는지 알 수 있다. 그래서 인터페이스는 클라이언트 프로그램에 어떤 메서드를 제공하는지 미리 알려주는 명세 역할을 한다.
public interface Calc { //인터페이스
double PI = 3.14;
int ERROR = -99999999; //인터페이스 과정에서 선언한 변수는 컴파일 과정에서 상수로 변환됨
int add(int nm1,int num2);
int substract(int num1, int num2);
int times(int num1, int num2);
int divide(int num1, int num2);
}
public class Calculator implements Calc { //인터페이스 구현한 클래스
@Override
public int add(int num1, int num2) {
return num1+num2;
}
@Override
public int substract(int num1, int num2) {
return num1-num2;
}
@Override
public int times(int num1, int num2) {
return num1*num2;
}
@Override
public int divide(int num1, int num2) {
if(num2!=0)
return num1/num2;
else
return Calc.ERROR;
}
자바 8부터 인터페이스에 디폴트 메서드와 정적 메서드 기능을 제공한다. 디폴트(default) 메서드란, 인터페이스에 구현코드까지 작성한 메서드이다. 정적(static) 메서드는 인스턴스 생성과 상관없이 사용할 수 있는 메서드이다.
디폴트 메서드는 defalut
예약어를 사용하는 것외에는 일반 메서드와 똑같이 구현하면 된다.
public interface Calc {
...
default void description () {
System.out.println("정수 계산기를 구현합니다");
}
}
디폴트 메서드는 하위 클래스에서 오버라이딩할 수 있다.
정적 메서드는 static
예약어를 사용하여 구현한다.
정적 메서드를 사용할 때는 인터페이스의 이름으로 직접 참조하여 사용한다.
자바 9부터 인터페이스에 private
메서드를 구현할 수 있다. private메서드는 외부에서 그 내용을 바꿀 수 없으므로, 기존에 작성된 코드를 하위 클래스에서 변경하지 않고 그대로 사용할 때 private 메서드로 작성한다.
public class Customer implements Buy,Sell {
...
}
public interface MyInterface extends X,Y {
void myMethod();
}
Shelf
를 상속받고, Queue
인터페이스를 구현한다고 하면 다음과 같이 선언부를 작성할 수 있다.public class BookShelf extends Shelf implements Queue {
...
}