인터페이스(Interface)
- 구현 코드가 없는 메서드들의 집합을 의미함.
- 모든 메서드가 추상 메서드로 선언됨 적지 않아도 추상 메서드로 JVM에서 알아서 선언
- 모든 변수는 상수로 선언됨
- 모든 인터페이스는 형변환이 가능
- 형변환해서 사용한다고 하면, 상위 인터페이스 객체로 만들면 상위 인터페이스에 있는 메서드만 사용가능하고
- 하위클래스에서 만든 함수는 사용하지 못함
인터페이스 사용법
- interface로 생성된 곳에 상속받아 구현할 메서드의 내용만 작성함
- implements를 사용하여 상속을 받음
- 하위클래스에서 interface에 정의된 내용을 일부분만 구현을 한다면 abstract를 사용하여 처리해야함, 다 구현을 한다면 abstract를 정의 하지 않아도됨
인터페이스를 사용하는 이유
- 클래스나 프로그램이 제공하는 기능을 명시적으로 선언
- 일종의 클라이언트 코드와의 약속이며 클래스나 프로그램이 제공하는 명세서 라고 보면됨
- 어떤 객체가 하나의 인터페이스 타입이라는 것은 그 인터페이스가 제공하는 모든 메서드를 구현했다는 의미
예제 코드
public interface Calc {
double PI = 3.14;
int ERROR = -999999999;
int add(int num1, int num2);
int substract(int num1, int num2);
int times(int num1, int num2);
int divide(int num1, int num2);
}
- 위 와 같이 interface코드가 있다면 add, substract, times, divide를 하위 클래스에서 모두 작성을 해줘야 사용이 가능함
//implements를 이용하여 상속 받기
public abstract class Calculator implements Calc{
//@Override를 이용하여 구현하기
@Override
public int add(int num1, int num2) {
return num1 + num2;
}
@Override
public int substract(int num1, int num2) {
return num1 - num2;
}
}
- implements Calc를 이용하녀 Calc를 인터페이스를 상속받음
- 아래 add, substract, times, divide중 add, substract만 구현하고 나머지 두개는 구형하지 않았으므로
- class 명 앞에 abstract를 붙였음 안붙이면 오류가 발생함.
public class CompleteCalc extends Calculator{
@Override
public int times(int num1, int num2) {
return num1 * num2;
}
@Override
public int divide(int num1, int num2) {
if(num2 == 0) {
return ERROR;
}
return num1/num2;
}
public void showIfo() {
System.out.println("모두 구현했습니다.");
}
}
- 나머지를 구현하기 위해 만든 클래스는 interface가 아닌 클래스를 상속받으므로 implements를 쓰지 않고, extends로 클래스를 상속받아야함
- 상위 클래스에서 abstract를 처리가 되어있던 나머지 함수를 모두 구현 하였기 때문에 abstract를 안붙여도 됨
- 상속을 받았기 때문에 상위 함수와 자신이 정의한 함수 사용가능하며, 추가 및 재정의하여 사용 가능함
public class CalculatorTest {
public static void main(String[] args) {
int num1 = 10;
int num2 = 2;
//상위 인터페이스 형을 받았기 때문에
//인터페이스 형으로 선언이 가능하다.
//하지만, 인터페이스에서 선언된 함수들만 사용가능하다. 하위에서 선언된 showInfo는 사용이 불가능하다.
Calc calc = new CompleteCalc();
System.out.println(calc.add(num1, num2));
System.out.println(calc.substract(num1, num2));
System.out.println(calc.times(num1, num2));
System.out.println(calc.divide(num1, num2));
//인터페이스를 상속받은 클래스의 함수가 호출이 가능하다.
//선언 부는 둘다 사용가능하다.
CompleteCalc calc2 = new CompleteCalc();
calc2.showIfo();
}
}
- 또한 상속받은 클래스 형태를 띄기 때문에 클래스의 모든 기능은 사용이 가능함(ex : 다형성 등)