인터페이스란?
다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서
다른 클래스 사이의 중간 매개역할을 해주는 일종의 추상클래스를 의미한다.
인터페이스
- 인터페이스는 추상메소드와 상수로만 이루어져있다.
- 구현된 코드가 없기 때문에 인스턴스를 생성할 수 없다.
인터페이스 만들기
package javastudy;
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 devide(int num1, int num2);
}
인터페이스에서 선언한 메소드는 모두 구현 코드가 없는 추상메소드이다.
public abstract예약어를 명시적으로 쓰지않아도 컴파일 과정에서 자동으로 추상메소드로 변환된다.
인터페이스에서 선언한 변수 또한 컴파일 과정에서 값이 변하지 않는 상수도 자동 변환되기때문에
static final 예약어를 사용하지 않아도 된다.
클래스에서 인터페이스 구현하기
package javastudy;
public abstract 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;
}
}
위에서 선언한 인터페이스를 클래스가 사용하는 것을 '클래스에서 인터페이스를 구현한다(implements)'라고 표현한다.
따라서 인터페이스에서 선언한 기능을 클래스가 구현한다는 의미로 implements 예약어를 사용한다.
Calc 인터페이스에 포함된 추상메소드를 Calculator 클래스에서 구현하여 사용해야한다.
여기에서는 4개의 Calc 메소드중 2개만 구현하여 추상클래스를 만들었다.
계산기 클래스 만들기
package javastudy;
public class CompleteCalc extends Calculator {
@Override
public int times(int num1, int num2) {
return num1 * num2;
}
@Override
public int devide(int num1, int num2) {
if(num2 != 0) {
return num1 / num2 ;
}else {
return Calc.ERROR;
}
}
//CompleteCalc에서 추가로 구현한 메소드
public void showInfo() {
System.out.println("Calc 인터페이스를 구현하였습니다.");
}
}
CompleteCalc클래스에서는 아직 구현되지 않은 나머지 2개의 추상메소드를 구현한다.
CompleteCalc클래스 실행하기
package javastudy;
public class CalculatorTest {
public static void main(String[] args) {
int num1 = 10;
int num2 = 5;
CompleteCalc 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.devide(num1, num2));
calc.showInfo();
}
}
Calculator 클래스는 인터페이스에서 선언한 추상메소드 중 일부만 구현했으므로 추상클래스이다.
그리고 이를 상속받은 CompleteCalc 클래스는 Calclator에서 구현하지 못한 추상메소드를 모두 구현하였다.
인터페이스를 통해 다중상속을 함으로써 클래스와 클래스를 연결할 수 있다.