인터페이스(interface)는 클래스 혹은 프로그램이 제공하는 기능을 명시적으로 선언하는 역할을 한다.
public interface Calc {
//인터페이스에서 선언한 변수는 컴파일 과정에서 상수로 변환됨
double PI = 3.14;
int ERROR = -999999999;
//인터페이스에서 선언한 메서드는 컴파일 과정에서 추상 메서드로 변환됨
int add(int num1, int num2);
int substract(int num1, int num2);
}
위와 같이 선언한 인터페이스를 클래스가 사용하는 것을 '클래스에서 인터페이스를 구현한다(implements)'라고 한다.
public class Claculator implements Calc {
@Override
public int add(int num1, int num2) {
return num1 + num2;
}
@Override
public int substract(int num1, int num2) {
return num1 - num2;
}
}
public interface X {
void x();
}
public interface Y {
void y();
}
MyInterface 인터페이스가 X,Y 인터페이스를 상속받는 방법은 아래와 같다.
public interface MyInterface extents X, Y {
void myMethod();
}
MyInterface 인터페이스를 구현하는 MyClass 클래스 코드는 아래와 같다.
public class MyClass implements MyInterface {
@Override
public void x(){
System.out.println("x()");
}
@Override
public void y(){
System.out.println("y()");
}
@Override
public void myMethod(){
System.out.println("myMethod()");
}
}
자바 7까지는 인터페이스에서 추상메서드와 상수, 두 가지 요소만 선언해서 사용할 수 있었지만 자바 8부터 인터페이스 활용성을 높이기 위해 디폴트 메서드와 정적 메서드 기능을 제공한다.
디폴트 메서드는 인터페이스에서 구현코드까지 작성한 메서드
정적 메서드는 인스턴스 생성과 상관없이 사용할 수 있는 메서드
하지만 디폴드 메서드나 정적 메서드를 추가했다고 해서 인터페이스가 인스턴스를 생성할 수 있는 것은 아니다.
public interface calc {
...
//디폴트 메서드는 일반 메서드와 똑같이 구현하면 되고,
//메서드 자료형 앞에 defult 예약어만 써주면 된다.
defult void description() {
System.out.println("정수 계산기를 구현합니다.");
}
}
public class CalclatorTest {
public static void main(String[] args) {
int num1 = 10;
int num2 = 5;
CompleteCalc calc = new CompleteCalc(); //클래스 생성
clac.description(); //디폴트 메서드 호출
}
}
public interface calc {
...
static int total(int[] arr) {
int total = 0;
for(int i : arr) {
total += i;
}
return total;
}
}
public class CalclatorTest {
public static void main(String[] args) {
int num1 = 10;
int num2 = 5;
CompleteCalc calc = new CompleteCalc();
clac.description();
int[] arr = {1,2,3,4,5};
System.out.println(Calc.total(arr));
}
}
private 메서드는 인터페이스를 구현한 클래스에서 사용하거나 재정의할 수 없다. 따라서 기존에 구현된 코드를 변경하지 않고 인터페이스를 구현한 클래스에서 공통으로 사용하는 경우에 private 메서드로 구현하면 코드 재사용성을 높일 수 있다. 또한 클라이언트 프로그램에 제공할 기본 기능을 private 메서드로 구현하기도 한다.
private 메서드는 코드를 모두 구현해야 하므로 추상 메서드에 private 예약어를 사용할 수 없지만, static 예약어는 함께 사용 가능하다.
public interface calc {
...
defult void description() {
System.out.println("정수 계산기를 구현합니다.");
myMethod(); //디폴트메서드에서 private 메서드 호출
}
static int total(int[] arr) {
int total = 0;
for(int i : arr) {
total += i;
}
myStaticMethod(); //정적메서드에서 private static 메서드 호출
return total;
}
private void myMethod() {
System.out.println("private 메서드 입니다.");
}
private static void myStaticMethod() {
System.out.println("private static 메서드 입니다.");
}
}