인터페이스는 어떤 객체에 대한 명제로 이 객체가 어떤 메서드들을 제공하고 어던 역할을 하는지에 대한 일종의 설명서로 대부분 설계단계에서 만들게 됩니다.
인터페이스란 클래스의 일종으로 추상메서드로만 이루어진 클래스로 추상클래스에는 추상메서드와 일반 메서드가 동시에 있을 수 있다는 점에서 다릅니다.
추상메서드의 경우와 같이 구현부가 없는 메서드로만 구성되어 있기에 new 생성자를 사용할수 없고 그로 인해 인터페이스 안에 변수를 선언하더라도 힙메모리 안에 구성이 안되기 때문에 결국 상수로 변환됩니다.
구현 코드가 없는 인터페이스의 상속은 타입 상속이라고 불리기도 합니다.(하위 클래스들의 타입의 역할을 하여 다형성을 구현할 수 있게 해주기 때문에)
인퍼페이스의 요소로 앞에서 언급한 추상 메서드, 상수 외에도 디폴트 메서드, 정적 메서드, private메서드가 나머지는 뒤에서 더 자세히 알아보도록 하겠습니다.
인터페이스를 어떻게 선언하고 구현하는지에 대한 예제를 살펴보겠습니다.
//1번
public interface Calc {
//2번
double PI = 3.14; //나중에 상수가됨
int ERROR = -9999999;
//3번
int add(int num1, int num2);
int substract(int num1, int num2);
int times(int num1, int num2);
int divide(int num1, int num2);
}
1번 : 계산을 기능을 하는 객체에 인터페이스를 작성하기 위해 Calc클래스를 만들고 클래스 선언부(public class Clac)에 class를 지우고 interface를 적으면 인터페이스로 선언됩니다.
또한 클래스를 생성할 때 클래스로 생성하지 않고 바로 인터페이스를 생성하는 방법도 있습니다.
2번 : 변수 PI와 ERROR은 실제 변수가 아닌 상수로 컴파일과정에서 public static final이 다 붙어서 상수화됩니다.
3번 : 계산 기능을 하는 add(), substract(), times(), divde() 메서드를 만듭니다. abstract 키워드가 생략됬지만 이들은 구현부가 없는 추상메서드 입니다. 이 메서드들도 컴파일 과정에서 추상 메서드로 변환됩니다.
메서드를 함수의 이름, 매개변수 반환값을 선언할 수 있다는 것은 결국 이 메서드가 어떤 기능을 대략적으로 보여주는 기능을 합니다. 인터페이스는 이렇게 객체의 기능을 간략하게 설명하는 기능을 하고 하위 클래스에서 어떻게 구현되야 하는지를 안내합니다.
위의 그림같이 추상메서의 경우와 같이 이탤릭체로 표현된 Calc를 구현한 Calculator와의 관계는 점선으로 표현합니다.
인터페이스의 메서드를 일부만 구현한 Calculator는 추상클래스이고 이를 실선으로 상속받은 CompleteCalc클래스에서는 Claculator에서 구현되지 않은 메서드들이 구현될 것입니다.
//1번
public abstract class Calculator implements Calc {
//2번
public int add(int num1, int num2) {
return num1+num2;
}
public int substract(int num1, int num2) {
return num1-num2;
}
}
1번 : Claculator 클래스를 만들고 인터페이스 Calc를 구현한다는 뜻에서 implements를 선언부에 사용합니다. 또한 Calc의 일부 메서드들만 구현할 것이기에 class앞에 abstract을 붙여 추상 클래스라고 선언해 줍니다.
2번 : add(),substarct()클래스를 각각의 기능에 맞게 작성합니다
public class CompleteCalc extends Calculator {
public int times(int num1, int num2) {
return num1 * num2;
}
public int divide(int num1, int num2) {
if(num2 == 0)
return ERROR;
else
return num1/num2;
}
public void showInfo() {
System.out.println("모두 구현하였습니다.");
}
}
클래스 선언부에 extends를 사용하여 상속 받는다는 것을 알리고 아래의 Calculator에서 구현하지 않은 나머지 2개의 메서드를 마저 작성합니다.
showInfo()메서드를 추가해서 작성합니다.
public class CalcTest {
public static void main(String[] args) {
CompleteCalc calc = new CompleteCalc();
int n1 = 10;
int n2 = 2;
System.out.println(calc.add(n1, n2));
System.out.println(calc.substract(n1, n2));
System.out.println(calc.times(n1, n2));
System.out.println(calc.divide(n1, n2));
calc.showInfo();
}
}
CalcTest를 만들고 유일하게 생성할 수 있는 CompleteCalc클래스를 선언합니다
Completecalc는 Calc나 Calculator로도 선언할 수 있지만 업캐스팅(묵시적 형변환) 되기 때문에 인터페이스의 메서드들만 사용할 수 있고 CompleCalc에서 만든 shoInfo();메서드는 사용할 수 없습니다.
n1,n2 변수에 값을 넣어주고 메서드들의 결과값을 출력문을 만들어 출력합니다.
cal.했을 때 뜨는 메서드 항목을 통해 사용자들은 이 개체에서 제공하는 것들이 무엇인지 알 수 있게되는데 그게 인터페이스의 역할중에 하나입니다.