Interface
- 인터페이스는 클래스나 프로그램이 제공하는 기능을 명시적으로 선언하여주는 클래스나 프로그램이 제공하는 명세이다.
- 인터페이스를 사용하면 클라이언트 프로그램들은 인터페이스에 선언된 메서드 명세만을 보고 이를 구현한 클래스를 사용할 수 있어서 편리하다.
- 어떤 객체가 하나의 인터페이스 타입이라는 것은 그 인터페이스가 제공하는 모든 메서드를 구현했다는 의미이다. (하나의 클래스가 인터페이스를 implements 받은 것은 구현코드의 상속이 아니라서 타입상속을 받았다고 한다.)
- 하나의 인터페이스로 선언된 명세를 이용하여 여러 다양한 객체를 구현하여 사용하는 것이 자바의 특성중 하나인 다형성이다.
Interface의 특징
- 구현코드가 없는 추상 메서드로만 구성되어있다. (메서드를 선언하면 모든 메서드가
public abstract
으로 컴파일된다.) - 구현 class는 interface의 모든 abstract method들을 overriding하거나 class를 abstract class로 만들어야한다.
- 구현코드가 없어서 멤버변수를 가질 수 없고 모든 변수는 상수로 선언된다. (변수들은
public static final
로 컴파일된다.) - 클래스 상속과 달리 구현 코드가 없으므로 하나의 클래스에 여러 인터페이스를 구현할 수 있다.
public interface 인터페이스_이름 {
float pi = 3.14F; // public static final으로 컴파일된다.
void makeSomething();
}
Java 8부터는 default method와 static method가 생겨 일부 구현 코드들도 존재한다.
-
default method
- 해당 인터페이스를 구현하는 클래스들에서 기본적으로 공통으로 사용할 수 있는 메서드이다.
- 구현 코드를 넣을 수 있다.
- 구현 클래스에서 필요에 따라 재정의하여 사용할 수도 있다.
- interface내에서 default method는 private method를 호출할 때 private method, private static method 둘 다 호출가능하다.
public interface Test {
default void defaultMetnod() {
privateMethod(); // private method
privateStaticMethod(); // private static method
}
}
-
static method
- static method는 static변수와 같이 인스턴스를 생성하지 않아도 사용가능하다.
- 구현 코드를 넣을 수 있다.
-
static method에서 private method를 호출할 때는 private static만 호출가능하다.
public interface Test {
static int total(int[] arr) { int total = 0; for (int num : arr) { total += num;
} //privateMethod(); //private method라 오류발생 privateStaticMethod(); // private static method라 호출 가능 return total; } }
-
private method
- 인터페이스 내부에서만 사용하기 위해 구현한 메서드로 인터페이스를 구현한 클래스에서 사용하거나 재정의 할 수 없다.
-
default method나 static method에서만 사용한다.
public interface Test {
private void privateMethod() { System.out.println("myMethod"); }
private static void privateStaticMethod() { System.out.println("my Static Method"); } }
🧑🏻💻 예시 코드
public interface Calculator {
double PI = 3.14;
int ERROR = -999999;
int add(int num1, int num2);
int substract(int num1, int num2);
int times(int num1, int num2);
int divide(int num1, int num2);
// default method는 위의 method와는 다르게 이 interface를 implement하는 클래스에서
// 꼭 재정의를 하지 않아도 사용가능하다. (원하면 재정의도 가능)
default void description() {
System.out.println("정수의 사칙연산을 제공합니다.");
myMethod();
myStaticMethod();
// default method에서는 private메서드를 기본, static둘 다 호출 가능하다.
}
// interface에서 static으로 생성한 method는 인스턴스 없이 사용 가능하다!!
static int total(int[] arr) {
int total = 0;
for (int num: arr) {
total += num;
}
//myMethod();
myStaticMethod();
// static method에서 private method를 호출할때는 private static만 호출가능하다.
return total;
}
private void myMethod() {
System.out.println("myMethod");
}
private static void myStaticMethod() {
System.out.println("my Static Method");
}
}
Interface의 형 변환
-
인터페이스를 구현한 클래스는 아래와 같이 인터페이스 형으로 선언한 변수로 형 변환 할 수 있다.
Calculator calculator = new CompleteCalculator(); // Calc는 interface, CompleteCalc는 Calc를 구현한 class
- 상속에서의 형 변환과 동일한 의미를 가지며 형 변환을 하는 경우 인터페이스에 선언된 메서드만을 사용가능하다. (클래스에서 새로 선언한 method는 사용불가하다.)
여러 인터페이스 구현 및 상속
- 자바의 인터페이스는 구현 코드가 없어서 하나의 클래스가 여러 인터페이스를 구현할 수 있다. (인터페이스는 다중 상속이 가능하다는 의미)
- default method가 중복되는 경우는 구현 class에서 해당 default method를 재정의해야한다.
- default method의 재정의의 경우
super
를 사용하여 interface의 method를 읽어와 재정의해도 되며 아예 새로 재정의하여도 된다. - 인터페이스 사이에도 상속을 할 수 있으며 이럴때는
extends
를 사용한다. - 여러 interface를 구현한 클래스를 인터페이스 타입으로 형 변환 하는 경우, 형변환하는 인터페이스에 선언된 메서드만 사용가능하다.